diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index df93c1ca68..08d0eac7e9 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,13 +1,17 @@ { "name": "commitlint-dev", - "dockerComposeFile": ["../docker-compose.yml"], + "dockerComposeFile": ["../compose.yaml"], "service": "commitlint", "workspaceFolder": "/root/repo", "shutdownAction": "stopCompose", - "extensions": [ - "editorconfig.editorconfig", - "ms-vsliveshare.vsliveshare-pack", - "ms-azuretools.vscode-docker", - "esbenp.prettier-vscode" - ] + "customizations": { + "vscode": { + "extensions": [ + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "ms-azuretools.vscode-docker", + "ms-vsliveshare.vsliveshare-pack" + ] + } + } } diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.yml b/.github/ISSUE_TEMPLATE/BUG_REPORT.yml index 67670dc8fd..7e1df48553 100644 --- a/.github/ISSUE_TEMPLATE/BUG_REPORT.yml +++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.yml @@ -1,7 +1,7 @@ -name: '🐛 Bug Report' +name: "🐛 Bug Report" description: Create a new ticket for a bug. -title: 'fix: ' -labels: ['bug'] +title: "fix: <title>" +labels: ["bug"] body: - type: markdown attributes: @@ -10,7 +10,7 @@ body: - type: textarea id: steps-to-reproduce attributes: - label: 'Steps to Reproduce' + label: "Steps to Reproduce" description: Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include code to reproduce, if relevant value: | 1. First step @@ -21,14 +21,14 @@ body: - type: textarea id: current-behavior attributes: - label: 'Current Behavior' + label: "Current Behavior" description: Tell us what happens instead of the expected behavior validations: required: false - type: textarea id: expected-behavior attributes: - label: 'Expected Behavior' + label: "Expected Behavior" description: Tell us what should happen placeholder: Short and explicit description of your incident... validations: @@ -36,7 +36,7 @@ body: - type: checkboxes id: affected-packages attributes: - label: 'Affected packages' + label: "Affected packages" options: - label: cli - label: core @@ -45,14 +45,14 @@ body: - type: textarea id: possible-solution attributes: - label: 'Possible Solution' + label: "Possible Solution" description: Not obligatory, but suggest a fix/reason for the bug, or ideas how to implement the addition or change validations: required: false - type: textarea id: context attributes: - label: 'Context' + label: "Context" description: | How has this issue affected you? What are you trying to accomplish? Providing context helps us come up with a solution that is most useful in the real world @@ -61,21 +61,21 @@ body: - type: input id: commitlint-version attributes: - label: 'commitlint --version' - placeholder: '@commitlint/cli@x.x.x' + label: "commitlint --version" + placeholder: "@commitlint/cli@x.x.x" validations: required: true - type: input id: git-version attributes: - label: 'git --version' + label: "git --version" placeholder: vx.x.x validations: required: true - type: input id: node-version attributes: - label: 'node --version' + label: "node --version" placeholder: vx.x.x validations: required: true diff --git a/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml index bf4e9609df..063dd15fe4 100644 --- a/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml +++ b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml @@ -1,7 +1,7 @@ -name: '✨ Feature Request' +name: "✨ Feature Request" description: Create a new ticket for a new feature request -title: 'feat: <title>' -labels: ['feature'] +title: "feat: <title>" +labels: ["feature"] body: - type: markdown attributes: @@ -10,7 +10,7 @@ body: - type: textarea id: expected-behavior attributes: - label: 'Expected Behavior' + label: "Expected Behavior" description: Tell us how it should work placeholder: Short and explicit description of your request... validations: @@ -18,14 +18,14 @@ body: - type: textarea id: current-behavior attributes: - label: 'Current Behavior' + label: "Current Behavior" description: Explain the difference from current behavior validations: required: false - type: checkboxes id: affected-packages attributes: - label: 'Affected packages' + label: "Affected packages" options: - label: cli - label: core @@ -34,14 +34,14 @@ body: - type: textarea id: possible-solution attributes: - label: 'Possible Solution' + label: "Possible Solution" description: Ideas how to implement the addition or change validations: required: false - type: textarea id: context attributes: - label: 'Context' + label: "Context" description: | How has this issue affected you? What are you trying to accomplish? Providing context helps us come up with a solution that is most useful in the real world diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 234d2ac6f6..27f3c361cc 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -3,7 +3,7 @@ name: CI on: push: branches: - - '**' + - "**" pull_request: types: [opened, synchronize] @@ -11,13 +11,13 @@ on: # to execute once a day (more info see https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule ) schedule: - - cron: '0 0 * * *' + - cron: "0 0 * * *" jobs: build: strategy: matrix: - os: [ubuntu-22.04, windows-2022] + os: [ubuntu-22.04, ubuntu-24.04, windows-2022, windows-2025] node: [18, 20] runs-on: ${{ matrix.os }} steps: @@ -62,7 +62,7 @@ jobs: name: NodeJS installed from stock Ubuntu-LTS packages (not external sources) runs-on: ubuntu-24.04 container: - image: 'ubuntu:24.04' + image: "ubuntu:24.04" steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml new file mode 100644 index 0000000000..9bcc37d685 --- /dev/null +++ b/.github/workflows/commitlint.yml @@ -0,0 +1,47 @@ +name: Conventional Commitlint + +on: + push: + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + commitlint: + name: Commitlint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: yarn + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build packages + run: yarn build + + - name: Print versions + run: | + git --version + node --version + npm --version + yarn --version + yarn commitlint --version + + - name: Validate current commit (last commit) with commitlint + if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' + run: yarn commitlint --last --verbose + + - name: Validate PR commits with commitlint + if: github.event_name == 'pull_request' + run: yarn commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose diff --git a/.github/workflows/container-build.yml b/.github/workflows/container-build.yml index 4465d2f52a..6bc4cc1816 100644 --- a/.github/workflows/container-build.yml +++ b/.github/workflows/container-build.yml @@ -2,12 +2,12 @@ name: container build on: push: tags: - - '**' + - "**" schedule: - - cron: '0 0 * * *' + - cron: "0 0 * * *" pull_request: paths: - - 'Dockerfile.ci' + - "Dockerfile.ci" jobs: container-build: if: github.repository == 'conventional-changelog/commitlint' @@ -16,17 +16,17 @@ jobs: - name: checkout uses: actions/checkout@v4 - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 - name: Log into registry - uses: docker/login-action@v3 + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Docker meta id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 with: images: commitlint/commitlint tags: | @@ -35,7 +35,7 @@ jobs: type=ref,event=branch type=sha,prefix=,format=short - name: Build and push container image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 with: context: . file: Dockerfile.ci diff --git a/.gitignore b/.gitignore index 3074bd3428..e9a4fbe8ce 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ package.json.lerna_backup /*.iml tsconfig.tsbuildinfo coverage +dist docs/.vitepress/dist docs/.vitepress/cache diff --git a/.nxignore b/.nxignore new file mode 100644 index 0000000000..5758b6a456 --- /dev/null +++ b/.nxignore @@ -0,0 +1,3 @@ +# Having fixtures with a package.json and project.json leads to a duplicate package resolution issue. +# see https://github.com/nrwl/nx/issues/20959 +@commitlint/*/fixtures/** diff --git a/.tool-versions b/.tool-versions index 488a9fee6c..0e9804f101 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -nodejs 18.20.5 +nodejs 18.20.8 diff --git a/@alias/commitlint-config-angular/CHANGELOG.md b/@alias/commitlint-config-angular/CHANGELOG.md index 9f0266fa92..5c8046ab9d 100644 --- a/@alias/commitlint-config-angular/CHANGELOG.md +++ b/@alias/commitlint-config-angular/CHANGELOG.md @@ -3,6 +3,46 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package commitlint-config-angular + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package commitlint-config-angular + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package commitlint-config-angular + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package commitlint-config-angular + + + + + +# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04) + +**Note:** Version bump only for package commitlint-config-angular + + + + + # [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19) **Note:** Version bump only for package commitlint-config-angular diff --git a/@alias/commitlint-config-angular/index.js b/@alias/commitlint-config-angular/index.js index 772977fc4c..0598f27f73 100644 --- a/@alias/commitlint-config-angular/index.js +++ b/@alias/commitlint-config-angular/index.js @@ -1 +1 @@ -export {default} from '@commitlint/config-angular'; +export { default } from "@commitlint/config-angular"; diff --git a/@alias/commitlint-config-angular/package.json b/@alias/commitlint-config-angular/package.json index 1172094b67..6e1b9c8a08 100644 --- a/@alias/commitlint-config-angular/package.json +++ b/@alias/commitlint-config-angular/package.json @@ -1,7 +1,7 @@ { "name": "commitlint-config-angular", "type": "module", - "version": "19.6.0", + "version": "20.0.0", "description": "Shareable commitlint config enforcing the angular commit convention", "files": [ "index.js" @@ -31,10 +31,10 @@ "node": ">=v18" }, "dependencies": { - "@commitlint/config-angular": "^19.6.0" + "@commitlint/config-angular": "^20.0.0" }, "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@alias/commitlint-config-lerna-scopes/CHANGELOG.md b/@alias/commitlint-config-lerna-scopes/CHANGELOG.md index 1e42a14ca1..562ee1191b 100644 --- a/@alias/commitlint-config-lerna-scopes/CHANGELOG.md +++ b/@alias/commitlint-config-lerna-scopes/CHANGELOG.md @@ -3,6 +3,38 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package commitlint-config-lerna-scopes + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package commitlint-config-lerna-scopes + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package commitlint-config-lerna-scopes + + + + + +# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04) + +**Note:** Version bump only for package commitlint-config-lerna-scopes + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package commitlint-config-lerna-scopes diff --git a/@alias/commitlint-config-lerna-scopes/index.js b/@alias/commitlint-config-lerna-scopes/index.js index 0cfd98ac94..000c9673ee 100644 --- a/@alias/commitlint-config-lerna-scopes/index.js +++ b/@alias/commitlint-config-lerna-scopes/index.js @@ -1 +1 @@ -export {default} from '@commitlint/config-lerna-scopes'; +export { default } from "@commitlint/config-lerna-scopes"; diff --git a/@alias/commitlint-config-lerna-scopes/package.json b/@alias/commitlint-config-lerna-scopes/package.json index d5f3e23a27..83306fdafd 100644 --- a/@alias/commitlint-config-lerna-scopes/package.json +++ b/@alias/commitlint-config-lerna-scopes/package.json @@ -1,7 +1,7 @@ { "name": "commitlint-config-lerna-scopes", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Shareable commitlint config enforcing lerna package names as scopes", "files": [ "index.js" @@ -31,10 +31,10 @@ "node": ">=v18" }, "dependencies": { - "@commitlint/config-lerna-scopes": "^19.5.0" + "@commitlint/config-lerna-scopes": "^20.0.0" }, "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@alias/commitlint-config-nx-scopes/CHANGELOG.md b/@alias/commitlint-config-nx-scopes/CHANGELOG.md index 4ef3e3916e..1a536c0de1 100644 --- a/@alias/commitlint-config-nx-scopes/CHANGELOG.md +++ b/@alias/commitlint-config-nx-scopes/CHANGELOG.md @@ -3,6 +3,38 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package commitlint-config-nx-scopes + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package commitlint-config-nx-scopes + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package commitlint-config-nx-scopes + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package commitlint-config-nx-scopes + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package commitlint-config-nx-scopes diff --git a/@alias/commitlint-config-nx-scopes/index.js b/@alias/commitlint-config-nx-scopes/index.js index 3e6a1de683..2ba02e27da 100644 --- a/@alias/commitlint-config-nx-scopes/index.js +++ b/@alias/commitlint-config-nx-scopes/index.js @@ -1 +1 @@ -export {default} from '@commitlint/config-nx-scopes'; +export { default } from "@commitlint/config-nx-scopes"; diff --git a/@alias/commitlint-config-nx-scopes/package.json b/@alias/commitlint-config-nx-scopes/package.json index d8d0bced7c..61281494bd 100644 --- a/@alias/commitlint-config-nx-scopes/package.json +++ b/@alias/commitlint-config-nx-scopes/package.json @@ -1,7 +1,7 @@ { "name": "commitlint-config-nx-scopes", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Shareable commitlint config enforcing nx project names as scopes", "files": [ "index.js" @@ -31,10 +31,10 @@ "node": ">=v18" }, "dependencies": { - "@commitlint/config-nx-scopes": "^19.5.0" + "@commitlint/config-nx-scopes": "^20.0.0" }, "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@alias/commitlint-config-patternplate/CHANGELOG.md b/@alias/commitlint-config-patternplate/CHANGELOG.md index caff9ce6dc..5f53ade561 100644 --- a/@alias/commitlint-config-patternplate/CHANGELOG.md +++ b/@alias/commitlint-config-patternplate/CHANGELOG.md @@ -3,6 +3,46 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package commitlint-config-patternplate + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package commitlint-config-patternplate + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package commitlint-config-patternplate + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package commitlint-config-patternplate + + + + + +# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04) + +**Note:** Version bump only for package commitlint-config-patternplate + + + + + # [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19) **Note:** Version bump only for package commitlint-config-patternplate diff --git a/@alias/commitlint-config-patternplate/index.js b/@alias/commitlint-config-patternplate/index.js index 085cdbe448..d95944f6eb 100644 --- a/@alias/commitlint-config-patternplate/index.js +++ b/@alias/commitlint-config-patternplate/index.js @@ -1 +1 @@ -export {default} from '@commitlint/config-patternplate'; +export { default } from "@commitlint/config-patternplate"; diff --git a/@alias/commitlint-config-patternplate/package.json b/@alias/commitlint-config-patternplate/package.json index d2a3ac86fd..f18b0774de 100644 --- a/@alias/commitlint-config-patternplate/package.json +++ b/@alias/commitlint-config-patternplate/package.json @@ -1,7 +1,7 @@ { "name": "commitlint-config-patternplate", "type": "module", - "version": "19.6.0", + "version": "20.0.0", "description": "Lint your commits, patternplate-style", "files": [ "index.js" @@ -31,10 +31,10 @@ "node": ">=v18" }, "dependencies": { - "@commitlint/config-patternplate": "^19.6.0" + "@commitlint/config-patternplate": "^20.0.0" }, "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@alias/commitlint/CHANGELOG.md b/@alias/commitlint/CHANGELOG.md index cd56c76712..1b3070e71a 100644 --- a/@alias/commitlint/CHANGELOG.md +++ b/@alias/commitlint/CHANGELOG.md @@ -3,6 +3,52 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + +**Note:** Version bump only for package commitlint + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package commitlint + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + + +### Bug Fixes + +* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299)) + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package commitlint + + + + + ## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15) **Note:** Version bump only for package commitlint diff --git a/@alias/commitlint/cli.js b/@alias/commitlint/cli.js index 3a54821b24..4b917c9cf5 100755 --- a/@alias/commitlint/cli.js +++ b/@alias/commitlint/cli.js @@ -1,2 +1,2 @@ #!/usr/bin/env node -import '@commitlint/cli/cli.js'; +import "@commitlint/cli/cli.js"; diff --git a/@alias/commitlint/cli.test.js b/@alias/commitlint/cli.test.js index 8a04c7314b..ff28c511b3 100644 --- a/@alias/commitlint/cli.test.js +++ b/@alias/commitlint/cli.test.js @@ -1,16 +1,16 @@ -import {test, expect} from 'vitest'; -import {createRequire} from 'module'; -import path from 'path'; -import {fileURLToPath} from 'url'; +import { test, expect } from "vitest"; +import { createRequire } from "node:module"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; -import {x} from 'tinyexec'; -import {fix} from '@commitlint/test'; +import { x } from "tinyexec"; +import { fix } from "@commitlint/test"; const require = createRequire(import.meta.url); -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); -const bin = require.resolve('./cli.js'); +const bin = require.resolve("./cli.js"); function cli(args, options, input) { const result = x(bin, args, { @@ -28,15 +28,15 @@ function cli(args, options, input) { const fixBootstrap = (fixture) => fix.bootstrap(fixture, __dirname); -test('should reprint input from stdin', async () => { - const cwd = await fixBootstrap('fixtures/default'); - const actual = await cli([], {cwd}, 'foo: bar'); - expect(actual.stdout).toContain('foo: bar'); +test("should reprint input from stdin", async () => { + const cwd = await fixBootstrap("fixtures/default"); + const actual = await cli([], { cwd }, "foo: bar"); + expect(actual.stdout).toContain("foo: bar"); }); -test('should produce success output with --verbose flag', async () => { - const cwd = await fixBootstrap('fixtures/default'); - const actual = await cli(['--verbose'], {cwd}, 'type: bar'); - expect(actual.stdout).toContain('0 problems, 0 warnings'); - expect(actual.stderr).toEqual(''); +test("should produce success output with --verbose flag", async () => { + const cwd = await fixBootstrap("fixtures/default"); + const actual = await cli(["--verbose"], { cwd }, "type: bar"); + expect(actual.stdout).toContain("0 problems, 0 warnings"); + expect(actual.stderr).toEqual(""); }); diff --git a/@alias/commitlint/package.json b/@alias/commitlint/package.json index 541927d891..d268076b51 100644 --- a/@alias/commitlint/package.json +++ b/@alias/commitlint/package.json @@ -1,7 +1,7 @@ { "name": "commitlint", "type": "module", - "version": "19.6.1", + "version": "20.1.0", "description": "Lint your commit messages", "files": [ "cli.js" @@ -36,13 +36,13 @@ }, "license": "MIT", "dependencies": { - "@commitlint/cli": "^19.6.1", - "@commitlint/types": "^19.5.0" + "@commitlint/cli": "^20.1.0", + "@commitlint/types": "^20.0.0" }, "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0", - "tinyexec": "^0.3.0" + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0", + "tinyexec": "^1.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/cli/CHANGELOG.md b/@commitlint/cli/CHANGELOG.md index 051f8cafb5..7d1038bbea 100644 --- a/@commitlint/cli/CHANGELOG.md +++ b/@commitlint/cli/CHANGELOG.md @@ -3,6 +3,52 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + +**Note:** Version bump only for package @commitlint/cli + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/cli + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + + +### Bug Fixes + +* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299)) + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package @commitlint/cli + + + + + ## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15) **Note:** Version bump only for package @commitlint/cli diff --git a/@commitlint/cli/cli.js b/@commitlint/cli/cli.js index 1bda77159f..940e27804b 100755 --- a/@commitlint/cli/cli.js +++ b/@commitlint/cli/cli.js @@ -1,2 +1,2 @@ #!/usr/bin/env node -import './lib/cli.js'; +import "./lib/cli.js"; diff --git a/@commitlint/cli/index.cjs b/@commitlint/cli/index.cjs index bc56366369..6d5d6c0e62 100644 --- a/@commitlint/cli/index.cjs +++ b/@commitlint/cli/index.cjs @@ -1,3 +1,5 @@ -const path = require('path'); +'use strict'; + +const path = require('node:path'); module.exports = path.join(__dirname, 'cli.js'); diff --git a/@commitlint/cli/package.json b/@commitlint/cli/package.json index 4c9f7ba78d..7a5ccfc778 100644 --- a/@commitlint/cli/package.json +++ b/@commitlint/cli/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/cli", "type": "module", - "version": "19.6.1", + "version": "20.1.0", "description": "Lint your commit messages", "files": [ "index.cjs", @@ -39,8 +39,8 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0", + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0", "@types/lodash.merge": "^4.6.8", "@types/node": "^18.19.17", "@types/yargs": "^17.0.29", @@ -48,13 +48,13 @@ "lodash.merge": "^4.6.2" }, "dependencies": { - "@commitlint/format": "^19.5.0", - "@commitlint/lint": "^19.6.0", - "@commitlint/load": "^19.6.1", - "@commitlint/read": "^19.5.0", - "@commitlint/types": "^19.5.0", - "tinyexec": "^0.3.0", + "@commitlint/format": "^20.0.0", + "@commitlint/lint": "^20.0.0", + "@commitlint/load": "^20.1.0", + "@commitlint/read": "^20.0.0", + "@commitlint/types": "^20.0.0", + "tinyexec": "^1.0.0", "yargs": "^17.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/cli/src/cli-error.ts b/@commitlint/cli/src/cli-error.ts index 69db5917bc..8b21ae31ee 100644 --- a/@commitlint/cli/src/cli-error.ts +++ b/@commitlint/cli/src/cli-error.ts @@ -15,7 +15,7 @@ export class CliError extends Error { constructor( message: string, type: string, - error_code = ExitCode.CommitlintErrorDefault + error_code = ExitCode.CommitlintErrorDefault, ) { super(message); diff --git a/@commitlint/cli/src/cli.test.ts b/@commitlint/cli/src/cli.test.ts index d2f44c50d4..d65a5e57ab 100644 --- a/@commitlint/cli/src/cli.test.ts +++ b/@commitlint/cli/src/cli.test.ts @@ -1,18 +1,18 @@ -import {describe, test, expect} from 'vitest'; -import {createRequire} from 'module'; -import path from 'path'; -import {fileURLToPath} from 'url'; -import {fix, git} from '@commitlint/test'; -import fs from 'fs-extra'; -import merge from 'lodash.merge'; -import {x} from 'tinyexec'; -import {ExitCode} from './cli-error.js'; +import { describe, test, expect } from "vitest"; +import { createRequire } from "node:module"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { fix, git } from "@commitlint/test"; +import fs from "fs-extra"; +import merge from "lodash.merge"; +import { x } from "tinyexec"; +import { ExitCode } from "./cli-error.js"; const require = createRequire(import.meta.url); -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); -const bin = require.resolve('../cli.js'); +const bin = require.resolve("../cli.js"); interface TestOptions { cwd: string; @@ -20,7 +20,7 @@ interface TestOptions { } const cli = (args: string[], options: TestOptions) => { - return (input = '') => { + return (input = "") => { const result = x(bin, args, { nodeOptions: { cwd: options.cwd, @@ -38,542 +38,551 @@ const cli = (args: string[], options: TestOptions) => { const gitBootstrap = (fixture: string) => git.bootstrap(fixture, __dirname); const fixBootstrap = (fixture: string) => fix.bootstrap(fixture, __dirname); -test('should throw when called without [input]', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli([], {cwd})(); +test("should throw when called without [input]", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli([], { cwd })(); await result; expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should reprint input from stdin', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli([], {cwd})('foo: bar'); +test("should reprint input from stdin", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli([], { cwd })("foo: bar"); const output = await result; - expect(output.stdout.trim()).toContain('foo: bar'); + expect(output.stdout.trim()).toContain("foo: bar"); }); -test('should produce success output with --verbose flag', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli(['--verbose'], {cwd})('type: bar'); +test("should produce success output with --verbose flag", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli(["--verbose"], { cwd })("type: bar"); const output = await result; - expect(output.stdout.trim()).toContain('0 problems, 0 warnings'); - expect(output.stderr).toEqual(''); + expect(output.stdout.trim()).toContain("0 problems, 0 warnings"); + expect(output.stderr).toEqual(""); }); -test('should produce last commit and success output with --verbose flag', async () => { - const cwd = await gitBootstrap('fixtures/simple'); - await x('git', ['add', 'commitlint.config.js'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', '"test: this should work"'], { - nodeOptions: {cwd}, +test("should produce last commit and success output with --verbose flag", async () => { + const cwd = await gitBootstrap("fixtures/simple"); + await x("git", ["add", "commitlint.config.js"], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", '"test: this should work"'], { + nodeOptions: { cwd }, }); - const result = cli(['--last', '--verbose'], {cwd})(); + const result = cli(["--last", "--verbose"], { cwd })(); const output = await result; - expect(output.stdout.trim()).toContain('0 problems, 0 warnings'); - expect(output.stdout.trim()).toContain('test: this should work'); - expect(output.stderr).toEqual(''); + expect(output.stdout.trim()).toContain("0 problems, 0 warnings"); + expect(output.stdout.trim()).toContain("test: this should work"); + expect(output.stderr).toEqual(""); }); -test('regression test for running with --last flag', async () => { - const cwd = await gitBootstrap('fixtures/last-flag-regression'); - await x('git', ['add', 'commitlint.config.js'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', '"test: this should work"'], { - nodeOptions: {cwd}, +test("regression test for running with --last flag", async () => { + const cwd = await gitBootstrap("fixtures/last-flag-regression"); + await x("git", ["add", "commitlint.config.js"], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", '"test: this should work"'], { + nodeOptions: { cwd }, }); - const result = cli(['--last', '--verbose'], {cwd})(); + const result = cli(["--last", "--verbose"], { cwd })(); const output = await result; - expect(output.stdout.trim()).toContain('0 problems, 0 warnings'); - expect(output.stdout.trim()).toContain('test: this should work'); - expect(output.stderr).toEqual(''); + expect(output.stdout.trim()).toContain("0 problems, 0 warnings"); + expect(output.stdout.trim()).toContain("test: this should work"); + expect(output.stderr).toEqual(""); }); -test('should produce no output with --quiet flag', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli(['--quiet'], {cwd})('foo: bar'); +test("should produce no output with --quiet flag", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli(["--quiet"], { cwd })("foo: bar"); const output = await result; - expect(output.stdout.trim()).toEqual(''); - expect(output.stderr).toEqual(''); + expect(output.stdout.trim()).toEqual(""); + expect(output.stderr).toEqual(""); }); -test('should produce no output with -q flag', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli(['-q'], {cwd})('foo: bar'); +test("should produce no output with -q flag", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli(["-q"], { cwd })("foo: bar"); const output = await result; - expect(output.stdout.trim()).toEqual(''); - expect(output.stderr).toEqual(''); + expect(output.stdout.trim()).toEqual(""); + expect(output.stderr).toEqual(""); }); -test('should produce help for empty config', async () => { - const cwd = await gitBootstrap('fixtures/empty'); - const result = cli([], {cwd})('foo: bar'); +test("should produce help for empty config", async () => { + const cwd = await gitBootstrap("fixtures/empty"); + const result = cli([], { cwd })("foo: bar"); const output = await result; - expect(output.stdout.trim()).toContain('Please add rules'); + expect(output.stdout.trim()).toContain("Please add rules"); expect(result.exitCode).toBe(ExitCode.CommitlintInvalidArgument); }); -test('should produce help for problems', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli([], {cwd})('foo: bar'); +test("should produce help for problems", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli([], { cwd })("foo: bar"); const output = await result; expect(output.stdout.trim()).toContain( - 'Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint' + "Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint", ); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should produce help for problems with correct helpurl', async () => { - const cwd = await gitBootstrap('fixtures/default'); +test("should produce help for problems with correct helpurl", async () => { + const cwd = await gitBootstrap("fixtures/default"); const result = cli( - ['-H https://github.com/conventional-changelog/commitlint/#testhelpurl'], - {cwd} - )('foo: bar'); + ["-H https://github.com/conventional-changelog/commitlint/#testhelpurl"], + { cwd }, + )("foo: bar"); const output = await result; expect(output.stdout.trim()).toContain( - 'Get help: https://github.com/conventional-changelog/commitlint/#testhelpurl' + "Get help: https://github.com/conventional-changelog/commitlint/#testhelpurl", ); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should fail for input from stdin without rules', async () => { - const cwd = await gitBootstrap('fixtures/empty'); - const result = cli([], {cwd})('foo: bar'); +test("should fail for input from stdin without rules", async () => { + const cwd = await gitBootstrap("fixtures/empty"); + const result = cli([], { cwd })("foo: bar"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintInvalidArgument); }); -test('should succeed for input from stdin with rules', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli([], {cwd})('type: bar'); +test("should succeed for input from stdin with rules", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli([], { cwd })("type: bar"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should fail for input from stdin with rule from rc', async () => { - const cwd = await gitBootstrap('fixtures/simple'); - const result = cli([], {cwd})('foo: bar'); +test("should fail for input from stdin with rule from rc", async () => { + const cwd = await gitBootstrap("fixtures/simple"); + const result = cli([], { cwd })("foo: bar"); const output = await result; - expect(output.stdout.trim()).toContain('type must not be one of [foo]'); + expect(output.stdout.trim()).toContain("type must not be one of [foo]"); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should work with --config option', async () => { - const file = 'config/commitlint.config.js'; - const cwd = await gitBootstrap('fixtures/specify-config-file'); - const result = cli(['--config', file], {cwd})('foo: bar'); +test("should work with --config option", async () => { + const file = "config/commitlint.config.js"; + const cwd = await gitBootstrap("fixtures/specify-config-file"); + const result = cli(["--config", file], { cwd })("foo: bar"); const output = await result; - expect(output.stdout.trim()).toContain('type must not be one of [foo]'); + expect(output.stdout.trim()).toContain("type must not be one of [foo]"); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should fail for input from stdin with rule from js', async () => { - const cwd = await gitBootstrap('fixtures/extends-root'); - const result = cli(['--extends', './extended'], {cwd})('foo: bar'); +test("should fail for input from stdin with rule from js", async () => { + const cwd = await gitBootstrap("fixtures/extends-root"); + const result = cli(["--extends", "./extended"], { cwd })("foo: bar"); const output = await result; - expect(output.stdout.trim()).toContain('type must not be one of [foo]'); + expect(output.stdout.trim()).toContain("type must not be one of [foo]"); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should output help URL defined in config file', async () => { - const cwd = await gitBootstrap('fixtures/help-url'); - const result = cli([], {cwd})('foo: bar'); +test("should output help URL defined in config file", async () => { + const cwd = await gitBootstrap("fixtures/help-url"); + const result = cli([], { cwd })("foo: bar"); const output = await result; expect(output.stdout.trim()).toContain( - 'Get help: https://www.example.com/foo' + "Get help: https://www.example.com/foo", ); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should produce no error output with --quiet flag', async () => { - const cwd = await gitBootstrap('fixtures/simple'); - const result = cli(['--quiet'], {cwd})('foo: bar'); +test("should produce no error output with --quiet flag", async () => { + const cwd = await gitBootstrap("fixtures/simple"); + const result = cli(["--quiet"], { cwd })("foo: bar"); const output = await result; - expect(output.stdout.trim()).toEqual(''); - expect(output.stderr).toEqual(''); + expect(output.stdout.trim()).toEqual(""); + expect(output.stderr).toEqual(""); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should produce no error output with -q flag', async () => { - const cwd = await gitBootstrap('fixtures/simple'); - const result = cli(['-q'], {cwd})('foo: bar'); +test("should produce no error output with -q flag", async () => { + const cwd = await gitBootstrap("fixtures/simple"); + const result = cli(["-q"], { cwd })("foo: bar"); const output = await result; - expect(output.stdout.trim()).toEqual(''); - expect(output.stderr).toEqual(''); + expect(output.stdout.trim()).toEqual(""); + expect(output.stderr).toEqual(""); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should work with husky commitmsg hook and git commit', async () => { - const cwd = await gitBootstrap('fixtures/husky/integration'); - await writePkg({husky: {hooks: {'commit-msg': `'${bin}' -e`}}}, {cwd}); +test("should work with husky commitmsg hook and git commit", async () => { + const cwd = await gitBootstrap("fixtures/husky/integration"); + await writePkg( + { husky: { hooks: { "commit-msg": `'${bin}' -e` } } }, + { cwd }, + ); // await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines - await x('git', ['add', 'package.json'], {nodeOptions: {cwd}}); - const commit = await x('git', ['commit', '-m', '"test: this should work"'], { - nodeOptions: {cwd}, + await x("git", ["add", "package.json"], { nodeOptions: { cwd } }); + const commit = await x("git", ["commit", "-m", '"test: this should work"'], { + nodeOptions: { cwd }, }); expect(commit).toBeTruthy(); }); -test('should work with husky commitmsg hook in sub packages', async () => { - const upper = await gitBootstrap('fixtures/husky'); - const cwd = path.join(upper, 'integration'); - await writePkg({husky: {hooks: {'commit-msg': `'${bin}' -e`}}}, {cwd: upper}); +test("should work with husky commitmsg hook in sub packages", async () => { + const upper = await gitBootstrap("fixtures/husky"); + const cwd = path.join(upper, "integration"); + await writePkg( + { husky: { hooks: { "commit-msg": `'${bin}' -e` } } }, + { cwd: upper }, + ); // await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines - await x('git', ['add', 'package.json'], {nodeOptions: {cwd}}); - const commit = await x('git', ['commit', '-m', '"test: this should work"'], { - nodeOptions: {cwd}, + await x("git", ["add", "package.json"], { nodeOptions: { cwd } }); + const commit = await x("git", ["commit", "-m", '"test: this should work"'], { + nodeOptions: { cwd }, }); expect(commit).toBeTruthy(); }); -test('should work with husky via commitlint -e $GIT_PARAMS', async () => { - const cwd = await gitBootstrap('fixtures/husky/integration'); +test("should work with husky via commitlint -e $GIT_PARAMS", async () => { + const cwd = await gitBootstrap("fixtures/husky/integration"); await writePkg( - {husky: {hooks: {'commit-msg': `'${bin}' -e $GIT_PARAMS`}}}, - {cwd} + { husky: { hooks: { "commit-msg": `'${bin}' -e $GIT_PARAMS` } } }, + { cwd }, ); // await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines - await x('git', ['add', 'package.json'], {nodeOptions: {cwd}}); - const commit = await x('git', ['commit', '-m', '"test: this should work"'], { - nodeOptions: {cwd}, + await x("git", ["add", "package.json"], { nodeOptions: { cwd } }); + const commit = await x("git", ["commit", "-m", '"test: this should work"'], { + nodeOptions: { cwd }, }); expect(commit).toBeTruthy(); }); -test('should work with husky via commitlint -e %GIT_PARAMS%', async () => { - const cwd = await gitBootstrap('fixtures/husky/integration'); +test("should work with husky via commitlint -e %GIT_PARAMS%", async () => { + const cwd = await gitBootstrap("fixtures/husky/integration"); await writePkg( - {husky: {hooks: {'commit-msg': `'${bin}' -e %GIT_PARAMS%`}}}, - {cwd} + { husky: { hooks: { "commit-msg": `'${bin}' -e %GIT_PARAMS%` } } }, + { cwd }, ); // await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines - await x('git', ['add', 'package.json'], {nodeOptions: {cwd}}); - const commit = await x('git', ['commit', '-m', '"test: this should work"'], { - nodeOptions: {cwd}, + await x("git", ["add", "package.json"], { nodeOptions: { cwd } }); + const commit = await x("git", ["commit", "-m", '"test: this should work"'], { + nodeOptions: { cwd }, }); expect(commit).toBeTruthy(); }); -test('should work with husky via commitlint -e $HUSKY_GIT_PARAMS', async () => { - const cwd = await gitBootstrap('fixtures/husky/integration'); +test("should work with husky via commitlint -e $HUSKY_GIT_PARAMS", async () => { + const cwd = await gitBootstrap("fixtures/husky/integration"); await writePkg( - {husky: {hooks: {'commit-msg': `'${bin}' -e $HUSKY_GIT_PARAMS`}}}, - {cwd} + { husky: { hooks: { "commit-msg": `'${bin}' -e $HUSKY_GIT_PARAMS` } } }, + { cwd }, ); // await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines - await x('git', ['add', 'package.json'], {nodeOptions: {cwd}}); - const commit = await x('git', ['commit', '-m', '"test: this should work"'], { - nodeOptions: {cwd}, + await x("git", ["add", "package.json"], { nodeOptions: { cwd } }); + const commit = await x("git", ["commit", "-m", '"test: this should work"'], { + nodeOptions: { cwd }, }); expect(commit).toBeTruthy(); }); -test('should work with husky via commitlint -e %HUSKY_GIT_PARAMS%', async () => { - const cwd = await gitBootstrap('fixtures/husky/integration'); +test("should work with husky via commitlint -e %HUSKY_GIT_PARAMS%", async () => { + const cwd = await gitBootstrap("fixtures/husky/integration"); await writePkg( - {husky: {hooks: {'commit-msg': `'${bin}' -e %HUSKY_GIT_PARAMS%`}}}, - {cwd} + { husky: { hooks: { "commit-msg": `'${bin}' -e %HUSKY_GIT_PARAMS%` } } }, + { cwd }, ); // await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines - await x('git', ['add', 'package.json'], {nodeOptions: {cwd}}); - const commit = await x('git', ['commit', '-m', '"test: this should work"'], { - nodeOptions: {cwd}, + await x("git", ["add", "package.json"], { nodeOptions: { cwd } }); + const commit = await x("git", ["commit", "-m", '"test: this should work"'], { + nodeOptions: { cwd }, }); expect(commit).toBeTruthy(); }); -test('should allow reading of environment variables for edit file, succeeding if valid', async () => { - const cwd = await gitBootstrap('fixtures/simple'); - await fs.writeFile(path.join(cwd, 'commit-msg-file'), 'foo'); - const result = cli(['--env', 'variable'], { +test("should allow reading of environment variables for edit file, succeeding if valid", async () => { + const cwd = await gitBootstrap("fixtures/simple"); + await fs.writeFile(path.join(cwd, "commit-msg-file"), "foo"); + const result = cli(["--env", "variable"], { cwd, - env: {variable: 'commit-msg-file'}, + env: { variable: "commit-msg-file" }, })(); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should allow reading of environment variables for edit file, failing if invalid', async () => { - const cwd = await gitBootstrap('fixtures/simple'); +test("should allow reading of environment variables for edit file, failing if invalid", async () => { + const cwd = await gitBootstrap("fixtures/simple"); await fs.writeFile( - path.join(cwd, 'commit-msg-file'), - 'foo: bar\n\nFoo bar bizz buzz.\n\nCloses #123.' + path.join(cwd, "commit-msg-file"), + "foo: bar\n\nFoo bar bizz buzz.\n\nCloses #123.", ); - const result = cli(['--env', 'variable'], { + const result = cli(["--env", "variable"], { cwd, - env: {variable: 'commit-msg-file'}, + env: { variable: "commit-msg-file" }, })(); await result; expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should pick up parser preset and fail accordingly', async () => { - const cwd = await gitBootstrap('fixtures/parser-preset'); - const result = cli(['--parser-preset', './parser-preset'], {cwd})( - 'type(scope): subject' +test("should pick up parser preset and fail accordingly", async () => { + const cwd = await gitBootstrap("fixtures/parser-preset"); + const result = cli(["--parser-preset", "./parser-preset"], { cwd })( + "type(scope): subject", ); const output = await result; - expect(output.stdout.trim()).toContain('may not be empty'); + expect(output.stdout.trim()).toContain("may not be empty"); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should pick up parser preset and succeed accordingly', async () => { - const cwd = await gitBootstrap('fixtures/parser-preset'); - const result = cli(['--parser-preset', './parser-preset'], {cwd})( - '----type(scope): subject' +test("should pick up parser preset and succeed accordingly", async () => { + const cwd = await gitBootstrap("fixtures/parser-preset"); + const result = cli(["--parser-preset", "./parser-preset"], { cwd })( + "----type(scope): subject", ); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should pick up config from outside git repo and fail accordingly', async () => { - const outer = await fixBootstrap('fixtures/outer-scope'); - const cwd = await git.init(path.join(outer, 'inner-scope')); +test("should pick up config from outside git repo and fail accordingly", async () => { + const outer = await fixBootstrap("fixtures/outer-scope"); + const cwd = await git.init(path.join(outer, "inner-scope")); - const result = cli([], {cwd})('inner: bar'); + const result = cli([], { cwd })("inner: bar"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should pick up config from outside git repo and succeed accordingly', async () => { - const outer = await fixBootstrap('fixtures/outer-scope'); - const cwd = await git.init(path.join(outer, 'inner-scope')); +test("should pick up config from outside git repo and succeed accordingly", async () => { + const outer = await fixBootstrap("fixtures/outer-scope"); + const cwd = await git.init(path.join(outer, "inner-scope")); - const result = cli([], {cwd})('outer: bar'); + const result = cli([], { cwd })("outer: bar"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should pick up config from inside git repo with precedence and succeed accordingly', async () => { - const outer = await fixBootstrap('fixtures/inner-scope'); - const cwd = await git.init(path.join(outer, 'inner-scope')); +test("should pick up config from inside git repo with precedence and succeed accordingly", async () => { + const outer = await fixBootstrap("fixtures/inner-scope"); + const cwd = await git.init(path.join(outer, "inner-scope")); - const result = cli([], {cwd})('inner: bar'); + const result = cli([], { cwd })("inner: bar"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should pick up config from inside git repo with precedence and fail accordingly', async () => { - const outer = await fixBootstrap('fixtures/inner-scope'); - const cwd = await git.init(path.join(outer, 'inner-scope')); +test("should pick up config from inside git repo with precedence and fail accordingly", async () => { + const outer = await fixBootstrap("fixtures/inner-scope"); + const cwd = await git.init(path.join(outer, "inner-scope")); - const result = cli([], {cwd})('outer: bar'); + const result = cli([], { cwd })("outer: bar"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should handle --amend with signoff', async () => { - const cwd = await gitBootstrap('fixtures/signoff'); - await writePkg({husky: {hooks: {'commit-msg': `'${bin}' -e`}}}, {cwd}); +test("should handle --amend with signoff", async () => { + const cwd = await gitBootstrap("fixtures/signoff"); + await writePkg( + { husky: { hooks: { "commit-msg": `'${bin}' -e` } } }, + { cwd }, + ); // await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines - await x('git', ['add', 'package.json'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', '"test: this should work"', '--signoff'], { - nodeOptions: {cwd}, + await x("git", ["add", "package.json"], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", '"test: this should work"', "--signoff"], { + nodeOptions: { cwd }, }); - const commit = await x('git', ['commit', '--amend', '--no-edit'], { - nodeOptions: {cwd}, + const commit = await x("git", ["commit", "--amend", "--no-edit"], { + nodeOptions: { cwd }, }); expect(commit).toBeTruthy(); }, 10000); -test('it uses parserOpts.commentChar when not using edit mode', async () => { - const cwd = await gitBootstrap('fixtures/comment-char'); - const input = 'header: foo\n$body\n'; +test("it uses parserOpts.commentChar when not using edit mode", async () => { + const cwd = await gitBootstrap("fixtures/comment-char"); + const input = "header: foo\n$body\n"; - const result = cli([], {cwd})(input); + const result = cli([], { cwd })(input); const output = await result; - expect(output.stdout.trim()).toContain('[body-empty]'); + expect(output.stdout.trim()).toContain("[body-empty]"); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); test("it doesn't use parserOpts.commentChar when using edit mode", async () => { - const cwd = await gitBootstrap('fixtures/comment-char'); + const cwd = await gitBootstrap("fixtures/comment-char"); await fs.writeFile( - path.join(cwd, '.git', 'COMMIT_EDITMSG'), - 'header: foo\n\n$body\n' + path.join(cwd, ".git", "COMMIT_EDITMSG"), + "header: foo\n\n$body\n", ); - const result = cli(['--edit', '.git/COMMIT_EDITMSG'], {cwd})(); + const result = cli(["--edit", ".git/COMMIT_EDITMSG"], { cwd })(); const output = await result; - expect(output.stdout.trim()).not.toContain('[body-empty]'); + expect(output.stdout.trim()).not.toContain("[body-empty]"); expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('it uses core.commentChar git config when using edit mode', async () => { - const cwd = await gitBootstrap('fixtures/comment-char'); - await x('git', ['config', '--local', 'core.commentChar', '$'], { - nodeOptions: {cwd}, +test("it uses core.commentChar git config when using edit mode", async () => { + const cwd = await gitBootstrap("fixtures/comment-char"); + await x("git", ["config", "--local", "core.commentChar", "$"], { + nodeOptions: { cwd }, }); await fs.writeFile( - path.join(cwd, '.git', 'COMMIT_EDITMSG'), - 'header: foo\n\n$body\n' + path.join(cwd, ".git", "COMMIT_EDITMSG"), + "header: foo\n\n$body\n", ); - const result = cli(['--edit', '.git/COMMIT_EDITMSG'], {cwd})(); + const result = cli(["--edit", ".git/COMMIT_EDITMSG"], { cwd })(); const output = await result; - expect(output.stdout.trim()).toContain('[body-empty]'); + expect(output.stdout.trim()).toContain("[body-empty]"); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('it falls back to # for core.commentChar when using edit mode', async () => { - const cwd = await gitBootstrap('fixtures/comment-char'); +test("it falls back to # for core.commentChar when using edit mode", async () => { + const cwd = await gitBootstrap("fixtures/comment-char"); await fs.writeFile( - path.join(cwd, '.git', 'COMMIT_EDITMSG'), - 'header: foo\n\n#body\n' + path.join(cwd, ".git", "COMMIT_EDITMSG"), + "header: foo\n\n#body\n", ); - const result = cli(['--edit', '.git/COMMIT_EDITMSG'], {cwd})(); + const result = cli(["--edit", ".git/COMMIT_EDITMSG"], { cwd })(); const output = await result; - expect(output.stdout.trim()).toContain('[body-empty]'); - expect(output.stderr).toEqual(''); + expect(output.stdout.trim()).toContain("[body-empty]"); + expect(output.stderr).toEqual(""); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should handle linting with issue prefixes', async () => { - const cwd = await gitBootstrap('fixtures/issue-prefixes'); - const result = cli([], {cwd})('foobar REF-1'); +test("should handle linting with issue prefixes", async () => { + const cwd = await gitBootstrap("fixtures/issue-prefixes"); + const result = cli([], { cwd })("foobar REF-1"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }, 10000); -test('should print full commit message when input from stdin fails', async () => { - const cwd = await gitBootstrap('fixtures/simple'); - const input = 'foo: bar\n\nFoo bar bizz buzz.\n\nCloses #123.'; +test("should print full commit message when input from stdin fails", async () => { + const cwd = await gitBootstrap("fixtures/simple"); + const input = "foo: bar\n\nFoo bar bizz buzz.\n\nCloses #123."; // output text in plain text so we can compare it - const result = cli(['--color=false'], {cwd})(input); + const result = cli(["--color=false"], { cwd })(input); const output = await result; expect(output.stdout.trim()).toContain(input); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should not print commit message fully or partially when input succeeds', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const message = 'type: bar\n\nFoo bar bizz buzz.\n\nCloses #123.'; +test("should not print commit message fully or partially when input succeeds", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const message = "type: bar\n\nFoo bar bizz buzz.\n\nCloses #123."; // output text in plain text so we can compare it - const result = cli(['--color=false'], {cwd})(message); + const result = cli(["--color=false"], { cwd })(message); const output = await result; expect(output.stdout.trim()).not.toContain(message); - expect(output.stdout.trim()).not.toContain(message.split('\n')[0]); + expect(output.stdout.trim()).not.toContain(message.split("\n")[0]); expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should fail for invalid formatters from configuration', async () => { - const cwd = await gitBootstrap('fixtures/custom-formatter'); - const result = cli([], {cwd})('foo: bar'); +test("should fail for invalid formatters from configuration", async () => { + const cwd = await gitBootstrap("fixtures/custom-formatter"); + const result = cli([], { cwd })("foo: bar"); const output = await result; expect(output.stderr).toContain( - 'Using format custom-formatter, but cannot find the module' + "Using format custom-formatter, but cannot find the module", ); - expect(output.stdout.trim()).toEqual(''); + expect(output.stdout.trim()).toEqual(""); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should skip linting if message matches ignores config', async () => { - const cwd = await gitBootstrap('fixtures/ignores'); - const result = cli([], {cwd})('WIP'); +test("should skip linting if message matches ignores config", async () => { + const cwd = await gitBootstrap("fixtures/ignores"); + const result = cli([], { cwd })("WIP"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should not skip linting if message does not match ignores config', async () => { - const cwd = await gitBootstrap('fixtures/ignores'); - const result = cli([], {cwd})('foo'); +test("should not skip linting if message does not match ignores config", async () => { + const cwd = await gitBootstrap("fixtures/ignores"); + const result = cli([], { cwd })("foo"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should not skip linting if defaultIgnores is false', async () => { - const cwd = await gitBootstrap('fixtures/default-ignores-false'); - const result = cli([], {cwd})('fixup! foo: bar'); +test("should not skip linting if defaultIgnores is false", async () => { + const cwd = await gitBootstrap("fixtures/default-ignores-false"); + const result = cli([], { cwd })("fixup! foo: bar"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should skip linting if defaultIgnores is true', async () => { - const cwd = await gitBootstrap('fixtures/default-ignores-true'); - const result = cli([], {cwd})('fixup! foo: bar'); +test("should skip linting if defaultIgnores is true", async () => { + const cwd = await gitBootstrap("fixtures/default-ignores-true"); + const result = cli([], { cwd })("fixup! foo: bar"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should skip linting if defaultIgnores is unset', async () => { - const cwd = await gitBootstrap('fixtures/default-ignores-unset'); - const result = cli([], {cwd})('fixup! foo: bar'); +test("should skip linting if defaultIgnores is unset", async () => { + const cwd = await gitBootstrap("fixtures/default-ignores-unset"); + const result = cli([], { cwd })("fixup! foo: bar"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should fail for invalid formatters from flags', async () => { - const cwd = await gitBootstrap('fixtures/custom-formatter'); - const result = cli(['--format', 'through-flag'], {cwd})('foo: bar'); +test("should fail for invalid formatters from flags", async () => { + const cwd = await gitBootstrap("fixtures/custom-formatter"); + const result = cli(["--format", "through-flag"], { cwd })("foo: bar"); const output = await result; expect(output.stderr).toContain( - 'Using format through-flag, but cannot find the module' + "Using format through-flag, but cannot find the module", ); - expect(output.stdout.trim()).toEqual(''); + expect(output.stdout.trim()).toEqual(""); expect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault); }); -test('should work with absolute formatter path', async () => { +test("should work with absolute formatter path", async () => { const formatterPath = path.resolve( __dirname, - '../fixtures/custom-formatter/formatters/custom.js' + "../fixtures/custom-formatter/formatters/custom.js", ); - const cwd = await gitBootstrap('fixtures/custom-formatter'); - const result = cli(['--format', formatterPath], {cwd})( - 'test: this should work' + const cwd = await gitBootstrap("fixtures/custom-formatter"); + const result = cli(["--format", formatterPath], { cwd })( + "test: this should work", ); const output = await result; - expect(output.stdout.trim()).toContain('custom-formatter-ok'); + expect(output.stdout.trim()).toContain("custom-formatter-ok"); expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should work with relative formatter path', async () => { +test("should work with relative formatter path", async () => { const cwd = path.resolve( - await gitBootstrap('fixtures/custom-formatter'), - './formatters' + await gitBootstrap("fixtures/custom-formatter"), + "./formatters", ); - const result = cli(['--format', './custom.js'], {cwd})( - 'test: this should work' + const result = cli(["--format", "./custom.js"], { cwd })( + "test: this should work", ); const output = await result; - expect(output.stdout.trim()).toContain('custom-formatter-ok'); + expect(output.stdout.trim()).toContain("custom-formatter-ok"); expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('strict: should exit with 3 on error', async () => { - const cwd = await gitBootstrap('fixtures/warning'); - const result = cli(['--strict'], {cwd})('foo: abcdef'); +test("strict: should exit with 3 on error", async () => { + const cwd = await gitBootstrap("fixtures/warning"); + const result = cli(["--strict"], { cwd })("foo: abcdef"); await result; expect(result.exitCode).toBe(ExitCode.CommitLintError); }); -test('strict: should exit with 2 on warning', async () => { - const cwd = await gitBootstrap('fixtures/warning'); - const result = cli(['--strict'], {cwd})('feat: abcdef'); +test("strict: should exit with 2 on warning", async () => { + const cwd = await gitBootstrap("fixtures/warning"); + const result = cli(["--strict"], { cwd })("feat: abcdef"); await result; expect(result.exitCode).toBe(ExitCode.CommitLintWarning); }); -test('strict: should exit with 0 on success', async () => { - const cwd = await gitBootstrap('fixtures/warning'); - const result = cli(['--strict'], {cwd})('feat: abc'); +test("strict: should exit with 0 on success", async () => { + const cwd = await gitBootstrap("fixtures/warning"); + const result = cli(["--strict"], { cwd })("feat: abc"); await result; expect(result.exitCode).toBe(ExitCode.CommitlintDefault); }); -test('should print help', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli(['--help'], {cwd})(); +test("should print help", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli(["--help"], { cwd })(); const output = await result; - const version = require('../package.json').version; - const stdout = output.stdout.trim().replace(`@${version}`, '@dev'); + const version = require("../package.json").version; + const stdout = output.stdout.trim().replace(`@${version}`, "@dev"); expect(stdout).toMatchInlineSnapshot(` "@commitlint/cli@dev - Lint your commit messages @@ -604,23 +613,23 @@ test('should print help', async () => { `); }); -test('should print version', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli(['--version'], {cwd})(); +test("should print version", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli(["--version"], { cwd })(); const output = await result; - expect(output.stdout.trim()).toMatch('@commitlint/cli@'); + expect(output.stdout.trim()).toMatch("@commitlint/cli@"); }); -describe('should print config', () => { - test('should print config when flag is present but without value', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli(['--print-config', 'text', '--no-color'], {cwd})(); +describe("should print config", () => { + test("should print config when flag is present but without value", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli(["--print-config", "text", "--no-color"], { cwd })(); const output = await result; const stdout = output.stdout .trim() - .replace(/^{[^\n]/g, '{\n ') - .replace(/[^\n]}$/g, '\n}') - .replace(/(helpUrl:)\n[ ]+/, '$1 '); + .replace(/^{[^\n]/g, "{\n ") + .replace(/[^\n]}$/g, "\n}") + .replace(/(helpUrl:)\n[ ]+/, "$1 "); expect(stdout).toMatchInlineSnapshot(` "{ extends: [], @@ -636,15 +645,15 @@ describe('should print config', () => { `); }); - test('should print config when flag has `text` value', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli(['--print-config=text', '--no-color'], {cwd})(); + test("should print config when flag has `text` value", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli(["--print-config=text", "--no-color"], { cwd })(); const output = await result; const stdout = output.stdout .trim() - .replace(/^{[^\n]/g, '{\n ') - .replace(/[^\n]}$/g, '\n}') - .replace(/(helpUrl:)\n[ ]+/, '$1 '); + .replace(/^{[^\n]/g, "{\n ") + .replace(/[^\n]}$/g, "\n}") + .replace(/(helpUrl:)\n[ ]+/, "$1 "); expect(stdout).toMatchInlineSnapshot(` "{ extends: [], @@ -660,19 +669,19 @@ describe('should print config', () => { `); }); - test('should print config when flag has `json` value', async () => { - const cwd = await gitBootstrap('fixtures/default'); - const result = cli(['--print-config=json', '--no-color'], {cwd})(); + test("should print config when flag has `json` value", async () => { + const cwd = await gitBootstrap("fixtures/default"); + const result = cli(["--print-config=json", "--no-color"], { cwd })(); const output = await result; expect(output.stdout.trim()).toMatchInlineSnapshot( - `"{"extends":[],"formatter":"@commitlint/format","plugins":{},"rules":{"type-enum":[2,"never",["foo"]]},"helpUrl":"https://github.com/conventional-changelog/commitlint/#what-is-commitlint","prompt":{}}"` + `"{"extends":[],"formatter":"@commitlint/format","plugins":{},"rules":{"type-enum":[2,"never",["foo"]]},"helpUrl":"https://github.com/conventional-changelog/commitlint/#what-is-commitlint","prompt":{}}"`, ); }); }); async function writePkg(payload: unknown, options: TestOptions) { - const pkgPath = path.join(options.cwd, 'package.json'); - const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8')); + const pkgPath = path.join(options.cwd, "package.json"); + const pkg = JSON.parse(await fs.readFile(pkgPath, "utf-8")); const result = merge(pkg, payload); - await fs.writeFile(pkgPath, JSON.stringify(result, null, ' ')); + await fs.writeFile(pkgPath, JSON.stringify(result, null, " ")); } diff --git a/@commitlint/cli/src/cli.ts b/@commitlint/cli/src/cli.ts index 93ce1cab36..50cfed53f9 100644 --- a/@commitlint/cli/src/cli.ts +++ b/@commitlint/cli/src/cli.ts @@ -1,11 +1,11 @@ -import {createRequire} from 'module'; -import path from 'path'; -import {fileURLToPath, pathToFileURL} from 'url'; -import util from 'util'; - -import lint from '@commitlint/lint'; -import load, {resolveFromSilent, resolveGlobalSilent} from '@commitlint/load'; -import read from '@commitlint/read'; +import { createRequire } from "node:module"; +import path from "node:path"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import util from "node:util"; + +import lint from "@commitlint/lint"; +import load, { resolveFromSilent, resolveGlobalSilent } from "@commitlint/load"; +import read from "@commitlint/read"; import type { Formatter, LintOptions, @@ -13,150 +13,150 @@ import type { ParserPreset, QualifiedConfig, UserConfig, -} from '@commitlint/types'; -import type {Options} from 'conventional-commits-parser'; -import {x} from 'tinyexec'; -import yargs, {type Arguments} from 'yargs'; +} from "@commitlint/types"; +import type { Options } from "conventional-commits-parser"; +import { x } from "tinyexec"; +import yargs, { type Arguments } from "yargs"; -import {CliFlags} from './types.js'; +import { CliFlags } from "./types.js"; -import {CliError, ExitCode} from './cli-error.js'; +import { CliError, ExitCode } from "./cli-error.js"; const require = createRequire(import.meta.url); -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); const dynamicImport = async <T>(id: string): Promise<T> => { const imported = await import( path.isAbsolute(id) ? pathToFileURL(id).toString() : id ); - return ('default' in imported && imported.default) || imported; + return ("default" in imported && imported.default) || imported; }; -const pkg: typeof import('../package.json') = require('../package.json'); +const pkg: typeof import("../package.json") = require("../package.json"); -const gitDefaultCommentChar = '#'; +const gitDefaultCommentChar = "#"; const cli = yargs(process.argv.slice(2)) .options({ color: { - alias: 'c', + alias: "c", default: true, - description: 'toggle colored output', - type: 'boolean', + description: "toggle colored output", + type: "boolean", }, config: { - alias: 'g', + alias: "g", description: - 'path to the config file; result code 9 if config is missing', - type: 'string', + "path to the config file; result code 9 if config is missing", + type: "string", }, - 'print-config': { - choices: ['', 'text', 'json'], - description: 'print resolved config', - type: 'string', + "print-config": { + choices: ["", "text", "json"], + description: "print resolved config", + type: "string", }, cwd: { - alias: 'd', + alias: "d", default: process.cwd(), - defaultDescription: '(Working Directory)', - description: 'directory to execute in', - type: 'string', + defaultDescription: "(Working Directory)", + description: "directory to execute in", + type: "string", }, edit: { - alias: 'e', + alias: "e", description: - 'read last commit message from the specified file or fallbacks to ./.git/COMMIT_EDITMSG', - type: 'string', + "read last commit message from the specified file or fallbacks to ./.git/COMMIT_EDITMSG", + type: "string", }, env: { - alias: 'E', + alias: "E", description: - 'check message in the file at path given by environment variable value', - type: 'string', + "check message in the file at path given by environment variable value", + type: "string", }, extends: { - alias: 'x', - description: 'array of shareable configurations to extend', - type: 'array', + alias: "x", + description: "array of shareable configurations to extend", + type: "array", }, - 'help-url': { - alias: 'H', - type: 'string', - description: 'help url in error message', + "help-url": { + alias: "H", + type: "string", + description: "help url in error message", }, from: { - alias: 'f', + alias: "f", description: - 'lower end of the commit range to lint; applies if edit=false', - type: 'string', + "lower end of the commit range to lint; applies if edit=false", + type: "string", }, - 'from-last-tag': { + "from-last-tag": { description: - 'uses the last tag as the lower end of the commit range to lint; applies if edit=false and from is not set', - type: 'boolean', + "uses the last tag as the lower end of the commit range to lint; applies if edit=false and from is not set", + type: "boolean", }, - 'git-log-args': { + "git-log-args": { description: "additional git log arguments as space separated string, example '--first-parent --cherry-pick'", - type: 'string', + type: "string", }, last: { - alias: 'l', - description: 'just analyze the last commit; applies if edit=false', - type: 'boolean', + alias: "l", + description: "just analyze the last commit; applies if edit=false", + type: "boolean", }, format: { - alias: 'o', - description: 'output format of the results', - type: 'string', + alias: "o", + description: "output format of the results", + type: "string", }, - 'parser-preset': { - alias: 'p', + "parser-preset": { + alias: "p", description: - 'configuration preset to use for conventional-commits-parser', - type: 'string', + "configuration preset to use for conventional-commits-parser", + type: "string", }, quiet: { - alias: 'q', + alias: "q", default: false, - description: 'toggle console output', - type: 'boolean', + description: "toggle console output", + type: "boolean", }, to: { - alias: 't', + alias: "t", description: - 'upper end of the commit range to lint; applies if edit=false', - type: 'string', + "upper end of the commit range to lint; applies if edit=false", + type: "string", }, verbose: { - alias: 'V', - type: 'boolean', - description: 'enable verbose output for reports without problems', + alias: "V", + type: "boolean", + description: "enable verbose output for reports without problems", }, strict: { - alias: 's', - type: 'boolean', + alias: "s", + type: "boolean", description: - 'enable strict mode; result code 2 for warnings, 3 for errors', + "enable strict mode; result code 2 for warnings, 3 for errors", }, }) .version( - 'version', - 'display version information', - `${pkg.name}@${pkg.version}` + "version", + "display version information", + `${pkg.name}@${pkg.version}`, ) - .alias('v', 'version') - .help('help') - .alias('h', 'help') + .alias("v", "version") + .help("help") + .alias("h", "help") .config( - 'options', - 'path to a JSON file or Common.js module containing CLI options', - require + "options", + "path to a JSON file or Common.js module containing CLI options", + require, ) .usage(`${pkg.name}@${pkg.version} - ${pkg.description}\n`) .usage( - `[input] reads from stdin if --edit, --env, --from and --to are omitted` + `[input] reads from stdin if --edit, --env, --from and --to are omitted`, ) .strict(); @@ -176,13 +176,13 @@ main(cli.argv).catch((err) => { }); async function stdin() { - let result = ''; + let result = ""; if (process.stdin.isTTY) { return result; } - process.stdin.setEncoding('utf8'); + process.stdin.setEncoding("utf8"); for await (const chunk of process.stdin) { result += chunk; @@ -198,30 +198,30 @@ type MainArgsPromise = Promise<MainArgsObject>; type MainArgs = MainArgsObject | MainArgsPromise; async function resolveArgs(args: MainArgs): Promise<MainArgsObject> { - return typeof args.then === 'function' ? await args : args; + return typeof args.then === "function" ? await args : args; } async function main(args: MainArgs): Promise<void> { const options = await resolveArgs(args); - if (typeof options.edit === 'undefined') { + if (typeof options.edit === "undefined") { options.edit = false; } const raw = options._; const flags = normalizeFlags(options); - if (typeof options['print-config'] === 'string') { + if (typeof options["print-config"] === "string") { const loaded = await load(getSeed(flags), { cwd: flags.cwd, file: flags.config, }); - switch (options['print-config']) { - case 'json': + switch (options["print-config"]) { + case "json": console.log(JSON.stringify(loaded)); return; - case 'text': + case "text": default: console.log(util.inspect(loaded, false, null, options.color)); return; @@ -231,14 +231,14 @@ async function main(args: MainArgs): Promise<void> { const fromStdin = checkFromStdin(raw, flags); if ( - Object.hasOwn(flags, 'last') && - (Object.hasOwn(flags, 'from') || Object.hasOwn(flags, 'to') || flags.edit) + Object.hasOwn(flags, "last") && + (Object.hasOwn(flags, "from") || Object.hasOwn(flags, "to") || flags.edit) ) { const err = new CliError( - 'Please use the --last flag alone. The --last flag should not be used with --to or --from or --edit.', - pkg.name + "Please use the --last flag alone. The --last flag should not be used with --to or --from or --edit.", + pkg.name, ); - cli.showHelp('log'); + cli.showHelp("log"); console.log(err.message); throw err; } @@ -248,24 +248,24 @@ async function main(args: MainArgs): Promise<void> { : read({ to: flags.to, from: flags.from, - fromLastTag: flags['from-last-tag'], + fromLastTag: flags["from-last-tag"], last: flags.last, edit: flags.edit, cwd: flags.cwd, - gitLogArgs: flags['git-log-args'], - })); + gitLogArgs: flags["git-log-args"], + })); const messages = (Array.isArray(input) ? input : [input]) - .filter((message) => typeof message === 'string') - .filter((message) => message.trim() !== '') + .filter((message) => typeof message === "string") + .filter((message) => message.trim() !== "") .filter(Boolean); if (messages.length === 0 && !checkFromRepository(flags)) { const err = new CliError( - '[input] is required: supply via stdin, or --env or --edit or --last or --from and --to', - pkg.name + "[input] is required: supply via stdin, or --env or --edit or --last or --from and --to", + pkg.name, ); - cli.showHelp('log'); + cli.showHelp("log"); console.log(err.message); throw err; } @@ -275,7 +275,7 @@ async function main(args: MainArgs): Promise<void> { file: flags.config, }); const parserOpts = selectParserOpts(loaded.parserPreset); - const opts: LintOptions & {parserOpts: Options} = { + const opts: LintOptions & { parserOpts: Options } = { parserOpts: {}, plugins: {}, ignores: [], @@ -298,13 +298,13 @@ async function main(args: MainArgs): Promise<void> { // If reading from `.git/COMMIT_EDIT_MSG`, strip comments using // core.commentChar from git configuration, falling back to '#'. if (flags.edit) { - const result = x('git', ['config', 'core.commentChar']); + const result = x("git", ["config", "core.commentChar"]); const output = await result; if (result.exitCode && result.exitCode > 1) { console.warn( - 'Could not determine core.commentChar git configuration', - output.stderr + "Could not determine core.commentChar git configuration", + output.stderr, ); opts.parserOpts.commentChar = gitDefaultCommentChar; } else { @@ -314,12 +314,12 @@ async function main(args: MainArgs): Promise<void> { } const results = await Promise.all( - messages.map((message) => lint(message, loaded.rules, opts)) + messages.map((message) => lint(message, loaded.rules, opts)), ); let isRulesEmpty = false; if (Object.keys(loaded.rules).length === 0) { - let input = ''; + let input = ""; if (results.length !== 0) { input = results[0].input; @@ -331,12 +331,12 @@ async function main(args: MainArgs): Promise<void> { { level: 2, valid: false, - name: 'empty-rules', + name: "empty-rules", message: [ - 'Please add rules to your `commitlint.config.js`', - ' - Getting started guide: https://commitlint.js.org/guides/getting-started', - ' - Example config: https://github.com/conventional-changelog/commitlint/blob/master/%40commitlint/config-conventional/src/index.ts', - ].join('\n'), + "Please add rules to your `commitlint.config.js`", + " - Getting started guide: https://commitlint.js.org/guides/getting-started", + " - Example config: https://github.com/conventional-changelog/commitlint/blob/master/%40commitlint/config-conventional/src/index.ts", + ].join("\n"), }, ], warnings: [], @@ -365,10 +365,10 @@ async function main(args: MainArgs): Promise<void> { errorCount: 0, warningCount: 0, results: [], - } + }, ); - const helpUrl = flags['help-url']?.trim() || loaded.helpUrl; + const helpUrl = flags["help-url"]?.trim() || loaded.helpUrl; const output = format(report, { color: flags.color, @@ -376,7 +376,7 @@ async function main(args: MainArgs): Promise<void> { helpUrl, }); - if (!flags.quiet && output !== '') { + if (!flags.quiet && output !== "") { console.log(output); } @@ -410,10 +410,10 @@ function checkFromEdit(flags: CliFlags): boolean { function checkFromHistory(flags: CliFlags): boolean { return ( - typeof flags.from === 'string' || - typeof flags['from-last-tag'] === 'boolean' || - typeof flags.to === 'string' || - typeof flags.last === 'boolean' + typeof flags.from === "string" || + typeof flags["from-last-tag"] === "boolean" || + typeof flags.to === "string" || + typeof flags.last === "boolean" ); } @@ -429,18 +429,18 @@ function getEditValue(flags: CliFlags) { if (flags.env) { if (!(flags.env in process.env)) { throw new Error( - `Received '${flags.env}' as value for -E | --env, but environment variable '${flags.env}' is not available globally` + `Received '${flags.env}' as value for -E | --env, but environment variable '${flags.env}' is not available globally`, ); } return process.env[flags.env]; } - const {edit} = flags; + const { edit } = flags; // If the edit flag is set but empty (i.e '-e') we default // to .git/COMMIT_EDITMSG - if (edit === '') { + if (edit === "") { return true; } - if (typeof edit === 'boolean') { + if (typeof edit === "boolean") { return edit; } // The recommended method to specify -e with husky was `commitlint -e $HUSKY_GIT_PARAMS` @@ -448,22 +448,22 @@ function getEditValue(flags: CliFlags) { // use a different syntax // See https://github.com/conventional-changelog/commitlint/issues/103 for details // This has been superceded by the `-E GIT_PARAMS` / `-E HUSKY_GIT_PARAMS` - const isGitParams = edit === '$GIT_PARAMS' || edit === '%GIT_PARAMS%'; + const isGitParams = edit === "$GIT_PARAMS" || edit === "%GIT_PARAMS%"; const isHuskyParams = - edit === '$HUSKY_GIT_PARAMS' || edit === '%HUSKY_GIT_PARAMS%'; + edit === "$HUSKY_GIT_PARAMS" || edit === "%HUSKY_GIT_PARAMS%"; if (isGitParams || isHuskyParams) { console.warn(`Using environment variable syntax (${edit}) in -e |\ --edit is deprecated. Use '{-E|--env} HUSKY_GIT_PARAMS instead'`); - if (isGitParams && 'GIT_PARAMS' in process.env) { + if (isGitParams && "GIT_PARAMS" in process.env) { return process.env.GIT_PARAMS; } - if ('HUSKY_GIT_PARAMS' in process.env) { + if ("HUSKY_GIT_PARAMS" in process.env) { return process.env.HUSKY_GIT_PARAMS; } throw new Error( - `Received ${edit} as value for -e | --edit, but GIT_PARAMS or HUSKY_GIT_PARAMS are not available globally.` + `Received ${edit} as value for -e | --edit, but GIT_PARAMS or HUSKY_GIT_PARAMS are not available globally.`, ); } return edit; @@ -471,19 +471,19 @@ function getEditValue(flags: CliFlags) { function getSeed(flags: CliFlags): UserConfig { const n = (flags.extends || []).filter( - (i): i is string => typeof i === 'string' + (i): i is string => typeof i === "string", ); return n.length > 0 - ? {extends: n, parserPreset: flags['parser-preset']} - : {parserPreset: flags['parser-preset']}; + ? { extends: n, parserPreset: flags["parser-preset"] } + : { parserPreset: flags["parser-preset"] }; } function selectParserOpts(parserPreset: ParserPreset | undefined) { - if (typeof parserPreset !== 'object') { + if (typeof parserPreset !== "object") { return undefined; } - if (typeof parserPreset.parserOpts !== 'object') { + if (typeof parserPreset.parserOpts !== "object") { return undefined; } @@ -492,9 +492,9 @@ function selectParserOpts(parserPreset: ParserPreset | undefined) { function loadFormatter( config: QualifiedConfig, - flags: CliFlags + flags: CliFlags, ): Promise<Formatter> { - const moduleName = flags.format || config.formatter || '@commitlint/format'; + const moduleName = flags.format || config.formatter || "@commitlint/format"; const modulePath = resolveFromSilent(moduleName, __dirname) || resolveFromSilent(moduleName, flags.cwd) || @@ -508,7 +508,7 @@ function loadFormatter( } // Catch unhandled rejections globally -process.on('unhandledRejection', (reason, promise) => { - console.log('Unhandled Rejection at: Promise ', promise, ' reason: ', reason); +process.on("unhandledRejection", (reason, promise) => { + console.log("Unhandled Rejection at: Promise ", promise, " reason: ", reason); throw reason; }); diff --git a/@commitlint/cli/src/types.ts b/@commitlint/cli/src/types.ts index c9b3a1b8ef..cbc9a8956a 100644 --- a/@commitlint/cli/src/types.ts +++ b/@commitlint/cli/src/types.ts @@ -6,19 +6,19 @@ export interface CliFlags { env?: string; extends?: (string | number)[]; help?: boolean; - 'help-url'?: string; + "help-url"?: string; from?: string; - 'from-last-tag'?: boolean; - 'git-log-args'?: string; + "from-last-tag"?: boolean; + "git-log-args"?: string; last?: boolean; format?: string; - 'parser-preset'?: string; + "parser-preset"?: string; quiet: boolean; to?: string; version?: boolean; verbose?: boolean; /** @type {'' | 'text' | 'json'} */ - 'print-config'?: string; + "print-config"?: string; strict?: boolean; _: (string | number)[]; $0: string; diff --git a/@commitlint/config-angular-type-enum/CHANGELOG.md b/@commitlint/config-angular-type-enum/CHANGELOG.md index d4afe2cdd5..51e6839438 100644 --- a/@commitlint/config-angular-type-enum/CHANGELOG.md +++ b/@commitlint/config-angular-type-enum/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-angular-type-enum + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-angular-type-enum + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/config-angular-type-enum + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/config-angular-type-enum diff --git a/@commitlint/config-angular-type-enum/README.md b/@commitlint/config-angular-type-enum/README.md index 6ffd9dd17e..09df8aa8de 100644 --- a/@commitlint/config-angular-type-enum/README.md +++ b/@commitlint/config-angular-type-enum/README.md @@ -23,7 +23,7 @@ echo "build: bar" | commitlint # passes ```js // commitlint.config.js -const types = require('@commitlint/config-angular-type-enum'); +const types = require("@commitlint/config-angular-type-enum"); // Use as rule creating errors for non-allowed types module.exports = { @@ -35,7 +35,7 @@ module.exports = { // Warn for non-allowed types module.exports = { rules: { - 'type-enum': [1, 'always', types.values()], + "type-enum": [1, "always", types.values()], }, }; ``` diff --git a/@commitlint/config-angular-type-enum/index.js b/@commitlint/config-angular-type-enum/index.js index 485701638c..658d6259d2 100644 --- a/@commitlint/config-angular-type-enum/index.js +++ b/@commitlint/config-angular-type-enum/index.js @@ -1,19 +1,19 @@ const types = [ - 'build', - 'ci', - 'docs', - 'feat', - 'fix', - 'perf', - 'refactor', - 'revert', - 'style', - 'test', + "build", + "ci", + "docs", + "feat", + "fix", + "perf", + "refactor", + "revert", + "style", + "test", ]; export default { rules: { - 'type-enum': [2, 'always', types], + "type-enum": [2, "always", types], }, value: () => types, }; diff --git a/@commitlint/config-angular-type-enum/package.json b/@commitlint/config-angular-type-enum/package.json index 2f8dcbf096..44abe83730 100644 --- a/@commitlint/config-angular-type-enum/package.json +++ b/@commitlint/config-angular-type-enum/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/config-angular-type-enum", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Shareable commitlint config enforcing the angular commit convention types", "main": "index.js", "files": [ @@ -32,7 +32,7 @@ "node": ">=v18" }, "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/config-angular/CHANGELOG.md b/@commitlint/config-angular/CHANGELOG.md index 71e7fb5f7d..f16785c1ff 100644 --- a/@commitlint/config-angular/CHANGELOG.md +++ b/@commitlint/config-angular/CHANGELOG.md @@ -3,6 +3,46 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-angular + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-angular + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/config-angular + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package @commitlint/config-angular + + + + + +# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04) + +**Note:** Version bump only for package @commitlint/config-angular + + + + + # [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19) **Note:** Version bump only for package @commitlint/config-angular diff --git a/@commitlint/config-angular/README.md b/@commitlint/config-angular/README.md index 43d0d7731f..49bfc60726 100644 --- a/@commitlint/config-angular/README.md +++ b/@commitlint/config-angular/README.md @@ -2,7 +2,7 @@ Lint your commits, angular-style -Shareable `commitlint` config enforcing the [Angular commit convention](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit). +Shareable `commitlint` config enforcing the [Angular commit convention](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit). Use with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli). ## Getting started @@ -128,7 +128,7 @@ echo "fix: some message" # passes - **rule**: `never` The [angular commit -convention](hhttps://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit) +convention](hhttps://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit) does not use a `!` to define a breaking change in the commit subject. If you want to use this feature please consider using the [conventional commit config](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional#commitlintconfig-conventional). diff --git a/@commitlint/config-angular/index.js b/@commitlint/config-angular/index.js index c433e75baf..81848fb82c 100644 --- a/@commitlint/config-angular/index.js +++ b/@commitlint/config-angular/index.js @@ -1,22 +1,24 @@ -import typeEnum from '@commitlint/config-angular-type-enum'; +import typeEnum from "@commitlint/config-angular-type-enum"; export default { - parserPreset: {parserOpts: {headerPattern: /^(\w*)(?:\((.*)\))?!?: (.*)$/}}, + parserPreset: { + parserOpts: { headerPattern: /^(\w*)(?:\((.*)\))?!?: (.*)$/ }, + }, rules: { - 'subject-exclamation-mark': [2, 'never'], - 'body-leading-blank': [1, 'always'], - 'footer-leading-blank': [1, 'always'], - 'header-max-length': [2, 'always', 72], - 'scope-case': [2, 'always', 'lower-case'], - 'subject-case': [ + "subject-exclamation-mark": [2, "never"], + "body-leading-blank": [1, "always"], + "footer-leading-blank": [1, "always"], + "header-max-length": [2, "always", 72], + "scope-case": [2, "always", "lower-case"], + "subject-case": [ 2, - 'never', - ['sentence-case', 'start-case', 'pascal-case', 'upper-case'], + "never", + ["sentence-case", "start-case", "pascal-case", "upper-case"], ], - 'subject-empty': [2, 'never'], - 'subject-full-stop': [2, 'never', '.'], - 'type-case': [2, 'always', 'lower-case'], - 'type-empty': [2, 'never'], - 'type-enum': typeEnum.rules['type-enum'], + "subject-empty": [2, "never"], + "subject-full-stop": [2, "never", "."], + "type-case": [2, "always", "lower-case"], + "type-empty": [2, "never"], + "type-enum": typeEnum.rules["type-enum"], }, }; diff --git a/@commitlint/config-angular/index.test.js b/@commitlint/config-angular/index.test.js index 662c233cb3..d76a84c585 100644 --- a/@commitlint/config-angular/index.test.js +++ b/@commitlint/config-angular/index.test.js @@ -1,108 +1,108 @@ -import {test, expect} from 'vitest'; -import lint from '@commitlint/lint'; +import { test, expect } from "vitest"; +import lint from "@commitlint/lint"; -import config from './index.js'; +import config from "./index.js"; -const {rules, parserPreset} = config; +const { rules, parserPreset } = config; const lintMessage = async (message) => { const parserOpts = parserPreset.parserOpts; - const m = message.replace(/^\s+/, '').trim(); - const result = await lint(m, rules, {parserOpts}); + const m = message.replace(/^\s+/, "").trim(); + const result = await lint(m, rules, { parserOpts }); if (result.errors.length > 1) { throw new Error( - 'Commit test should only have one error message to validate against' + "Commit test should only have one error message to validate against", ); } if (result.warnings.length > 1) { throw new Error( - 'Commit test should only have one warning message to validate against' + "Commit test should only have one warning message to validate against", ); } return result; }; -test('a valid commit message', async () => { - const result = await lintMessage('test: a valid angular commit'); +test("a valid commit message", async () => { + const result = await lintMessage("test: a valid angular commit"); expect(result.valid).toBe(true); expect(result.errors).toStrictEqual([]); expect(result.warnings).toStrictEqual([]); }); -test('a valid message with a scope', async () => { +test("a valid message with a scope", async () => { const result = await lintMessage( - 'test(scope): a valid angular commit with a scope' + "test(scope): a valid angular commit with a scope", ); expect(result.valid).toBe(true); expect(result.errors).toStrictEqual([]); expect(result.warnings).toStrictEqual([]); }); -test('a valid multi line commit', async () => { +test("a valid multi line commit", async () => { const result = await lintMessage( `test(scope): a valid angular commit with a scope - Some content in the body` + Some content in the body`, ); expect(result.valid).toBe(true); expect(result.errors).toStrictEqual([]); expect(result.warnings).toStrictEqual([]); }); -test('a leading blank line after header', async () => { +test("a leading blank line after header", async () => { const result = await lintMessage( `test(scope): a valid angular commit with a scope - Some content in the body` + Some content in the body`, ); expect(result.valid).toBe(true); expect(result.errors).toStrictEqual([]); - expect(result.warnings[0].message).toBe('body must have leading blank line'); + expect(result.warnings[0].message).toBe("body must have leading blank line"); }); -test('an invalid scope', async () => { +test("an invalid scope", async () => { const result = await lintMessage(`no: no is not an invalid commit type`); expect(result.valid).toBe(false); expect(result.errors[0].message).toBe( - 'type must be one of [build, ci, docs, feat, fix, perf, refactor, revert, style, test]' + "type must be one of [build, ci, docs, feat, fix, perf, refactor, revert, style, test]", ); expect(result.warnings).toStrictEqual([]); }); -test('a long header', async () => { +test("a long header", async () => { const result = await lintMessage( - `test: that its an error when there is ia realllllllllllllllllllllly long header` + `test: that its an error when there is ia realllllllllllllllllllllly long header`, ); expect(result.valid).toBe(false); expect(result.errors[0].message).toBe( - 'header must not be longer than 72 characters, current length is 79' + "header must not be longer than 72 characters, current length is 79", ); expect(result.warnings).toStrictEqual([]); }); -test('message header with ! in it', async () => { +test("message header with ! in it", async () => { const result = await lintMessage(`test!: with a breaking change in the type`); expect(result.valid).toBe(false); expect(result.errors[0].message).toBe( - 'subject must not have an exclamation mark in the subject to identify a breaking change' + "subject must not have an exclamation mark in the subject to identify a breaking change", ); expect(result.warnings).toStrictEqual([]); }); -test('message header with ! in it and a scope', async () => { +test("message header with ! in it and a scope", async () => { const result = await lintMessage( - `test(scope)!: with a breaking change in the type` + `test(scope)!: with a breaking change in the type`, ); expect(result.valid).toBe(false); expect(result.errors[0].message).toBe( - 'subject must not have an exclamation mark in the subject to identify a breaking change' + "subject must not have an exclamation mark in the subject to identify a breaking change", ); expect(result.warnings).toStrictEqual([]); }); diff --git a/@commitlint/config-angular/package.json b/@commitlint/config-angular/package.json index 127e4884cd..25d65bbc27 100644 --- a/@commitlint/config-angular/package.json +++ b/@commitlint/config-angular/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/config-angular", "type": "module", - "version": "19.6.0", + "version": "20.0.0", "description": "Shareable commitlint config enforcing the angular commit convention", "main": "index.js", "files": [ @@ -32,11 +32,11 @@ "node": ">=v18" }, "devDependencies": { - "@commitlint/lint": "^19.6.0", - "@commitlint/utils": "^19.5.0" + "@commitlint/lint": "^20.0.0", + "@commitlint/utils": "^20.0.0" }, "dependencies": { - "@commitlint/config-angular-type-enum": "^19.5.0" + "@commitlint/config-angular-type-enum": "^20.0.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/config-conventional/CHANGELOG.md b/@commitlint/config-conventional/CHANGELOG.md index fd2d25802d..0242ace145 100644 --- a/@commitlint/config-conventional/CHANGELOG.md +++ b/@commitlint/config-conventional/CHANGELOG.md @@ -3,6 +3,41 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-conventional + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-conventional + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package @commitlint/config-conventional + + + + + # [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19) **Note:** Version bump only for package @commitlint/config-conventional diff --git a/@commitlint/config-conventional/package.json b/@commitlint/config-conventional/package.json index f959f867ca..5ef4fc7bb5 100644 --- a/@commitlint/config-conventional/package.json +++ b/@commitlint/config-conventional/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/config-conventional", "type": "module", - "version": "19.6.0", + "version": "20.0.0", "description": "Shareable commitlint config enforcing conventional commits", "main": "lib/index.js", "files": [ @@ -35,12 +35,12 @@ "node": ">=v18" }, "devDependencies": { - "@commitlint/lint": "^19.6.0", - "@commitlint/utils": "^19.5.0" + "@commitlint/lint": "^20.0.0", + "@commitlint/utils": "^20.0.0" }, "dependencies": { - "@commitlint/types": "^19.5.0", + "@commitlint/types": "^20.0.0", "conventional-changelog-conventionalcommits": "^7.0.2" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/config-conventional/src/index.test.ts b/@commitlint/config-conventional/src/index.test.ts index 683c401754..3603fe74f6 100644 --- a/@commitlint/config-conventional/src/index.test.ts +++ b/@commitlint/config-conventional/src/index.test.ts @@ -1,53 +1,53 @@ -import {test, expect} from 'vitest'; -import path from 'path'; -import {pathToFileURL} from 'url'; +import { test, expect } from "vitest"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; -import lint from '@commitlint/lint'; +import lint from "@commitlint/lint"; -import config from './index.js'; +import config from "./index.js"; -const {rules, parserPreset} = config; +const { rules, parserPreset } = config; const dynamicImport = async (id: string) => { const imported = await import( path.isAbsolute(id) ? pathToFileURL(id).toString() : id ); - return ('default' in imported && imported.default) || imported; + return ("default" in imported && imported.default) || imported; }; const commitLint = async (message: string) => { const preset = await (await dynamicImport(parserPreset))(); - return lint(message, rules, {...preset}); + return lint(message, rules, { ...preset }); }; const messages = { - invalidTypeEnum: 'foo: some message', - invalidTypeCase: 'FIX: some message', - invalidTypeEmpty: ': some message', + invalidTypeEnum: "foo: some message", + invalidTypeCase: "FIX: some message", + invalidTypeEmpty: ": some message", invalidSubjectCases: [ - 'fix(scope): Some message', - 'fix(scope): Some Message', - 'fix(scope): SomeMessage', - 'fix(scope): SOMEMESSAGE', + "fix(scope): Some message", + "fix(scope): Some Message", + "fix(scope): SomeMessage", + "fix(scope): SOMEMESSAGE", ], - invalidSubjectEmpty: 'fix:', - invalidSubjectFullStop: 'fix: some message.', + invalidSubjectEmpty: "fix:", + invalidSubjectFullStop: "fix: some message.", invalidHeaderMaxLength: - 'fix: some message that is way too long and breaks the line max-length by several characters since the max is 100', + "fix: some message that is way too long and breaks the line max-length by several characters since the max is 100", warningFooterLeadingBlank: - 'fix: some message\n\nbody\nBREAKING CHANGE: It will be significant', + "fix: some message\n\nbody\nBREAKING CHANGE: It will be significant", invalidFooterMaxLineLength: 'fix: some message\n\nbody\n\nBREAKING CHANGE: footer with multiple lines\nhas a message that is way too long and will break the line rule "line-max-length" by several characters', - warningBodyLeadingBlank: 'fix: some message\nbody', + warningBodyLeadingBlank: "fix: some message\nbody", invalidBodyMaxLineLength: 'fix: some message\n\nbody with multiple lines\nhas a message that is way too long and will break the line rule "line-max-length" by several characters', validMessages: [ - 'fix: some message', - 'fix(scope): some message', - 'fix(scope): some Message', - 'fix(scope): some message\n\nBREAKING CHANGE: it will be significant!', - 'fix(scope): some message\n\nbody', - 'fix(scope)!: some message\n\nbody', + "fix: some message", + "fix(scope): some message", + "fix(scope): some Message", + "fix(scope): some message\n\nBREAKING CHANGE: it will be significant!", + "fix(scope): some message\n\nbody", + "fix(scope)!: some message\n\nbody", ], }; @@ -55,58 +55,58 @@ const errors = { typeEnum: { level: 2, message: - 'type must be one of [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test]', - name: 'type-enum', + "type must be one of [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test]", + name: "type-enum", valid: false, }, typeCase: { level: 2, - message: 'type must be lower-case', - name: 'type-case', + message: "type must be lower-case", + name: "type-case", valid: false, }, typeEmpty: { level: 2, - message: 'type may not be empty', - name: 'type-empty', + message: "type may not be empty", + name: "type-empty", valid: false, }, subjectCase: { level: 2, message: - 'subject must not be sentence-case, start-case, pascal-case, upper-case', - name: 'subject-case', + "subject must not be sentence-case, start-case, pascal-case, upper-case", + name: "subject-case", valid: false, }, subjectEmpty: { level: 2, - message: 'subject may not be empty', - name: 'subject-empty', + message: "subject may not be empty", + name: "subject-empty", valid: false, }, subjectFullStop: { level: 2, - message: 'subject may not end with full stop', - name: 'subject-full-stop', + message: "subject may not end with full stop", + name: "subject-full-stop", valid: false, }, headerMaxLength: { level: 2, message: - 'header must not be longer than 100 characters, current length is 112', - name: 'header-max-length', + "header must not be longer than 100 characters, current length is 112", + name: "header-max-length", valid: false, }, footerMaxLineLength: { level: 2, message: "footer's lines must not be longer than 100 characters", - name: 'footer-max-line-length', + name: "footer-max-line-length", valid: false, }, bodyMaxLineLength: { level: 2, message: "body's lines must not be longer than 100 characters", - name: 'body-max-line-length', + name: "body-max-line-length", valid: false, }, }; @@ -114,42 +114,44 @@ const errors = { const warnings = { footerLeadingBlank: { level: 1, - message: 'footer must have leading blank line', - name: 'footer-leading-blank', + message: "footer must have leading blank line", + name: "footer-leading-blank", valid: false, }, bodyLeadingBlank: { level: 1, - message: 'body must have leading blank line', - name: 'body-leading-blank', + message: "body must have leading blank line", + name: "body-leading-blank", valid: false, }, }; -test('type-enum', async () => { +test("type-enum", async () => { const result = await commitLint(messages.invalidTypeEnum); expect(result.valid).toBe(false); expect(result.errors).toEqual([errors.typeEnum]); }); -test('type-case', async () => { +test("type-case", async () => { const result = await commitLint(messages.invalidTypeCase); expect(result.valid).toBe(false); expect(result.errors).toEqual([errors.typeCase, errors.typeEnum]); }); -test('type-empty', async () => { +test("type-empty", async () => { const result = await commitLint(messages.invalidTypeEmpty); expect(result.valid).toBe(false); expect(result.errors).toEqual([errors.typeEmpty]); }); -test('subject-case', async () => { +test("subject-case", async () => { const invalidInputs = await Promise.all( - messages.invalidSubjectCases.map((invalidInput) => commitLint(invalidInput)) + messages.invalidSubjectCases.map((invalidInput) => + commitLint(invalidInput), + ), ); invalidInputs.forEach((result) => { @@ -158,58 +160,58 @@ test('subject-case', async () => { }); }); -test('subject-empty', async () => { +test("subject-empty", async () => { const result = await commitLint(messages.invalidSubjectEmpty); expect(result.valid).toBe(false); expect(result.errors).toEqual([errors.subjectEmpty, errors.typeEmpty]); }); -test('subject-full-stop', async () => { +test("subject-full-stop", async () => { const result = await commitLint(messages.invalidSubjectFullStop); expect(result.valid).toBe(false); expect(result.errors).toEqual([errors.subjectFullStop]); }); -test('header-max-length', async () => { +test("header-max-length", async () => { const result = await commitLint(messages.invalidHeaderMaxLength); expect(result.valid).toBe(false); expect(result.errors).toEqual([errors.headerMaxLength]); }); -test('footer-leading-blank', async () => { +test("footer-leading-blank", async () => { const result = await commitLint(messages.warningFooterLeadingBlank); expect(result.valid).toBe(true); expect(result.warnings).toEqual([warnings.footerLeadingBlank]); }); -test('footer-max-line-length', async () => { +test("footer-max-line-length", async () => { const result = await commitLint(messages.invalidFooterMaxLineLength); expect(result.valid).toBe(false); expect(result.errors).toEqual([errors.footerMaxLineLength]); }); -test('body-leading-blank', async () => { +test("body-leading-blank", async () => { const result = await commitLint(messages.warningBodyLeadingBlank); expect(result.valid).toBe(true); expect(result.warnings).toEqual([warnings.bodyLeadingBlank]); }); -test('body-max-line-length', async () => { +test("body-max-line-length", async () => { const result = await commitLint(messages.invalidBodyMaxLineLength); expect(result.valid).toBe(false); expect(result.errors).toEqual([errors.bodyMaxLineLength]); }); -test('valid messages', async () => { +test("valid messages", async () => { const validInputs = await Promise.all( - messages.validMessages.map((input) => commitLint(input)) + messages.validMessages.map((input) => commitLint(input)), ); validInputs.forEach((result) => { diff --git a/@commitlint/config-conventional/src/index.ts b/@commitlint/config-conventional/src/index.ts index f07f233f0e..09ee1c9a67 100644 --- a/@commitlint/config-conventional/src/index.ts +++ b/@commitlint/config-conventional/src/index.ts @@ -2,45 +2,45 @@ import { RuleConfigCondition, RuleConfigSeverity, TargetCaseType, -} from '@commitlint/types'; +} from "@commitlint/types"; export default { - parserPreset: 'conventional-changelog-conventionalcommits', + parserPreset: "conventional-changelog-conventionalcommits", rules: { - 'body-leading-blank': [RuleConfigSeverity.Warning, 'always'] as const, - 'body-max-line-length': [RuleConfigSeverity.Error, 'always', 100] as const, - 'footer-leading-blank': [RuleConfigSeverity.Warning, 'always'] as const, - 'footer-max-line-length': [ + "body-leading-blank": [RuleConfigSeverity.Warning, "always"] as const, + "body-max-line-length": [RuleConfigSeverity.Error, "always", 100] as const, + "footer-leading-blank": [RuleConfigSeverity.Warning, "always"] as const, + "footer-max-line-length": [ RuleConfigSeverity.Error, - 'always', + "always", 100, ] as const, - 'header-max-length': [RuleConfigSeverity.Error, 'always', 100] as const, - 'header-trim': [RuleConfigSeverity.Error, 'always'] as const, - 'subject-case': [ + "header-max-length": [RuleConfigSeverity.Error, "always", 100] as const, + "header-trim": [RuleConfigSeverity.Error, "always"] as const, + "subject-case": [ RuleConfigSeverity.Error, - 'never', - ['sentence-case', 'start-case', 'pascal-case', 'upper-case'], + "never", + ["sentence-case", "start-case", "pascal-case", "upper-case"], ] as [RuleConfigSeverity, RuleConfigCondition, TargetCaseType[]], - 'subject-empty': [RuleConfigSeverity.Error, 'never'] as const, - 'subject-full-stop': [RuleConfigSeverity.Error, 'never', '.'] as const, - 'type-case': [RuleConfigSeverity.Error, 'always', 'lower-case'] as const, - 'type-empty': [RuleConfigSeverity.Error, 'never'] as const, - 'type-enum': [ + "subject-empty": [RuleConfigSeverity.Error, "never"] as const, + "subject-full-stop": [RuleConfigSeverity.Error, "never", "."] as const, + "type-case": [RuleConfigSeverity.Error, "always", "lower-case"] as const, + "type-empty": [RuleConfigSeverity.Error, "never"] as const, + "type-enum": [ RuleConfigSeverity.Error, - 'always', + "always", [ - 'build', - 'chore', - 'ci', - 'docs', - 'feat', - 'fix', - 'perf', - 'refactor', - 'revert', - 'style', - 'test', + "build", + "chore", + "ci", + "docs", + "feat", + "fix", + "perf", + "refactor", + "revert", + "style", + "test", ], ] as [RuleConfigSeverity, RuleConfigCondition, string[]], }, @@ -50,93 +50,93 @@ export default { description: "Select the type of change that you're committing", enum: { feat: { - description: 'A new feature', - title: 'Features', - emoji: '✨', + description: "A new feature", + title: "Features", + emoji: "✨", }, fix: { - description: 'A bug fix', - title: 'Bug Fixes', - emoji: '🐛', + description: "A bug fix", + title: "Bug Fixes", + emoji: "🐛", }, docs: { - description: 'Documentation only changes', - title: 'Documentation', - emoji: '📚', + description: "Documentation only changes", + title: "Documentation", + emoji: "📚", }, style: { description: - 'Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)', - title: 'Styles', - emoji: '💎', + "Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)", + title: "Styles", + emoji: "💎", }, refactor: { description: - 'A code change that neither fixes a bug nor adds a feature', - title: 'Code Refactoring', - emoji: '📦', + "A code change that neither fixes a bug nor adds a feature", + title: "Code Refactoring", + emoji: "📦", }, perf: { - description: 'A code change that improves performance', - title: 'Performance Improvements', - emoji: '🚀', + description: "A code change that improves performance", + title: "Performance Improvements", + emoji: "🚀", }, test: { - description: 'Adding missing tests or correcting existing tests', - title: 'Tests', - emoji: '🚨', + description: "Adding missing tests or correcting existing tests", + title: "Tests", + emoji: "🚨", }, build: { description: - 'Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)', - title: 'Builds', - emoji: '🛠', + "Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)", + title: "Builds", + emoji: "🛠", }, ci: { description: - 'Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)', - title: 'Continuous Integrations', - emoji: '⚙️', + "Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)", + title: "Continuous Integrations", + emoji: "⚙️", }, chore: { description: "Other changes that don't modify src or test files", - title: 'Chores', - emoji: '♻️', + title: "Chores", + emoji: "♻️", }, revert: { - description: 'Reverts a previous commit', - title: 'Reverts', - emoji: '🗑', + description: "Reverts a previous commit", + title: "Reverts", + emoji: "🗑", }, }, }, scope: { description: - 'What is the scope of this change (e.g. component or file name)', + "What is the scope of this change (e.g. component or file name)", }, subject: { description: - 'Write a short, imperative tense description of the change', + "Write a short, imperative tense description of the change", }, body: { - description: 'Provide a longer description of the change', + description: "Provide a longer description of the change", }, isBreaking: { - description: 'Are there any breaking changes?', + description: "Are there any breaking changes?", }, breakingBody: { description: - 'A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself', + "A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself", }, breaking: { - description: 'Describe the breaking changes', + description: "Describe the breaking changes", }, isIssueAffected: { - description: 'Does this change affect any open issues?', + description: "Does this change affect any open issues?", }, issuesBody: { description: - 'If issues are closed, the commit requires a body. Please enter a longer description of the commit itself', + "If issues are closed, the commit requires a body. Please enter a longer description of the commit itself", }, issues: { description: 'Add issue references (e.g. "fix #123", "re #123".)', diff --git a/@commitlint/config-lerna-scopes/CHANGELOG.md b/@commitlint/config-lerna-scopes/CHANGELOG.md index c10b62fe38..fb311bbd39 100644 --- a/@commitlint/config-lerna-scopes/CHANGELOG.md +++ b/@commitlint/config-lerna-scopes/CHANGELOG.md @@ -3,6 +3,49 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-lerna-scopes + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-lerna-scopes + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Bug Fixes + +* **config-lerna-scopes:** remove deprecated @lerna/project dependency ([#4284](https://github.com/conventional-changelog/commitlint/issues/4284)) ([f2f78f1](https://github.com/conventional-changelog/commitlint/commit/f2f78f105a32d040d8eb7e340f59a1d50fad9ac0)) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04) + + +### Features + +* support lerna 7 and 8 ([#4221](https://github.com/conventional-changelog/commitlint/issues/4221)) ([3b8da63](https://github.com/conventional-changelog/commitlint/commit/3b8da63f50f868555a3f026a76e96cd8d20638de)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/config-lerna-scopes diff --git a/@commitlint/config-lerna-scopes/fixtures/basic/lerna.json b/@commitlint/config-lerna-scopes/fixtures/basic/lerna.json index 41c31e2033..743ceadeaa 100644 --- a/@commitlint/config-lerna-scopes/fixtures/basic/lerna.json +++ b/@commitlint/config-lerna-scopes/fixtures/basic/lerna.json @@ -1,5 +1,4 @@ { - "lerna": "4", "version": "1.0.0", "packages": ["packages/*"] } diff --git a/@commitlint/config-lerna-scopes/fixtures/basic/package.json b/@commitlint/config-lerna-scopes/fixtures/basic/package.json index 85a312021c..7b7c45507d 100644 --- a/@commitlint/config-lerna-scopes/fixtures/basic/package.json +++ b/@commitlint/config-lerna-scopes/fixtures/basic/package.json @@ -1,8 +1,4 @@ { "name": "basic", - "version": "1.0.0", - "devDependencies": { - "lerna": "^4.0.0", - "@lerna/project": "^4.0.0" - } + "version": "1.0.0" } diff --git a/@commitlint/config-lerna-scopes/fixtures/basic/packages/a/package.json b/@commitlint/config-lerna-scopes/fixtures/basic/packages/a/package.json index 9113c2528e..9a71b5dd55 100644 --- a/@commitlint/config-lerna-scopes/fixtures/basic/packages/a/package.json +++ b/@commitlint/config-lerna-scopes/fixtures/basic/packages/a/package.json @@ -1,4 +1,4 @@ { - "name": "a", + "name": "@commitlint-lerna-scopes/basic-a", "version": "1.0.0" } diff --git a/@commitlint/config-lerna-scopes/fixtures/basic/packages/b/package.json b/@commitlint/config-lerna-scopes/fixtures/basic/packages/b/package.json index c2d84cc127..7b724bdb22 100644 --- a/@commitlint/config-lerna-scopes/fixtures/basic/packages/b/package.json +++ b/@commitlint/config-lerna-scopes/fixtures/basic/packages/b/package.json @@ -1,4 +1,4 @@ { - "name": "b", + "name": "@commitlint-lerna-scopes/basic-b", "version": "1.0.0" } diff --git a/@commitlint/config-lerna-scopes/fixtures/empty/lerna.json b/@commitlint/config-lerna-scopes/fixtures/empty/lerna.json index 41c31e2033..743ceadeaa 100644 --- a/@commitlint/config-lerna-scopes/fixtures/empty/lerna.json +++ b/@commitlint/config-lerna-scopes/fixtures/empty/lerna.json @@ -1,5 +1,4 @@ { - "lerna": "4", "version": "1.0.0", "packages": ["packages/*"] } diff --git a/@commitlint/config-lerna-scopes/fixtures/empty/package.json b/@commitlint/config-lerna-scopes/fixtures/empty/package.json index 345438e0ac..a0d311fba7 100644 --- a/@commitlint/config-lerna-scopes/fixtures/empty/package.json +++ b/@commitlint/config-lerna-scopes/fixtures/empty/package.json @@ -1,8 +1,4 @@ { "name": "empty", - "version": "1.0.0", - "devDependencies": { - "lerna": "^4.0.0", - "@lerna/project": "^4.0.0" - } + "version": "1.0.0" } diff --git a/@commitlint/config-lerna-scopes/fixtures/modules/lerna.json b/@commitlint/config-lerna-scopes/fixtures/modules/lerna.json index 41c31e2033..743ceadeaa 100644 --- a/@commitlint/config-lerna-scopes/fixtures/modules/lerna.json +++ b/@commitlint/config-lerna-scopes/fixtures/modules/lerna.json @@ -1,5 +1,4 @@ { - "lerna": "4", "version": "1.0.0", "packages": ["packages/*"] } diff --git a/@commitlint/config-lerna-scopes/fixtures/modules/package.json b/@commitlint/config-lerna-scopes/fixtures/modules/package.json index 85a312021c..7b7c45507d 100644 --- a/@commitlint/config-lerna-scopes/fixtures/modules/package.json +++ b/@commitlint/config-lerna-scopes/fixtures/modules/package.json @@ -1,8 +1,4 @@ { "name": "basic", - "version": "1.0.0", - "devDependencies": { - "lerna": "^4.0.0", - "@lerna/project": "^4.0.0" - } + "version": "1.0.0" } diff --git a/@commitlint/config-lerna-scopes/fixtures/modules/packages/a/package.json b/@commitlint/config-lerna-scopes/fixtures/modules/packages/a/package.json index 9113c2528e..1c6951c9b1 100644 --- a/@commitlint/config-lerna-scopes/fixtures/modules/packages/a/package.json +++ b/@commitlint/config-lerna-scopes/fixtures/modules/packages/a/package.json @@ -1,4 +1,4 @@ { - "name": "a", + "name": "@commitlint-lerna-scopes/modules-a", "version": "1.0.0" } diff --git a/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/a/nested-a/node_modules/dependency-a/package.json b/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/a/nested-a/node_modules/dependency-a/package.json deleted file mode 100644 index 2d821efc58..0000000000 --- a/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/a/nested-a/node_modules/dependency-a/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "@packages/dependency-a", - "version": "1.0.0" -} diff --git a/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/b/nested-b/node_modules/dependency-b/package.json b/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/b/nested-b/node_modules/dependency-b/package.json deleted file mode 100644 index f3a1a9b5e9..0000000000 --- a/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/b/nested-b/node_modules/dependency-b/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "@packages/dependency-b", - "version": "1.0.0" -} diff --git a/@commitlint/config-lerna-scopes/fixtures/nested/lerna.json b/@commitlint/config-lerna-scopes/fixtures/nested/lerna.json new file mode 100644 index 0000000000..8dec4c2731 --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/nested/lerna.json @@ -0,0 +1,4 @@ +{ + "version": "1.0.0", + "packages": ["packages/**"] +} diff --git a/@commitlint/config-lerna-scopes/fixtures/nested/package.json b/@commitlint/config-lerna-scopes/fixtures/nested/package.json new file mode 100644 index 0000000000..548079cf10 --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/nested/package.json @@ -0,0 +1,4 @@ +{ + "name": "nested-workspaces", + "version": "1.0.0" +} diff --git a/@commitlint/config-lerna-scopes/fixtures/nested/packages/a/nested-a/package.json b/@commitlint/config-lerna-scopes/fixtures/nested/packages/a/nested-a/package.json new file mode 100644 index 0000000000..6a56f652a6 --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/nested/packages/a/nested-a/package.json @@ -0,0 +1,4 @@ +{ + "name": "@commitlint-lerna-scopes/nested-a", + "version": "1.0.0" +} diff --git a/@commitlint/config-lerna-scopes/fixtures/nested/packages/b/nested-b/package.json b/@commitlint/config-lerna-scopes/fixtures/nested/packages/b/nested-b/package.json new file mode 100644 index 0000000000..542bd9f25f --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/nested/packages/b/nested-b/package.json @@ -0,0 +1,4 @@ +{ + "name": "@commitlint-lerna-scopes/nested-b", + "version": "1.0.0" +} diff --git a/@commitlint/config-lerna-scopes/fixtures/nested/packages/c/package.json b/@commitlint/config-lerna-scopes/fixtures/nested/packages/c/package.json new file mode 100644 index 0000000000..982a03ea31 --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/nested/packages/c/package.json @@ -0,0 +1,4 @@ +{ + "name": "@commitlint-lerna-scopes/nested-c", + "version": "1.0.0" +} diff --git a/@commitlint/config-lerna-scopes/fixtures/no-packages-declaration/lerna.json b/@commitlint/config-lerna-scopes/fixtures/no-packages-declaration/lerna.json new file mode 100644 index 0000000000..1587a66968 --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/no-packages-declaration/lerna.json @@ -0,0 +1,3 @@ +{ + "version": "1.0.0" +} diff --git a/@commitlint/config-lerna-scopes/fixtures/no-packages-declaration/package.json b/@commitlint/config-lerna-scopes/fixtures/no-packages-declaration/package.json new file mode 100644 index 0000000000..434d703596 --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/no-packages-declaration/package.json @@ -0,0 +1,4 @@ +{ + "name": "@commitlint-lerna-scopes/no-packages-declaration", + "version": "1.0.0" +} diff --git a/@commitlint/config-lerna-scopes/fixtures/scoped/@packages/a/package.json b/@commitlint/config-lerna-scopes/fixtures/scoped/@packages/a/package.json index 7ba283037e..d33e5bda39 100644 --- a/@commitlint/config-lerna-scopes/fixtures/scoped/@packages/a/package.json +++ b/@commitlint/config-lerna-scopes/fixtures/scoped/@packages/a/package.json @@ -1,4 +1,4 @@ { - "name": "@packages/a", + "name": "@commitlint-lerna-scopes/scoped-a", "version": "1.0.0" } diff --git a/@commitlint/config-lerna-scopes/fixtures/scoped/@packages/b/package.json b/@commitlint/config-lerna-scopes/fixtures/scoped/@packages/b/package.json index 3fd2cf7616..bcc30a0a61 100644 --- a/@commitlint/config-lerna-scopes/fixtures/scoped/@packages/b/package.json +++ b/@commitlint/config-lerna-scopes/fixtures/scoped/@packages/b/package.json @@ -1,4 +1,4 @@ { - "name": "@packages/b", + "name": "@commitlint-lerna-scopes/scoped-b", "version": "1.0.0" } diff --git a/@commitlint/config-lerna-scopes/fixtures/scoped/lerna.json b/@commitlint/config-lerna-scopes/fixtures/scoped/lerna.json index 8e0ca65b2e..daafb8e8db 100644 --- a/@commitlint/config-lerna-scopes/fixtures/scoped/lerna.json +++ b/@commitlint/config-lerna-scopes/fixtures/scoped/lerna.json @@ -1,5 +1,4 @@ { - "lerna": "4", "version": "1.0.0", - "packages": ["@packages/*"] + "packages": ["@packages/**"] } diff --git a/@commitlint/config-lerna-scopes/fixtures/scoped/package.json b/@commitlint/config-lerna-scopes/fixtures/scoped/package.json index 5ede29c62c..3981adbef6 100644 --- a/@commitlint/config-lerna-scopes/fixtures/scoped/package.json +++ b/@commitlint/config-lerna-scopes/fixtures/scoped/package.json @@ -1,8 +1,4 @@ { "name": "scoped", - "version": "1.0.0", - "devDependencies": { - "lerna": "^4.0.0", - "@lerna/project": "^4.0.0" - } + "version": "1.0.0" } diff --git a/@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/lerna.json b/@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/lerna.json new file mode 100644 index 0000000000..1587a66968 --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/lerna.json @@ -0,0 +1,3 @@ +{ + "version": "1.0.0" +} diff --git a/@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/package.json b/@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/package.json new file mode 100644 index 0000000000..c0ed8f8e23 --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/package.json @@ -0,0 +1,5 @@ +{ + "name": "@commitlint-lerna-scopes/transition-to-workspace-scopes", + "version": "1.0.0", + "workspaces": ["./packages/*"] +} diff --git a/@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/packages/workspace-package/package.json b/@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/packages/workspace-package/package.json new file mode 100644 index 0000000000..2039be51ea --- /dev/null +++ b/@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/packages/workspace-package/package.json @@ -0,0 +1,4 @@ +{ + "name": "@commitlint-lerna-scopes/workspace-package", + "version": "1.0.0" +} diff --git a/@commitlint/config-lerna-scopes/index.js b/@commitlint/config-lerna-scopes/index.js index b1476cb250..a24642b5ae 100644 --- a/@commitlint/config-lerna-scopes/index.js +++ b/@commitlint/config-lerna-scopes/index.js @@ -1,70 +1,89 @@ -import {createRequire} from 'module'; -import Path from 'path'; - -import {globSync} from 'glob'; -import importFrom from 'import-from'; -import semver from 'semver'; - -const require = createRequire(import.meta.url); +import path from "node:path"; +import fs from "node:fs/promises"; +import fg from "fast-glob"; +import configWorkspaceScopes from "@commitlint/config-workspace-scopes"; export default { - utils: {getPackages}, + utils: { getProjects }, rules: { - 'scope-enum': (ctx) => - getPackages(ctx).then((packages) => [2, 'always', packages]), + "scope-enum": (ctx) => + getProjects(ctx).then((packages) => [2, "always", packages]), }, }; -function getPackages(context) { - return Promise.resolve() - .then(() => { - const ctx = context || {}; - const cwd = ctx.cwd || process.cwd(); - - const {workspaces} = require(Path.join(cwd, 'package.json')); - if (Array.isArray(workspaces) && workspaces.length) { - // use yarn workspaces +/** + * Turn glob paths with potential 'package.json' ending always into paths + * with a package.json ending to find monorepo packages + * @param {string[]} patterns + * @returns A list of glob paths to resolve package.json files + */ +function normalizePatterns(patterns) { + const normalizedPatterns = []; + for (const pattern of patterns) { + normalizedPatterns.push(pattern.replace(/\/?$/, "/package.json")); + } + return normalizedPatterns; +} - const wsGlobs = workspaces.flatMap((ws) => { - const path = Path.posix.join(ws, 'package.json'); - return globSync(path, {cwd, ignore: ['**/node_modules/**']}); - }); +/** + * Find all package.json contents in the defined cwd + * @param {string} cwd + * @returns A list of parsed package.json files as objects + */ +async function findPackages(cwd) { + const json = await fs.readFile(path.join(cwd, "lerna.json"), { + encoding: "utf-8", + }); - return wsGlobs.map((pJson) => require(Path.join(cwd, pJson))); - } + const packages = JSON.parse(json)?.packages || []; + if (packages.length === 0) { + return []; + } - const lernaVersion = getLernaVersion(cwd); - if (semver.lt(lernaVersion, '3.0.0')) { - const Repository = importFrom(cwd, 'lerna/lib/Repository'); - const PackageUtilities = importFrom(cwd, 'lerna/lib/PackageUtilities'); + const patterns = normalizePatterns(packages); + const entries = await fg(patterns, { + cwd, + ignore: ["**/node_modules/**", "**/bower_components/**"], + }); - const repository = new Repository(cwd); - return PackageUtilities.getPackages({ - packageConfigs: repository.packageConfigs, - rootPath: cwd, - }); - } + const pkgJsons = await Promise.all( + Array.from(new Set(entries.map((entry) => path.join(cwd, entry)))).map( + (pkgPath) => fs.readFile(pkgPath, { encoding: "utf-8" }), + ), + ); - const {getPackages} = importFrom(cwd, '@lerna/project'); - return getPackages(cwd); - }) - .then((packages) => { - return packages - .map((pkg) => pkg.name) - .filter(Boolean) - .map((name) => (name.charAt(0) === '@' ? name.split('/')[1] : name)); - }); + return pkgJsons.map((pkgJson) => JSON.parse(pkgJson) || {}); } -function getLernaVersion(cwd) { - const moduleEntrypoint = require.resolve('lerna', { - paths: [cwd], +async function getProjects(context) { + const ctx = context || {}; + const cwd = ctx.cwd || process.cwd(); + + // try to read workspaces for backwards compatibility + const workspacePackages = await configWorkspaceScopes.utils.getPackages({ + cwd, }); - const moduleDir = Path.join( - moduleEntrypoint.slice(0, moduleEntrypoint.lastIndexOf('node_modules')), - 'node_modules', - 'lerna' - ); - const modulePackageJson = Path.join(moduleDir, 'package.json'); - return require(modulePackageJson).version; + // native npm/yarn workspaces detected, inform user to use new package instead + if (workspacePackages.length > 0) { + console.warn( + [ + `It seems that you are using npm/yarn workspaces instead of lernas "packages" declaration.`, + `Support for workspaces will be removed in a future major version of this package.`, + `Please make sure to transition to "@commitlint/config-workspace-scopes" in the near future.`, + ].join("\n"), + ); + return workspacePackages; + } + + const packages = await findPackages(cwd); + + return packages + .reduce((pkgNames, pkg) => { + const name = pkg.name; + if (name) { + pkgNames.push(name.charAt(0) === "@" ? name.split("/")[1] : name); + } + return pkgNames; + }, []) + .sort(); } diff --git a/@commitlint/config-lerna-scopes/index.test.js b/@commitlint/config-lerna-scopes/index.test.js index c8428419ad..3de602d281 100644 --- a/@commitlint/config-lerna-scopes/index.test.js +++ b/@commitlint/config-lerna-scopes/index.test.js @@ -1,101 +1,119 @@ -import {test, expect} from 'vitest'; -import path from 'path'; -import {fileURLToPath} from 'url'; +import { test, expect, vi } from "vitest"; +import path from "path"; +import { fileURLToPath } from "url"; -import {npm} from '@commitlint/test'; +import { npm } from "@commitlint/test"; -import config from './index.js'; +import config from "./index.js"; -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); -test('exports rules key', () => { - expect(config).toHaveProperty('rules'); +test("exports rules key", () => { + expect(config).toHaveProperty("rules"); }); -test('rules hold object', () => { +test("rules hold object", () => { expect(config).toMatchObject({ rules: expect.any(Object), }); }); -test('rules contain scope-enum', () => { +test("rules contain scope-enum", () => { expect(config).toMatchObject({ rules: { - 'scope-enum': expect.anything(), + "scope-enum": expect.anything(), }, }); }); -test('scope-enum is function', () => { +test("scope-enum is function", () => { expect(config).toMatchObject({ rules: { - 'scope-enum': expect.any(Function), + "scope-enum": expect.any(Function), }, }); }); -test('scope-enum does not throw for missing context', async () => { - const {'scope-enum': fn} = config.rules; +test("scope-enum does not throw for missing context", async () => { + const { "scope-enum": fn } = config.rules; await expect(fn()).resolves.toBeTruthy(); }); -test('scope-enum has expected severity', async () => { - const {'scope-enum': fn} = config.rules; +test("scope-enum has expected severity", async () => { + const { "scope-enum": fn } = config.rules; const [severity] = await fn(); expect(severity).toBe(2); }); -test('scope-enum has expected modifier', async () => { - const {'scope-enum': fn} = config.rules; +test("scope-enum has expected modifier", async () => { + const { "scope-enum": fn } = config.rules; const [, modifier] = await fn(); - expect(modifier).toBe('always'); + expect(modifier).toBe("always"); }); -test('returns empty value for empty lerna repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/empty', __dirname); - const [, , value] = await fn({cwd}); +test("returns empty value for empty lerna repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/empty", __dirname); + const [, , value] = await fn({ cwd }); expect(value).toEqual([]); }); -test('returns expected value for basic lerna repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/basic', __dirname); +test("returns all packages for nested lerna packages repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/nested", __dirname); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["nested-a", "nested-b", "nested-c"]); +}); + +test("returns expected value for basic lerna repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/basic", __dirname); - const [, , value] = await fn({cwd}); - expect(value).toEqual(['a', 'b']); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["basic-a", "basic-b"]); }); -test('returns expected value for lerna repository containing modules', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/modules', __dirname); +test("returns expected value for lerna repository containing modules", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/modules", __dirname); - const [, , value] = await fn({cwd}); - expect(value).toEqual(['a']); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["modules-a"]); }); -test('returns expected value for scoped lerna repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/scoped', __dirname); +test("returns expected value for scoped lerna repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/scoped", __dirname); - const [, , value] = await fn({cwd}); - expect(value).toEqual(['a', 'b']); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["scoped-a", "scoped-b"]); }); -test('returns expected value for yarn workspaces', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = path.join(__dirname, 'fixtures', 'yarn'); - const [, , value] = await fn({cwd}); - expect(value.sort()).toEqual(['a', 'b']); +test("work with no declared packages", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap( + "fixtures/no-packages-declaration", + __dirname, + ); + + const [, , value] = await fn({ cwd }); + expect(value).toEqual([]); }); -test('returns expected value for yarn workspaces has nested packages', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/nested-workspaces', __dirname); +test("inform the user about the transition to config-workspace-scopes if the project is using native workspaces", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap( + "fixtures/transition-to-workspace-scopes", + __dirname, + ); + + const consoleWarnSpy = vi.spyOn(console, "warn"); - const [, , value] = await fn({cwd}); - expect(value).toEqual(expect.arrayContaining(['nested-a', 'nested-b'])); - expect(value).toEqual( - expect.not.arrayContaining(['dependency-a', 'dependency-b']) + const [, , value] = await fn({ cwd }); + + expect(consoleWarnSpy).toHaveBeenCalledWith( + expect.stringContaining(`It seems that you are using npm/yarn workspaces`), ); + + expect(value).toEqual(["workspace-package"]); }); diff --git a/@commitlint/config-lerna-scopes/package.json b/@commitlint/config-lerna-scopes/package.json index 3ce2441f08..1e7544a39e 100644 --- a/@commitlint/config-lerna-scopes/package.json +++ b/@commitlint/config-lerna-scopes/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/config-lerna-scopes", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Shareable commitlint config enforcing lerna package and workspace names as scopes", "main": "index.js", "files": [ @@ -22,14 +22,14 @@ "commitlint-config", "lerna" ], - "author": "Mario Nebl <hello@herebecode.com>", + "author": "Jan Biasi (https://github.com/janbiasi)", "license": "MIT", "bugs": { "url": "https://github.com/conventional-changelog/commitlint/issues" }, "homepage": "https://commitlint.js.org/", "peerDependencies": { - "lerna": ">=5 <9" + "lerna": "*" }, "peerDependenciesMeta": { "lerna": { @@ -40,15 +40,12 @@ "node": ">=v18" }, "dependencies": { - "@lerna/project": "^6.0.0", - "glob": "^10.3.10", - "import-from": "^4.0.0", - "semver": "^7.6.0" + "@commitlint/config-workspace-scopes": "^20.0.0", + "fast-glob": "^3.3.3" }, "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0", - "@types/glob": "^8.1.0" + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/config-lerna-scopes/readme.md b/@commitlint/config-lerna-scopes/readme.md index ef818933d5..3d9d9ee3ee 100644 --- a/@commitlint/config-lerna-scopes/readme.md +++ b/@commitlint/config-lerna-scopes/readme.md @@ -2,9 +2,12 @@ Lint your lerna project commits -Shareable `commitlint` config enforcing lerna package and workspace names as scopes. +Shareable `commitlint` config enforcing lerna package scopes. Use with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli). +> [!IMPORTANT] +> If you are using NPM or Yarn workspaces, please use the [@commitlint/config-workspace-scopes](../config-workspace-scopes/) package instead. Support for workspaces will be removed from this package in a future major version. + ## Getting started ```sh diff --git a/@commitlint/config-nx-scopes/CHANGELOG.md b/@commitlint/config-nx-scopes/CHANGELOG.md index 2566cbecd1..e94fbc25e6 100644 --- a/@commitlint/config-nx-scopes/CHANGELOG.md +++ b/@commitlint/config-nx-scopes/CHANGELOG.md @@ -3,6 +3,44 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-nx-scopes + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-nx-scopes + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + + +### Bug Fixes + +* **config-nx-scopes:** fix for projects without explicit targets ([#4261](https://github.com/conventional-changelog/commitlint/issues/4261)) ([25bb2cd](https://github.com/conventional-changelog/commitlint/commit/25bb2cd8c70353637f77d471e39f4e4b17fa4cae)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/config-nx-scopes diff --git a/@commitlint/config-nx-scopes/index.js b/@commitlint/config-nx-scopes/index.js index fb2b4a5c6b..25debbeba3 100644 --- a/@commitlint/config-nx-scopes/index.js +++ b/@commitlint/config-nx-scopes/index.js @@ -1,12 +1,12 @@ -import {RuleConfigSeverity} from '@commitlint/types'; -import {getProjects as getNXProjects} from 'nx/src/generators/utils/project-configuration.js'; -import {FsTree} from 'nx/src/generators/tree.js'; +import { RuleConfigSeverity } from "@commitlint/types"; +import { getProjects as getNXProjects } from "nx/src/generators/utils/project-configuration.js"; +import { FsTree } from "nx/src/generators/tree.js"; export default { - utils: {getProjects}, + utils: { getProjects }, rules: { - 'scope-enum': (ctx) => - Promise.resolve([RuleConfigSeverity.Error, 'always', getProjects(ctx)]), + "scope-enum": (ctx) => + Promise.resolve([RuleConfigSeverity.Error, "always", getProjects(ctx)]), }, }; @@ -28,9 +28,8 @@ function getProjects(context, selector = () => true) { name: project.name, projectType: project.projectType, tags: project.tags, - }) + }), ) - .filter((project) => project.targets) .map((project) => project.name) - .map((name) => (name.charAt(0) === '@' ? name.split('/')[1] : name)); + .map((name) => (name.charAt(0) === "@" ? name.split("/")[1] : name)); } diff --git a/@commitlint/config-nx-scopes/index.test.js b/@commitlint/config-nx-scopes/index.test.js index 1d9e030c94..1a6f863ef3 100644 --- a/@commitlint/config-nx-scopes/index.test.js +++ b/@commitlint/config-nx-scopes/index.test.js @@ -1,91 +1,91 @@ -import {test, expect} from 'vitest'; -import path from 'path'; -import {fileURLToPath} from 'url'; +import { test, expect } from "vitest"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; -import {npm} from '@commitlint/test'; +import { npm } from "@commitlint/test"; -import config from './index.js'; +import config from "./index.js"; -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); -test('exports rules key', () => { - expect(config).toHaveProperty('rules'); +test("exports rules key", () => { + expect(config).toHaveProperty("rules"); }); -test('rules hold object', () => { +test("rules hold object", () => { expect(config).toMatchObject({ rules: expect.any(Object), }); }); -test('rules contain scope-enum', () => { +test("rules contain scope-enum", () => { expect(config).toMatchObject({ rules: { - 'scope-enum': expect.anything(), + "scope-enum": expect.anything(), }, }); }); -test('scope-enum is function', () => { +test("scope-enum is function", () => { expect(config).toMatchObject({ rules: { - 'scope-enum': expect.any(Function), + "scope-enum": expect.any(Function), }, }); }); -test('scope-enum does not throw for missing context', async () => { - const {'scope-enum': fn} = config.rules; +test("scope-enum does not throw for missing context", async () => { + const { "scope-enum": fn } = config.rules; await expect(fn()).resolves.toBeTruthy(); }); -test('scope-enum has expected severity', async () => { - const {'scope-enum': fn} = config.rules; +test("scope-enum has expected severity", async () => { + const { "scope-enum": fn } = config.rules; const [severity] = await fn(); expect(severity).toBe(2); }); -test('scope-enum has expected modifier', async () => { - const {'scope-enum': fn} = config.rules; +test("scope-enum has expected modifier", async () => { + const { "scope-enum": fn } = config.rules; const [, modifier] = await fn(); - expect(modifier).toBe('always'); + expect(modifier).toBe("always"); }); -test('returns empty value for empty nx repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/empty', __dirname); - const [, , value] = await fn({cwd}); +test("returns empty value for empty nx repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/empty", __dirname); + const [, , value] = await fn({ cwd }); expect(value).toEqual([]); }); -test('returns expected value for basic nx repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/basic', __dirname); +test("returns expected value for basic nx repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/basic", __dirname); - const [, , value] = await fn({cwd}); - expect(value).toEqual(['a', 'b']); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["a", "b"]); }); -test('expect correct result from Nx 14', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/nx14', __dirname); +test("expect correct result from Nx 14", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/nx14", __dirname); - const [, , value] = await fn({cwd}); - expect(value).toEqual(['c', 'd']); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["c", "d"]); }); -test('expect correct result from Nx 15', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/nx15', __dirname); +test("expect correct result from Nx 15", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/nx15", __dirname); - const [, , value] = await fn({cwd}); - expect(value).toEqual(['e', 'f']); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["e", "f"]); }); -test('expect correct result from Nx 17', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/nx17', __dirname); +test("expect correct result from Nx 17", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/nx17", __dirname); - const [, , value] = await fn({cwd}); - expect(value).toEqual(['g', 'h']); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["g", "h"]); }); diff --git a/@commitlint/config-nx-scopes/package.json b/@commitlint/config-nx-scopes/package.json index da6825fe76..63ad4e7848 100644 --- a/@commitlint/config-nx-scopes/package.json +++ b/@commitlint/config-nx-scopes/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/config-nx-scopes", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Shareable commitlint config enforcing nx project names as scopes", "main": "index.js", "files": [ @@ -40,11 +40,11 @@ "node": ">=v18" }, "dependencies": { - "@commitlint/types": "^19.5.0" + "@commitlint/types": "^20.0.0" }, "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0" + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/config-nx-scopes/readme.md b/@commitlint/config-nx-scopes/readme.md index 454a28b1e0..2890f85872 100644 --- a/@commitlint/config-nx-scopes/readme.md +++ b/@commitlint/config-nx-scopes/readme.md @@ -24,20 +24,20 @@ In your .commitlintrc.js file: async function getConfig() { const { default: { - utils: {getProjects}, + utils: { getProjects }, }, - } = await import('@commitlint/config-nx-scopes'); + } = await import("@commitlint/config-nx-scopes"); return { rules: { - 'scope-enum': async (ctx) => [ + "scope-enum": async (ctx) => [ 2, - 'always', + "always", [ ...(await getProjects( ctx, - ({name, projectType}) => - !name.includes('e2e') && projectType == 'application' + ({ name, projectType }) => + !name.includes("e2e") && projectType == "application", )), ], ], @@ -57,19 +57,19 @@ In your .commitlintrc.js file: async function getConfig() { const { default: { - utils: {getProjects}, + utils: { getProjects }, }, - } = await import('@commitlint/config-nx-scopes'); + } = await import("@commitlint/config-nx-scopes"); return { rules: { - 'scope-enum': async (ctx) => [ + "scope-enum": async (ctx) => [ 2, - 'always', + "always", [ ...(await getProjects( ctx, - ({tags}) => !tags.includes('stage:end-of-life') + ({ tags }) => !tags.includes("stage:end-of-life"), )), ], ], diff --git a/@commitlint/config-patternplate/CHANGELOG.md b/@commitlint/config-patternplate/CHANGELOG.md index 2ba78166f2..2b236b1179 100644 --- a/@commitlint/config-patternplate/CHANGELOG.md +++ b/@commitlint/config-patternplate/CHANGELOG.md @@ -3,6 +3,49 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-patternplate + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-patternplate + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package @commitlint/config-patternplate + + + + + +# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04) + +**Note:** Version bump only for package @commitlint/config-patternplate + + + + + # [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19) **Note:** Version bump only for package @commitlint/config-patternplate diff --git a/@commitlint/config-patternplate/index.js b/@commitlint/config-patternplate/index.js index 46d403b4db..240efb9655 100644 --- a/@commitlint/config-patternplate/index.js +++ b/@commitlint/config-patternplate/index.js @@ -1,24 +1,24 @@ -import path from 'path'; +import path from "node:path"; -import configAngular from '@commitlint/config-angular'; -import {glob} from 'glob'; -import merge from 'lodash.merge'; +import configAngular from "@commitlint/config-angular"; +import { glob } from "glob"; +import merge from "lodash.merge"; function pathToId(root, filePath) { const relativePath = path.relative(root, filePath); - return path.dirname(relativePath).split(path.sep).join('/'); + return path.dirname(relativePath).split(path.sep).join("/"); } async function getPatternIDs() { - const root = path.resolve(process.cwd(), './patterns'); - const pattern = path.resolve(root, '**/pattern.json'); + const root = path.resolve(process.cwd(), "./patterns"); + const pattern = path.resolve(root, "**/pattern.json"); const files = glob(pattern); return files.map((result) => pathToId(root, result)); } export default merge(configAngular, { rules: { - 'scope-enum': () => - getPatternIDs().then((ids) => [2, 'always', ids.concat(['system'])]), + "scope-enum": () => + getPatternIDs().then((ids) => [2, "always", ids.concat(["system"])]), }, }); diff --git a/@commitlint/config-patternplate/package.json b/@commitlint/config-patternplate/package.json index 733f558631..91d166fd6f 100644 --- a/@commitlint/config-patternplate/package.json +++ b/@commitlint/config-patternplate/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/config-patternplate", "type": "module", - "version": "19.6.0", + "version": "20.0.0", "description": "Lint your commits, patternplate-style", "main": "index.js", "files": [ @@ -32,13 +32,13 @@ "node": ">=v18" }, "dependencies": { - "@commitlint/config-angular": "^19.6.0", + "@commitlint/config-angular": "^20.0.0", "glob": "^10.3.10", "lodash.merge": "^4.6.2" }, "devDependencies": { - "@commitlint/utils": "^19.5.0", + "@commitlint/utils": "^20.0.0", "@types/lodash.merge": "^4.6.8" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/config-pnpm-scopes/CHANGELOG.md b/@commitlint/config-pnpm-scopes/CHANGELOG.md index 66f5ce6aaa..27daf022c2 100644 --- a/@commitlint/config-pnpm-scopes/CHANGELOG.md +++ b/@commitlint/config-pnpm-scopes/CHANGELOG.md @@ -3,6 +3,66 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + + +### Features + +* **config-pnpm-scopes:** allow global scope ([#4553](https://github.com/conventional-changelog/commitlint/issues/4553)) ([e571970](https://github.com/conventional-changelog/commitlint/commit/e57197061447eb9ea74b8d81ab003ad3b4652be6)) + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-pnpm-scopes + + + + + +## [19.9.1](https://github.com/conventional-changelog/commitlint/compare/v19.9.0...v19.9.1) (2025-08-29) + + +### Bug Fixes + +* add TypeScript support and configuration for pnpm scopes ([#4544](https://github.com/conventional-changelog/commitlint/issues/4544)) ([ea75778](https://github.com/conventional-changelog/commitlint/commit/ea75778e8d32c932d85062902456cd821e471fdd)) + + + + + +# [19.9.0](https://github.com/conventional-changelog/commitlint/compare/v19.8.1...v19.9.0) (2025-08-26) + + +### Features + +* **config-pnpm-scopes:** migrate package to TypeScript ([#4541](https://github.com/conventional-changelog/commitlint/issues/4541)) ([6ae36ea](https://github.com/conventional-changelog/commitlint/commit/6ae36ea5a55d7736024461ec6af94a14b821acc4)) + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-pnpm-scopes + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/config-pnpm-scopes diff --git a/@commitlint/config-pnpm-scopes/index.js b/@commitlint/config-pnpm-scopes/index.js deleted file mode 100644 index a4f38d4159..0000000000 --- a/@commitlint/config-pnpm-scopes/index.js +++ /dev/null @@ -1,79 +0,0 @@ -import path from 'path'; - -import fg from 'fast-glob'; -import readYamlFile from 'read-yaml-file'; -import {readExactProjectManifest} from '@pnpm/read-project-manifest'; - -export default { - utils: {getProjects}, - rules: { - 'scope-enum': (ctx) => - getProjects(ctx).then((packages) => [2, 'always', packages]), - }, -}; - -function requirePackagesManifest(dir) { - return readYamlFile(path.join(dir, 'pnpm-workspace.yaml')).catch((err) => { - if (err.code === 'ENOENT') { - return null; - } - - throw err; - }); -} - -function normalizePatterns(patterns) { - const normalizedPatterns = []; - for (const pattern of patterns) { - normalizedPatterns.push(pattern.replace(/\/?$/, '/package.json')); - normalizedPatterns.push(pattern.replace(/\/?$/, '/package.json5')); - normalizedPatterns.push(pattern.replace(/\/?$/, '/package.yaml')); - } - return normalizedPatterns; -} - -function findWorkspacePackages(cwd) { - return requirePackagesManifest(cwd) - .then((manifest) => { - const patterns = normalizePatterns( - (manifest && manifest.packages) || ['**'] - ); - const opts = { - cwd, - ignore: ['**/node_modules/**', '**/bower_components/**'], - }; - - return fg(patterns, opts); - }) - .then((entries) => { - const paths = Array.from( - new Set(entries.map((entry) => path.join(cwd, entry))) - ); - - return Promise.all( - paths.map((manifestPath) => readExactProjectManifest(manifestPath)) - ); - }) - .then((manifests) => { - return manifests.map((manifest) => manifest.manifest); - }); -} - -function getProjects(context) { - const ctx = context || {}; - const cwd = ctx.cwd || process.cwd(); - - return findWorkspacePackages(cwd).then((projects) => { - return projects - .reduce((projects, project) => { - const name = project.name; - - if (name) { - projects.push(name.charAt(0) === '@' ? name.split('/')[1] : name); - } - - return projects; - }, []) - .sort(); - }); -} diff --git a/@commitlint/config-pnpm-scopes/index.test.js b/@commitlint/config-pnpm-scopes/index.test.js deleted file mode 100644 index 8607209607..0000000000 --- a/@commitlint/config-pnpm-scopes/index.test.js +++ /dev/null @@ -1,76 +0,0 @@ -import {test, expect} from 'vitest'; -import path from 'path'; -import {fileURLToPath} from 'url'; - -import {npm} from '@commitlint/test'; - -import config from './index.js'; - -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); - -test('exports rules key', () => { - expect(config).toHaveProperty('rules'); -}); - -test('rules hold object', () => { - expect(config).toMatchObject({ - rules: expect.any(Object), - }); -}); - -test('rules contain scope-enum', () => { - expect(config).toMatchObject({ - rules: { - 'scope-enum': expect.anything(), - }, - }); -}); - -test('scope-enum is function', () => { - expect(config).toMatchObject({ - rules: { - 'scope-enum': expect.any(Function), - }, - }); -}); - -test('scope-enum does not throw for missing context', async () => { - const {'scope-enum': fn} = config.rules; - await expect(fn()).resolves.toBeTruthy(); -}); - -test('scope-enum has expected severity', async () => { - const {'scope-enum': fn} = config.rules; - const [severity] = await fn(); - expect(severity).toBe(2); -}); - -test('scope-enum has expected modifier', async () => { - const {'scope-enum': fn} = config.rules; - const [, modifier] = await fn(); - expect(modifier).toBe('always'); -}); - -test('returns empty value for empty pnpm repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/empty', __dirname); - const [, , value] = await fn({cwd}); - expect(value).toEqual([]); -}); - -test('returns expected value for basic pnpm repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/basic', __dirname); - - const [, , value] = await fn({cwd}); - expect(value).toEqual(['a', 'b']); -}); - -test('returns expected value for scoped pnpm repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/scoped', __dirname); - - const [, , value] = await fn({cwd}); - - expect(value).toEqual(['a', 'b']); -}); diff --git a/@commitlint/config-pnpm-scopes/index.test.ts b/@commitlint/config-pnpm-scopes/index.test.ts new file mode 100644 index 0000000000..8fd934b3e6 --- /dev/null +++ b/@commitlint/config-pnpm-scopes/index.test.ts @@ -0,0 +1,76 @@ +import { test, expect } from "vitest"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +import { npm } from "@commitlint/test"; + +import config from "./index.js"; + +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); + +test("exports rules key", () => { + expect(config).toHaveProperty("rules"); +}); + +test("rules hold object", () => { + expect(config).toMatchObject({ + rules: expect.any(Object), + }); +}); + +test("rules contain scope-enum", () => { + expect(config).toMatchObject({ + rules: { + "scope-enum": expect.anything(), + }, + }); +}); + +test("scope-enum is function", () => { + expect(config).toMatchObject({ + rules: { + "scope-enum": expect.any(Function), + }, + }); +}); + +test("scope-enum does not throw for missing context", async () => { + const { "scope-enum": fn } = config.rules; + await expect(fn()).resolves.toBeTruthy(); +}); + +test("scope-enum has expected severity", async () => { + const { "scope-enum": fn } = config.rules; + const [severity] = await fn(); + expect(severity).toBe(2); +}); + +test("scope-enum has expected modifier", async () => { + const { "scope-enum": fn } = config.rules; + const [, modifier] = await fn(); + expect(modifier).toBe("always"); +}); + +test("returns global scope for empty pnpm repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/empty", __dirname); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["global"]); +}); + +test("returns expected value for basic pnpm repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/basic", __dirname); + + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["a", "b", "global"]); +}); + +test("returns expected value for scoped pnpm repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/scoped", __dirname); + + const [, , value] = await fn({ cwd }); + + expect(value).toEqual(["a", "b", "global"]); +}); diff --git a/@commitlint/config-pnpm-scopes/index.ts b/@commitlint/config-pnpm-scopes/index.ts new file mode 100644 index 0000000000..10dde7a74c --- /dev/null +++ b/@commitlint/config-pnpm-scopes/index.ts @@ -0,0 +1,85 @@ +import path from "node:path"; + +import fg from "fast-glob"; +import readYamlFileModule from "read-yaml-file"; +import { readExactProjectManifest } from "@pnpm/read-project-manifest"; +const readYamlFile = readYamlFileModule.default; + +export default { + utils: { getProjects }, + rules: { + "scope-enum": (ctx = {}) => + getProjects(ctx).then((packages: any) => [2, "always", packages]), + }, +}; + +function requirePackagesManifest(dir: any) { + return readYamlFile(path.join(dir, "pnpm-workspace.yaml")).catch( + (err: any) => { + if (err.code === "ENOENT") { + return null; + } + + throw err; + }, + ); +} + +function normalizePatterns(patterns: any) { + const normalizedPatterns = []; + for (const pattern of patterns) { + normalizedPatterns.push(pattern.replace(/\/?$/, "/package.json")); + normalizedPatterns.push(pattern.replace(/\/?$/, "/package.json5")); + normalizedPatterns.push(pattern.replace(/\/?$/, "/package.yaml")); + } + return normalizedPatterns; +} + +function findWorkspacePackages(cwd: any) { + return requirePackagesManifest(cwd) + .then((manifest: any) => { + const patterns = normalizePatterns( + (manifest && manifest.packages) || ["**"], + ); + const opts = { + cwd, + ignore: ["**/node_modules/**", "**/bower_components/**"], + }; + + return fg(patterns, opts); + }) + .then((entries: any) => { + const paths = Array.from( + new Set(entries.map((entry: any) => path.join(cwd, entry))), + ); + + return Promise.all( + paths.map((manifestPath: any) => + readExactProjectManifest(manifestPath), + ), + ); + }) + .then((manifests: any) => { + return manifests.map((manifest: any) => manifest.manifest); + }); +} + +function getProjects(context: any) { + const ctx = context || {}; + const cwd = ctx.cwd || process.cwd(); + + return findWorkspacePackages(cwd).then((projects: any) => { + const scopes = projects.reduce((acc: any, project: any) => { + const name = project.name; + + if (name) { + acc.add(name.charAt(0) === "@" ? name.split("/")[1] : name); + } + + return acc; + }, new Set()); + scopes.add("global"); + + return Array.from(scopes).sort(); + }); +} diff --git a/@commitlint/config-pnpm-scopes/package.json b/@commitlint/config-pnpm-scopes/package.json index 32a81a8ed0..861dffcf97 100644 --- a/@commitlint/config-pnpm-scopes/package.json +++ b/@commitlint/config-pnpm-scopes/package.json @@ -1,13 +1,16 @@ { "name": "@commitlint/config-pnpm-scopes", "type": "module", - "version": "19.5.0", + "version": "20.1.0", "description": "Shareable commitlint config enforcing pnpm workspaces names as scopes", - "main": "index.js", + "main": "dist/index.js", + "types": "dist/index.d.ts", "files": [ - "index.js" + "dist" ], "scripts": { + "build": "tsc", + "test": "jest", "deps": "dep-check", "pkg": "pkg-check" }, @@ -37,7 +40,17 @@ "read-yaml-file": "^2.1.0" }, "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0" - } + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0", + "@types/node": "^18.19.17", + "typescript": "^5.2.2" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/config-pnpm-scopes/tsconfig.json b/@commitlint/config-pnpm-scopes/tsconfig.json new file mode 100644 index 0000000000..dddda3a388 --- /dev/null +++ b/@commitlint/config-pnpm-scopes/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.shared.json", + "compilerOptions": { + "composite": true, + "rootDir": "./", + "outDir": "./dist" + }, + "include": ["*.ts"], + "exclude": ["./dist/**/*"], + "references": [{ "path": "../types" }] +} diff --git a/@commitlint/config-rush-scopes/CHANGELOG.md b/@commitlint/config-rush-scopes/CHANGELOG.md index ec6998b39f..1caf82066a 100644 --- a/@commitlint/config-rush-scopes/CHANGELOG.md +++ b/@commitlint/config-rush-scopes/CHANGELOG.md @@ -3,6 +3,33 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-rush-scopes + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-rush-scopes + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/config-rush-scopes diff --git a/@commitlint/config-rush-scopes/index.js b/@commitlint/config-rush-scopes/index.js index 2a79997cd5..07fc2e1d07 100644 --- a/@commitlint/config-rush-scopes/index.js +++ b/@commitlint/config-rush-scopes/index.js @@ -1,13 +1,13 @@ -import Path from 'path'; -import fs from 'fs/promises'; +import Path from "node:path"; +import fs from "fs/promises"; -import jsonc from 'jsonc'; +import jsonc from "jsonc"; export default { - utils: {getPackages}, + utils: { getPackages }, rules: { - 'scope-enum': (ctx) => - getPackages(ctx).then((packages) => [2, 'always', packages]), + "scope-enum": (ctx) => + getPackages(ctx).then((packages) => [2, "always", packages]), }, }; @@ -18,15 +18,15 @@ function getPackages(context) { const cwd = ctx.cwd || process.cwd(); return fs - .readFile(Path.join(cwd, 'rush.json'), {encoding: 'utf8'}) + .readFile(Path.join(cwd, "rush.json"), { encoding: "utf8" }) .then((content) => jsonc.parse(content)) - .then(({projects}) => projects) + .then(({ projects }) => projects) .catch(() => []); }) .then((packages) => { return packages .map((pkg) => pkg.packageName) .filter(Boolean) - .map((name) => (name.charAt(0) === '@' ? name.split('/')[1] : name)); + .map((name) => (name.charAt(0) === "@" ? name.split("/")[1] : name)); }); } diff --git a/@commitlint/config-rush-scopes/index.test.js b/@commitlint/config-rush-scopes/index.test.js index 2eb65bdf84..a5ce89033e 100644 --- a/@commitlint/config-rush-scopes/index.test.js +++ b/@commitlint/config-rush-scopes/index.test.js @@ -1,76 +1,76 @@ -import {test, expect} from 'vitest'; -import path from 'path'; -import {fileURLToPath} from 'url'; +import { test, expect } from "vitest"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; -import {npm} from '@commitlint/test'; +import { npm } from "@commitlint/test"; -import config from './index.js'; +import config from "./index.js"; -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); -test('exports rules key', () => { - expect(config).toHaveProperty('rules'); +test("exports rules key", () => { + expect(config).toHaveProperty("rules"); }); -test('rules hold object', () => { +test("rules hold object", () => { expect(config).toMatchObject({ rules: expect.any(Object), }); }); -test('rules contain scope-enum', () => { +test("rules contain scope-enum", () => { expect(config).toMatchObject({ rules: { - 'scope-enum': expect.anything(), + "scope-enum": expect.anything(), }, }); }); -test('scope-enum is function', () => { +test("scope-enum is function", () => { expect(config).toMatchObject({ rules: { - 'scope-enum': expect.any(Function), + "scope-enum": expect.any(Function), }, }); }); -test('scope-enum does not throw for missing context', async () => { - const {'scope-enum': fn} = config.rules; +test("scope-enum does not throw for missing context", async () => { + const { "scope-enum": fn } = config.rules; await expect(fn()).resolves.toBeTruthy(); }); -test('scope-enum has expected severity', async () => { - const {'scope-enum': fn} = config.rules; +test("scope-enum has expected severity", async () => { + const { "scope-enum": fn } = config.rules; const [severity] = await fn(); expect(severity).toBe(2); }); -test('scope-enum has expected modifier', async () => { - const {'scope-enum': fn} = config.rules; +test("scope-enum has expected modifier", async () => { + const { "scope-enum": fn } = config.rules; const [, modifier] = await fn(); - expect(modifier).toBe('always'); + expect(modifier).toBe("always"); }); -test('returns empty value for empty rush repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/empty', __dirname); - const [, , value] = await fn({cwd}); +test("returns empty value for empty rush repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/empty", __dirname); + const [, , value] = await fn({ cwd }); expect(value).toEqual([]); }); -test('returns expected value for basic rush repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/basic', __dirname); +test("returns expected value for basic rush repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/basic", __dirname); - const [, , value] = await fn({cwd}); - expect(value).toEqual(['a', 'b']); + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["a", "b"]); }); -test('returns expected value for scoped lerna repository', async () => { - const {'scope-enum': fn} = config.rules; - const cwd = await npm.bootstrap('fixtures/scoped', __dirname); +test("returns expected value for scoped lerna repository", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/scoped", __dirname); - const [, , value] = await fn({cwd}); + const [, , value] = await fn({ cwd }); - expect(value).toEqual(['a', 'b']); + expect(value).toEqual(["a", "b"]); }); diff --git a/@commitlint/config-rush-scopes/package.json b/@commitlint/config-rush-scopes/package.json index 62a9283dc0..cf0b0136f8 100644 --- a/@commitlint/config-rush-scopes/package.json +++ b/@commitlint/config-rush-scopes/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/config-rush-scopes", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Shareable commitlint config enforcing rush package and workspace names as scopes", "main": "index.js", "files": [ @@ -38,7 +38,8 @@ "jsonc": "^2.0.0" }, "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0" - } + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0" + }, + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/config-validator/CHANGELOG.md b/@commitlint/config-validator/CHANGELOG.md index aaf0d34413..070307d41e 100644 --- a/@commitlint/config-validator/CHANGELOG.md +++ b/@commitlint/config-validator/CHANGELOG.md @@ -3,6 +3,33 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-validator + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-validator + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/config-validator diff --git a/@commitlint/config-validator/package.json b/@commitlint/config-validator/package.json index bc0432d798..567436d46c 100644 --- a/@commitlint/config-validator/package.json +++ b/@commitlint/config-validator/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/config-validator", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "config validator for commitlint.config.js", "main": "lib/validate.js", "types": "lib/validate.d.ts", @@ -36,11 +36,11 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, "dependencies": { - "@commitlint/types": "^19.5.0", + "@commitlint/types": "^20.0.0", "ajv": "^8.11.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/config-validator/src/commitlint.schema.json b/@commitlint/config-validator/src/commitlint.schema.json index 12998f4f49..2c6d2075a9 100644 --- a/@commitlint/config-validator/src/commitlint.schema.json +++ b/@commitlint/config-validator/src/commitlint.schema.json @@ -39,25 +39,25 @@ "oneOf": [ { "type": "array", - "items": {"type": "string"} + "items": { "type": "string" } }, - {"type": "string"} + { "type": "string" } ] }, "parserPreset": { "description": "Resolveable id to conventional-changelog parser preset to import and use", "oneOf": [ - {"type": "string"}, + { "type": "string" }, { "type": "object", "properties": { - "name": {"type": "string"}, - "path": {"type": "string"}, + "name": { "type": "string" }, + "path": { "type": "string" }, "parserOpts": {} }, "additionalProperties": true }, - {"typeof": "function"} + { "typeof": "function" } ] }, "helpUrl": { @@ -71,15 +71,15 @@ "rules": { "description": "Rules to check against", "type": "object", - "propertyNames": {"type": "string"}, - "additionalProperties": {"$ref": "#/definitions/rule"} + "propertyNames": { "type": "string" }, + "additionalProperties": { "$ref": "#/definitions/rule" } }, "plugins": { "description": "Resolveable ids of commitlint plugins from node_modules", "type": "array", "items": { "anyOf": [ - {"type": "string"}, + { "type": "string" }, { "type": "object", "required": ["rules"], @@ -94,7 +94,7 @@ }, "ignores": { "type": "array", - "items": {"typeof": "function"}, + "items": { "typeof": "function" }, "description": "Additional commits to ignore, defined by ignore matchers" }, "defaultIgnores": { diff --git a/@commitlint/config-validator/src/formatErrors.ts b/@commitlint/config-validator/src/formatErrors.ts index 3ca61d39a9..1021c92eb8 100644 --- a/@commitlint/config-validator/src/formatErrors.ts +++ b/@commitlint/config-validator/src/formatErrors.ts @@ -1,4 +1,4 @@ -import type {ErrorObject} from 'ajv'; +import type { ErrorObject } from "ajv"; /** * Formats an array of schema validation errors. @@ -10,8 +10,8 @@ export function formatErrors(errors: ErrorObject[]): string { return errors .map((error) => { if ( - error.keyword === 'additionalProperties' && - 'additionalProperty' in error.params + error.keyword === "additionalProperties" && + "additionalProperty" in error.params ) { const formattedPropertyPath = error.instancePath.length ? `${error.instancePath.slice(1)}.${error.params.additionalProperty}` @@ -19,7 +19,7 @@ export function formatErrors(errors: ErrorObject[]): string { return `Unexpected top-level property "${formattedPropertyPath}"`; } - if (error.keyword === 'type') { + if (error.keyword === "type") { const formattedField = error.instancePath.slice(1); if (!formattedField) { return `Config has the wrong type - ${error.message}`; @@ -27,19 +27,19 @@ export function formatErrors(errors: ErrorObject[]): string { return `Property "${formattedField}" has the wrong type - ${error.message}`; } const field = - (error.instancePath[0] === '.' + (error.instancePath[0] === "." ? error.instancePath.slice(1) - : error.instancePath) || 'Config'; - if (error.keyword === 'typeof') { + : error.instancePath) || "Config"; + if (error.keyword === "typeof") { return `"${field}" should be a ${error.schema}. Value: ${JSON.stringify( - error.data + error.data, )}`; } return `"${field}" ${error.message}. Value: ${JSON.stringify( - error.data + error.data, )}`; }) .map((message) => `\t- ${message}.\n`) - .join(''); + .join(""); } diff --git a/@commitlint/config-validator/src/validate.test.ts b/@commitlint/config-validator/src/validate.test.ts index f8e61e069c..1a3c402c4b 100644 --- a/@commitlint/config-validator/src/validate.test.ts +++ b/@commitlint/config-validator/src/validate.test.ts @@ -1,75 +1,75 @@ -import {describe, test, expect} from 'vitest'; -import {RuleConfigSeverity, UserConfig} from '@commitlint/types'; +import { describe, test, expect } from "vitest"; +import { RuleConfigSeverity, UserConfig } from "@commitlint/types"; -import {validateConfig} from './validate.js'; +import { validateConfig } from "./validate.js"; const validSchemas: Record<string, UserConfig> = { empty: {}, - withEmptyExtends: {extends: []}, - withStringExtends: {extends: 'test'}, - withSingleExtends: {extends: ['test']}, - withMultipleExtends: {extends: ['test', 'test2']}, - withFormatter: {formatter: ''}, - withHelpUrl: {helpUrl: ''}, + withEmptyExtends: { extends: [] }, + withStringExtends: { extends: "test" }, + withSingleExtends: { extends: ["test"] }, + withMultipleExtends: { extends: ["test", "test2"] }, + withFormatter: { formatter: "" }, + withHelpUrl: { helpUrl: "" }, withRules: { rules: { a: [RuleConfigSeverity.Disabled], - b: [RuleConfigSeverity.Warning, 'never'], - c: [RuleConfigSeverity.Error, 'never', true], + b: [RuleConfigSeverity.Warning, "never"], + c: [RuleConfigSeverity.Error, "never", true], }, }, - withParserPresetString: {parserPreset: 'test'}, - withParserPresetObject: {parserPreset: {}}, - withParserPresetObject2: {parserPreset: {name: 'string', path: 'string'}}, + withParserPresetString: { parserPreset: "test" }, + withParserPresetObject: { parserPreset: {} }, + withParserPresetObject2: { parserPreset: { name: "string", path: "string" } }, withParserPresetObjectPromise: { - parserPreset: Promise.resolve({name: 'string'}), + parserPreset: Promise.resolve({ name: "string" }), }, - withParserPresetOpts: {parserPreset: {parserOpts: {test: 1}}}, + withParserPresetOpts: { parserPreset: { parserOpts: { test: 1 } } }, withParserPresetOptsPromise: { - parserPreset: {parserOpts: Promise.resolve({test: 1})}, + parserPreset: { parserOpts: Promise.resolve({ test: 1 }) }, }, - withEmptyIgnores: {ignores: []}, - withIgnores: {ignores: [() => true]}, - withDefaultIgnoresTrue: {defaultIgnores: true}, - withDefaultIgnoresFalse: {defaultIgnores: false}, - withEmptyPlugins: {plugins: []}, - withPluginsAsString: {plugins: ['test']}, - withPluginsAsObject: {plugins: [{rules: {}}]}, - shouldSkipAllowAdditionalProperties: {foo: 1}, + withEmptyIgnores: { ignores: [] }, + withIgnores: { ignores: [() => true] }, + withDefaultIgnoresTrue: { defaultIgnores: true }, + withDefaultIgnoresFalse: { defaultIgnores: false }, + withEmptyPlugins: { plugins: [] }, + withPluginsAsString: { plugins: ["test"] }, + withPluginsAsObject: { plugins: [{ rules: {} }] }, + shouldSkipAllowAdditionalProperties: { foo: 1 }, }; const invalidSchemas: Record<string, any> = { whenConfigIsNotObject: [], - whenConfigIsNotObject2: '', - extendsAsObject: {extends: {test: 1}}, - extendsWithFunction: {extends: [() => true]}, - formatterAsObject: {formatter: {}}, - helpUrlAsArray: {helpUrl: []}, - rulesAsArray: {rules: ['a']}, - rules1: {rules: {a: [3]}}, - rules2: {rules: {b: [1, 'test', 2, 2]}}, - rules3: {rules: {c: []}}, - rules4: {rules: {d: [[], [], []]}}, - rules5: {rules: {e: {}}}, - parserPreset: {parserPreset: []}, - ignoresFunction: {ignores: () => true}, - ignoresNotFunction: {ignores: [1]}, - defaultIgnoresNotBoolean: {defaultIgnores: 'true'}, - pluginsNotArray: {plugins: 'test'}, - withPluginsAsObject: {plugins: [{}]}, - helpUrlNotString: {helpUrl: {}}, + whenConfigIsNotObject2: "", + extendsAsObject: { extends: { test: 1 } }, + extendsWithFunction: { extends: [() => true] }, + formatterAsObject: { formatter: {} }, + helpUrlAsArray: { helpUrl: [] }, + rulesAsArray: { rules: ["a"] }, + rules1: { rules: { a: [3] } }, + rules2: { rules: { b: [1, "test", 2, 2] } }, + rules3: { rules: { c: [] } }, + rules4: { rules: { d: [[], [], []] } }, + rules5: { rules: { e: {} } }, + parserPreset: { parserPreset: [] }, + ignoresFunction: { ignores: () => true }, + ignoresNotFunction: { ignores: [1] }, + defaultIgnoresNotBoolean: { defaultIgnores: "true" }, + pluginsNotArray: { plugins: "test" }, + withPluginsAsObject: { plugins: [{}] }, + helpUrlNotString: { helpUrl: {} }, }; -describe('validation should pass for', () => { - test.each(Object.entries(validSchemas))('%s', (file, config) => { +describe("validation should pass for", () => { + test.each(Object.entries(validSchemas))("%s", (file, config) => { expect(() => validateConfig(`${file}.js`, config)).not.toThrow(); }); }); -describe('validation should fail for', () => { - test.each(Object.entries(invalidSchemas))('%s', (file, config) => { +describe("validation should fail for", () => { + test.each(Object.entries(invalidSchemas))("%s", (file, config) => { expect(() => - validateConfig(`${file}.js`, config) + validateConfig(`${file}.js`, config), ).toThrowErrorMatchingSnapshot(); }); }); diff --git a/@commitlint/config-validator/src/validate.ts b/@commitlint/config-validator/src/validate.ts index 47867a3bf7..d4c28a2c7a 100644 --- a/@commitlint/config-validator/src/validate.ts +++ b/@commitlint/config-validator/src/validate.ts @@ -1,22 +1,22 @@ -import {createRequire} from 'module'; +import { createRequire } from "node:module"; -import {UserConfig} from '@commitlint/types'; -import _Ajv from 'ajv'; +import { UserConfig } from "@commitlint/types"; +import _Ajv from "ajv"; -import {formatErrors} from './formatErrors.js'; +import { formatErrors } from "./formatErrors.js"; const require = createRequire(import.meta.url); -const schema: typeof import('./commitlint.schema.json') = require('./commitlint.schema.json'); +const schema: typeof import("./commitlint.schema.json") = require("./commitlint.schema.json"); const TYPE_OF = [ - 'undefined', - 'string', - 'number', - 'object', - 'function', - 'boolean', - 'symbol', + "undefined", + "string", + "number", + "object", + "function", + "boolean", + "symbol", ]; // FIXME: https://github.com/ajv-validator/ajv/issues/2132 @@ -24,7 +24,7 @@ const Ajv = _Ajv as unknown as typeof _Ajv.default; export function validateConfig( source: string, - config: unknown + config: unknown, ): asserts config is UserConfig { const ajv = new Ajv({ meta: false, @@ -35,11 +35,11 @@ export function validateConfig( }); ajv.addKeyword({ - keyword: 'typeof', + keyword: "typeof", validate: function typeOfFunc(schema: any, data: any) { return typeof data === schema; }, - metaSchema: {type: 'string', enum: TYPE_OF}, + metaSchema: { type: "string", enum: TYPE_OF }, schema: true, }); @@ -49,8 +49,8 @@ export function validateConfig( if (!isValid && validate.errors && validate.errors.length) { throw new Error( `Commitlint configuration in ${source} is invalid:\n${formatErrors( - validate.errors - )}` + validate.errors, + )}`, ); } } diff --git a/@commitlint/config-validator/tsconfig.json b/@commitlint/config-validator/tsconfig.json index 65f2e6c397..5ef37ea5e3 100644 --- a/@commitlint/config-validator/tsconfig.json +++ b/@commitlint/config-validator/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["./src/**/*.ts", "./src/**/*.json"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], - "references": [{"path": "../types"}] + "references": [{ "path": "../types" }] } diff --git a/@commitlint/config-workspace-scopes/CHANGELOG.md b/@commitlint/config-workspace-scopes/CHANGELOG.md new file mode 100644 index 0000000000..3635a1164f --- /dev/null +++ b/@commitlint/config-workspace-scopes/CHANGELOG.md @@ -0,0 +1,37 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/config-workspace-scopes + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/config-workspace-scopes + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Bug Fixes + +* **config-lerna-scopes:** remove deprecated @lerna/project dependency ([#4284](https://github.com/conventional-changelog/commitlint/issues/4284)) ([f2f78f1](https://github.com/conventional-changelog/commitlint/commit/f2f78f105a32d040d8eb7e340f59a1d50fad9ac0)) + + +### Features + +* **config-workspace-scopes:** add config preset for npm and yarn workspaces ([#4269](https://github.com/conventional-changelog/commitlint/issues/4269)) ([67ff9e8](https://github.com/conventional-changelog/commitlint/commit/67ff9e82c10898757052df1d4233566b0b2cb433)) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) diff --git a/@commitlint/config-lerna-scopes/fixtures/yarn/@packages/a/package.json b/@commitlint/config-workspace-scopes/fixtures/basic/@packages/a/package.json similarity index 100% rename from @commitlint/config-lerna-scopes/fixtures/yarn/@packages/a/package.json rename to @commitlint/config-workspace-scopes/fixtures/basic/@packages/a/package.json diff --git a/@commitlint/config-lerna-scopes/fixtures/yarn/@packages/b/package.json b/@commitlint/config-workspace-scopes/fixtures/basic/@packages/b/package.json similarity index 100% rename from @commitlint/config-lerna-scopes/fixtures/yarn/@packages/b/package.json rename to @commitlint/config-workspace-scopes/fixtures/basic/@packages/b/package.json diff --git a/@commitlint/config-lerna-scopes/fixtures/yarn/package.json b/@commitlint/config-workspace-scopes/fixtures/basic/package.json similarity index 50% rename from @commitlint/config-lerna-scopes/fixtures/yarn/package.json rename to @commitlint/config-workspace-scopes/fixtures/basic/package.json index 086ff7756b..1a28bd53f8 100644 --- a/@commitlint/config-lerna-scopes/fixtures/yarn/package.json +++ b/@commitlint/config-workspace-scopes/fixtures/basic/package.json @@ -1,10 +1,6 @@ { "name": "yarn", "version": "1.0.0", - "devDependencies": { - "lerna": "^4.0.0", - "@lerna/project": "^4.0.0" - }, "workspaces": [ "@packages/*" ] diff --git a/@commitlint/config-workspace-scopes/fixtures/empty/package.json b/@commitlint/config-workspace-scopes/fixtures/empty/package.json new file mode 100644 index 0000000000..a0d311fba7 --- /dev/null +++ b/@commitlint/config-workspace-scopes/fixtures/empty/package.json @@ -0,0 +1,4 @@ +{ + "name": "empty", + "version": "1.0.0" +} diff --git a/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/a/nested-a/package.json b/@commitlint/config-workspace-scopes/fixtures/nested-workspaces/@packages/a/nested-a/package.json similarity index 100% rename from @commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/a/nested-a/package.json rename to @commitlint/config-workspace-scopes/fixtures/nested-workspaces/@packages/a/nested-a/package.json diff --git a/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/b/nested-b/package.json b/@commitlint/config-workspace-scopes/fixtures/nested-workspaces/@packages/b/nested-b/package.json similarity index 100% rename from @commitlint/config-lerna-scopes/fixtures/nested-workspaces/@packages/b/nested-b/package.json rename to @commitlint/config-workspace-scopes/fixtures/nested-workspaces/@packages/b/nested-b/package.json diff --git a/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/package.json b/@commitlint/config-workspace-scopes/fixtures/nested-workspaces/package.json similarity index 52% rename from @commitlint/config-lerna-scopes/fixtures/nested-workspaces/package.json rename to @commitlint/config-workspace-scopes/fixtures/nested-workspaces/package.json index 628cdcdbe0..21e671fb54 100644 --- a/@commitlint/config-lerna-scopes/fixtures/nested-workspaces/package.json +++ b/@commitlint/config-workspace-scopes/fixtures/nested-workspaces/package.json @@ -3,9 +3,5 @@ "version": "1.0.0", "workspaces": [ "@packages/**" - ], - "devDependencies": { - "lerna": "^4.0.0", - "@lerna/project": "^4.0.0" - } + ] } diff --git a/@commitlint/config-workspace-scopes/fixtures/scoped/@packages/a/package.json b/@commitlint/config-workspace-scopes/fixtures/scoped/@packages/a/package.json new file mode 100644 index 0000000000..7ba283037e --- /dev/null +++ b/@commitlint/config-workspace-scopes/fixtures/scoped/@packages/a/package.json @@ -0,0 +1,4 @@ +{ + "name": "@packages/a", + "version": "1.0.0" +} diff --git a/@commitlint/config-workspace-scopes/fixtures/scoped/@packages/b/package.json b/@commitlint/config-workspace-scopes/fixtures/scoped/@packages/b/package.json new file mode 100644 index 0000000000..3fd2cf7616 --- /dev/null +++ b/@commitlint/config-workspace-scopes/fixtures/scoped/@packages/b/package.json @@ -0,0 +1,4 @@ +{ + "name": "@packages/b", + "version": "1.0.0" +} diff --git a/@commitlint/config-workspace-scopes/fixtures/scoped/lerna.json b/@commitlint/config-workspace-scopes/fixtures/scoped/lerna.json new file mode 100644 index 0000000000..8e0ca65b2e --- /dev/null +++ b/@commitlint/config-workspace-scopes/fixtures/scoped/lerna.json @@ -0,0 +1,5 @@ +{ + "lerna": "4", + "version": "1.0.0", + "packages": ["@packages/*"] +} diff --git a/@commitlint/config-workspace-scopes/fixtures/scoped/package.json b/@commitlint/config-workspace-scopes/fixtures/scoped/package.json new file mode 100644 index 0000000000..2d12e9469c --- /dev/null +++ b/@commitlint/config-workspace-scopes/fixtures/scoped/package.json @@ -0,0 +1,7 @@ +{ + "name": "scoped", + "version": "1.0.0", + "workspaces": [ + "@packages/**" + ] +} diff --git a/@commitlint/config-workspace-scopes/index.js b/@commitlint/config-workspace-scopes/index.js new file mode 100644 index 0000000000..e4fc5ea0f3 --- /dev/null +++ b/@commitlint/config-workspace-scopes/index.js @@ -0,0 +1,41 @@ +import { createRequire } from "node:module"; +import Path from "node:path"; + +import { globSync } from "glob"; + +const require = createRequire(import.meta.url); + +export default { + utils: { getPackages }, + rules: { + "scope-enum": (ctx) => + getPackages(ctx).then((packages) => [2, "always", packages]), + }, +}; + +function getPackages(context) { + return Promise.resolve() + .then(() => { + const ctx = context || {}; + const cwd = ctx.cwd || process.cwd(); + + const { workspaces } = require(Path.join(cwd, "package.json")); + if (!Array.isArray(workspaces)) { + // no workspaces configured, skipping + return []; + } + + const wsGlobs = workspaces.flatMap((ws) => { + const path = Path.posix.join(ws, "package.json"); + return globSync(path, { cwd, ignore: ["**/node_modules/**"] }); + }); + + return wsGlobs.sort().map((pJson) => require(Path.join(cwd, pJson))); + }) + .then((packages) => { + return packages + .map((pkg) => pkg.name) + .filter(Boolean) + .map((name) => (name.charAt(0) === "@" ? name.split("/")[1] : name)); + }); +} diff --git a/@commitlint/config-workspace-scopes/index.test.js b/@commitlint/config-workspace-scopes/index.test.js new file mode 100644 index 0000000000..a7d09239a0 --- /dev/null +++ b/@commitlint/config-workspace-scopes/index.test.js @@ -0,0 +1,86 @@ +import { test, expect } from "vitest"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +import { npm } from "@commitlint/test"; + +import config from "./index.js"; + +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); + +test("exports rules key", () => { + expect(config).toHaveProperty("rules"); +}); + +test("rules hold object", () => { + expect(config).toMatchObject({ + rules: expect.any(Object), + }); +}); + +test("rules contain scope-enum", () => { + expect(config).toMatchObject({ + rules: { + "scope-enum": expect.anything(), + }, + }); +}); + +test("scope-enum is function", () => { + expect(config).toMatchObject({ + rules: { + "scope-enum": expect.any(Function), + }, + }); +}); + +test("scope-enum does not throw for missing context", async () => { + const { "scope-enum": fn } = config.rules; + await expect(fn()).resolves.toBeTruthy(); +}); + +test("scope-enum has expected severity", async () => { + const { "scope-enum": fn } = config.rules; + const [severity] = await fn(); + expect(severity).toBe(2); +}); + +test("scope-enum has expected modifier", async () => { + const { "scope-enum": fn } = config.rules; + const [, modifier] = await fn(); + expect(modifier).toBe("always"); +}); + +test("returns empty value for empty workspaces", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/empty", __dirname); + const [, , value] = await fn({ cwd }); + expect(value).toEqual([]); +}); + +test("returns expected value for basic workspaces", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/basic", __dirname); + + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["a", "b"]); +}); + +test("returns expected value for scoped workspaces", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/scoped", __dirname); + + const [, , value] = await fn({ cwd }); + expect(value).toEqual(["a", "b"]); +}); + +test("returns expected value for workspaces has nested packages", async () => { + const { "scope-enum": fn } = config.rules; + const cwd = await npm.bootstrap("fixtures/nested-workspaces", __dirname); + + const [, , value] = await fn({ cwd }); + expect(value).toEqual(expect.arrayContaining(["nested-a", "nested-b"])); + expect(value).toEqual( + expect.not.arrayContaining(["dependency-a", "dependency-b"]), + ); +}); diff --git a/@commitlint/config-workspace-scopes/license.md b/@commitlint/config-workspace-scopes/license.md new file mode 100644 index 0000000000..678b1e6e32 --- /dev/null +++ b/@commitlint/config-workspace-scopes/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2024 - present Jan Biasi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/@commitlint/config-workspace-scopes/package.json b/@commitlint/config-workspace-scopes/package.json new file mode 100644 index 0000000000..d68b65fe6d --- /dev/null +++ b/@commitlint/config-workspace-scopes/package.json @@ -0,0 +1,41 @@ +{ + "name": "@commitlint/config-workspace-scopes", + "type": "module", + "version": "20.0.0", + "description": "Shareable commitlint config enforcing workspace names as scopes", + "main": "index.js", + "scripts": { + "deps": "dep-check", + "pkg": "pkg-check" + }, + "repository": { + "type": "git", + "url": "https://github.com/conventional-changelog/commitlint.git", + "directory": "@commitlint/config-lerna-scopes" + }, + "keywords": [ + "conventional-changelog", + "commitlint", + "commitlint-config", + "npm-workspaces", + "yarn-workspaces" + ], + "author": "Jan Biasi (https://github.com/janbiasi)", + "license": "MIT", + "bugs": { + "url": "https://github.com/conventional-changelog/commitlint/issues" + }, + "homepage": "https://commitlint.js.org/", + "engines": { + "node": ">=v18" + }, + "dependencies": { + "glob": "^10.3.10" + }, + "devDependencies": { + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0", + "@types/glob": "^8.1.0" + }, + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" +} diff --git a/@commitlint/config-workspace-scopes/readme.md b/@commitlint/config-workspace-scopes/readme.md new file mode 100644 index 0000000000..05f70a8826 --- /dev/null +++ b/@commitlint/config-workspace-scopes/readme.md @@ -0,0 +1,47 @@ +# @commitlint/config-workspace-scopes + +Shareable `commitlint` config enforcing workspace names as scopes. +Use with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli). + +## Getting started + +```sh +npm install --save-dev @commitlint/config-workspace-scopes @commitlint/cli +echo "export default {extends: ['@commitlint/config-workspace-scopes']};" > commitlint.config.js +``` + +## Examples + +```text +❯ cat package.json +{ + "workspaces": ["packages/*"] +} + +❯ cat commitlint.config.js +{ + extends: ['@commitlint/config-workspace-scopes'] +} + +❯ tree packages + +packages +├── api +├── app +└── web + +❯ echo "build(api): change something in api's build" | commitlint +⧗ input: build(api): change something in api's build +✔ found 0 problems, 0 warnings + +❯ echo "test(foo): this won't pass" | commitlint +⧗ input: test(foo): this won't pass +✖ scope must be one of [api, app, web] [scope-enum] +✖ found 1 problems, 0 warnings + +❯ echo "ci: do some general maintenance" | commitlint +⧗ input: ci: do some general maintenance +✔ found 0 problems, 0 warnings +``` + +Consult [Rules reference](https://commitlint.js.org/reference/rules) for a list of available rules. diff --git a/@commitlint/core/CHANGELOG.md b/@commitlint/core/CHANGELOG.md index 840a9dd547..51c59d17ca 100644 --- a/@commitlint/core/CHANGELOG.md +++ b/@commitlint/core/CHANGELOG.md @@ -3,6 +3,46 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + +**Note:** Version bump only for package @commitlint/core + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/core + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/core + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/core + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package @commitlint/core + + + + + ## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15) **Note:** Version bump only for package @commitlint/core diff --git a/@commitlint/core/package.json b/@commitlint/core/package.json index d495bb9b93..1407cce57f 100644 --- a/@commitlint/core/package.json +++ b/@commitlint/core/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/core", "type": "module", - "version": "19.6.1", + "version": "20.1.0", "description": "Lint your commit messages", "main": "lib/core.js", "types": "lib/core.d.ts", @@ -36,13 +36,13 @@ }, "license": "MIT", "dependencies": { - "@commitlint/format": "^19.5.0", - "@commitlint/lint": "^19.6.0", - "@commitlint/load": "^19.6.1", - "@commitlint/read": "^19.5.0" + "@commitlint/format": "^20.0.0", + "@commitlint/lint": "^20.0.0", + "@commitlint/load": "^20.1.0", + "@commitlint/read": "^20.0.0" }, "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/core/src/core.ts b/@commitlint/core/src/core.ts index eeee4f41b5..3181e0ac71 100644 --- a/@commitlint/core/src/core.ts +++ b/@commitlint/core/src/core.ts @@ -1,6 +1,6 @@ -import format from '@commitlint/format'; -import load from '@commitlint/load'; -import lint from '@commitlint/lint'; -import read from '@commitlint/read'; +import format from "@commitlint/format"; +import load from "@commitlint/load"; +import lint from "@commitlint/lint"; +import read from "@commitlint/read"; -export {format, load, lint, read}; +export { format, load, lint, read }; diff --git a/@commitlint/cz-commitlint/CHANGELOG.md b/@commitlint/cz-commitlint/CHANGELOG.md index e4d16df15a..7f1b3bc6b8 100644 --- a/@commitlint/cz-commitlint/CHANGELOG.md +++ b/@commitlint/cz-commitlint/CHANGELOG.md @@ -3,6 +3,38 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + +**Note:** Version bump only for package @commitlint/cz-commitlint + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/cz-commitlint + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/cz-commitlint + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/cz-commitlint + + + + + ## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15) **Note:** Version bump only for package @commitlint/cz-commitlint diff --git a/@commitlint/cz-commitlint/index.cjs b/@commitlint/cz-commitlint/index.cjs index df13ed9c83..b5614ae470 100644 --- a/@commitlint/cz-commitlint/index.cjs +++ b/@commitlint/cz-commitlint/index.cjs @@ -1,3 +1,5 @@ +'use strict'; + /** @type {Awaited<typeof import('./lib/index.js')>['prompter']} */ exports.prompter = async (...args) => { (await import('./lib/index.js')).prompter(...args); diff --git a/@commitlint/cz-commitlint/package.json b/@commitlint/cz-commitlint/package.json index 5206961a4a..dd10160dda 100644 --- a/@commitlint/cz-commitlint/package.json +++ b/@commitlint/cz-commitlint/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/cz-commitlint", "type": "module", - "version": "19.6.1", + "version": "20.1.0", "description": "Commitizen adapter using the commitlint.config.js", "main": "./lib/index.js", "exports": { @@ -43,9 +43,9 @@ } }, "dependencies": { - "@commitlint/ensure": "^19.5.0", - "@commitlint/load": "^19.6.1", - "@commitlint/types": "^19.5.0", + "@commitlint/ensure": "^20.0.0", + "@commitlint/load": "^20.1.0", + "@commitlint/types": "^20.0.0", "chalk": "^5.3.0", "lodash.isplainobject": "^4.0.6", "word-wrap": "^1.2.5" @@ -60,5 +60,6 @@ "@types/lodash.isplainobject": "^4.0.8", "commitizen": "^4.2.4", "lodash.isfunction": "^3.0.9" - } + }, + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/cz-commitlint/src/Process.test.ts b/@commitlint/cz-commitlint/src/Process.test.ts index 7c6def0f1e..fefca0c40a 100644 --- a/@commitlint/cz-commitlint/src/Process.test.ts +++ b/@commitlint/cz-commitlint/src/Process.test.ts @@ -1,13 +1,13 @@ -import {describe, test, expect, vi, beforeEach, afterEach} from 'vitest'; +import { describe, test, expect, vi, beforeEach, afterEach } from "vitest"; import { QualifiedRules, RuleConfigSeverity, UserPromptConfig, -} from '@commitlint/types'; -import {Answers, DistinctQuestion} from 'inquirer'; -import isFunction from 'lodash.isfunction'; +} from "@commitlint/types"; +import { Answers, DistinctQuestion } from "inquirer"; +import isFunction from "lodash.isfunction"; -import process from './Process.js'; +import process from "./Process.js"; const mockShowTitle = vi.fn(); const mockShowValidation = vi.fn((message) => message); @@ -15,23 +15,23 @@ const mockShowValidation = vi.fn((message) => message); // mock inquirer const mockPrompt = vi.fn(async function ( questions: DistinctQuestion[], - answers: Answers + answers: Answers, ) { - for (const {name, message, when, filter, validate} of questions) { - if (typeof when !== 'function' || (await when(answers))) { + for (const { name, message, when, filter, validate } of questions) { + if (typeof when !== "function" || (await when(answers))) { const title = message && isFunction(message) ? await message(answers) - : typeof message === 'string' - ? message - : ''; + : typeof message === "string" + ? message + : ""; mockShowTitle(title); const validation = - typeof validate !== 'function' || - (await validate((name && answers[name]) ?? '', answers)); + typeof validate !== "function" || + (await validate((name && answers[name]) ?? "", answers)); - if (typeof validation === 'string') { + if (typeof validation === "string") { mockShowValidation(validation); break; } else if (filter && name && answers[name]) { @@ -53,12 +53,12 @@ function InquirerFactory(answers: Answers) { } const MESSAGES = { - skip: '(press enter to skip)', - max: 'upper %d chars', - min: '%d chars at least', - emptyWarning: '%s can not be empty', - upperLimitWarning: '%s: %s over limit %d', - lowerLimitWarning: '%s: %s below limit %d', + skip: "(press enter to skip)", + max: "upper %d chars", + min: "%d chars at least", + emptyWarning: "%s can not be empty", + upperLimitWarning: "%s: %s over limit %d", + lowerLimitWarning: "%s: %s below limit %d", }; let rules: QualifiedRules; @@ -69,38 +69,38 @@ afterEach(() => { mockShowValidation.mockClear(); }); -describe('conventional-changlog', () => { +describe("conventional-changlog", () => { beforeEach(() => { rules = { - 'body-leading-blank': [RuleConfigSeverity.Warning, 'always'], - 'body-max-line-length': [RuleConfigSeverity.Error, 'always', 100], - 'footer-leading-blank': [RuleConfigSeverity.Warning, 'always'], - 'footer-max-line-length': [RuleConfigSeverity.Error, 'always', 100], - 'header-max-length': [RuleConfigSeverity.Error, 'always', 100], - 'subject-case': [ + "body-leading-blank": [RuleConfigSeverity.Warning, "always"], + "body-max-line-length": [RuleConfigSeverity.Error, "always", 100], + "footer-leading-blank": [RuleConfigSeverity.Warning, "always"], + "footer-max-line-length": [RuleConfigSeverity.Error, "always", 100], + "header-max-length": [RuleConfigSeverity.Error, "always", 100], + "subject-case": [ RuleConfigSeverity.Error, - 'never', - ['sentence-case', 'start-case', 'pascal-case', 'upper-case'], + "never", + ["sentence-case", "start-case", "pascal-case", "upper-case"], ], - 'subject-empty': [RuleConfigSeverity.Error, 'never'], - 'subject-full-stop': [RuleConfigSeverity.Error, 'never', '.'], - 'type-case': [RuleConfigSeverity.Error, 'always', 'lower-case'], - 'type-empty': [RuleConfigSeverity.Error, 'never'], - 'type-enum': [ + "subject-empty": [RuleConfigSeverity.Error, "never"], + "subject-full-stop": [RuleConfigSeverity.Error, "never", "."], + "type-case": [RuleConfigSeverity.Error, "always", "lower-case"], + "type-empty": [RuleConfigSeverity.Error, "never"], + "type-enum": [ RuleConfigSeverity.Error, - 'always', + "always", [ - 'build', - 'chore', - 'ci', - 'docs', - 'feat', - 'fix', - 'perf', - 'refactor', - 'revert', - 'style', - 'test', + "build", + "chore", + "ci", + "docs", + "feat", + "fix", + "perf", + "refactor", + "revert", + "style", + "test", ], ], }; @@ -111,93 +111,93 @@ describe('conventional-changlog', () => { description: "Select the type of change that you're committing:", enum: { feat: { - description: 'A new feature', - title: 'Features', - emoji: '✨', + description: "A new feature", + title: "Features", + emoji: "✨", }, fix: { - description: 'A bug fix', - title: 'Bug Fixes', - emoji: '🐛', + description: "A bug fix", + title: "Bug Fixes", + emoji: "🐛", }, docs: { - description: 'Documentation only changes', - title: 'Documentation', - emoji: '📚', + description: "Documentation only changes", + title: "Documentation", + emoji: "📚", }, style: { description: - 'Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)', - title: 'Styles', - emoji: '💎', + "Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)", + title: "Styles", + emoji: "💎", }, refactor: { description: - 'A code change that neither fixes a bug nor adds a feature', - title: 'Code Refactoring', - emoji: '📦', + "A code change that neither fixes a bug nor adds a feature", + title: "Code Refactoring", + emoji: "📦", }, perf: { - description: 'A code change that improves performance', - title: 'Performance Improvements', - emoji: '🚀', + description: "A code change that improves performance", + title: "Performance Improvements", + emoji: "🚀", }, test: { - description: 'Adding missing tests or correcting existing tests', - title: 'Tests', - emoji: '🚨', + description: "Adding missing tests or correcting existing tests", + title: "Tests", + emoji: "🚨", }, build: { description: - 'Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)', - title: 'Builds', - emoji: '🛠', + "Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)", + title: "Builds", + emoji: "🛠", }, ci: { description: - 'Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)', - title: 'Continuous Integrations', - emoji: '⚙️', + "Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)", + title: "Continuous Integrations", + emoji: "⚙️", }, chore: { description: "Other changes that don't modify src or test files", - title: 'Chores', - emoji: '♻️', + title: "Chores", + emoji: "♻️", }, revert: { - description: 'Reverts a previous commit', - title: 'Reverts', - emoji: '🗑', + description: "Reverts a previous commit", + title: "Reverts", + emoji: "🗑", }, }, }, scope: { description: - 'What is the scope of this change (e.g. component or file name)', + "What is the scope of this change (e.g. component or file name)", }, subject: { description: - 'Write a short, imperative tense description of the change', + "Write a short, imperative tense description of the change", }, body: { - description: 'Provide a longer description of the change', + description: "Provide a longer description of the change", }, isBreaking: { - description: 'Are there any breaking changes?', + description: "Are there any breaking changes?", }, breakingBody: { description: - 'A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself', + "A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself", }, breaking: { - description: 'Describe the breaking changes', + description: "Describe the breaking changes", }, isIssueAffected: { - description: 'Does this change affect any open issues?', + description: "Does this change affect any open issues?", }, issuesBody: { description: - 'If issues are closed, the commit requires a body. Please enter a longer description of the commit itself', + "If issues are closed, the commit requires a body. Please enter a longer description of the commit itself", }, issues: { description: 'Add issue references (e.g. "fix #123", "re #123".)', @@ -205,39 +205,39 @@ describe('conventional-changlog', () => { }, }; }); - test('should process works well', () => { + test("should process works well", () => { const answers = { - type: 'refactor', - scope: 'prompt', - subject: 'refactor prompt based on inquirer', - body: 'inspired by commitizen/cz-conventional-changelog', + type: "refactor", + scope: "prompt", + subject: "refactor prompt based on inquirer", + body: "inspired by commitizen/cz-conventional-changelog", isBreaking: true, - breaking: 'refactor types', + breaking: "refactor types", isIssueAffected: true, - issues: 'https://github.com/conventional-changelog/commitlint/issues/94', + issues: "https://github.com/conventional-changelog/commitlint/issues/94", }; return process(rules, prompts, InquirerFactory(answers)).then( (commitMessage) => { expect(commitMessage).toBe( - 'refactor(prompt): refactor prompt based on inquirer\n\ninspired by commitizen/cz-conventional-changelog\n\nBREAKING CHANGE: refactor types\nhttps://github.com/conventional-changelog/commitlint/issues/94' + "refactor(prompt): refactor prompt based on inquirer\n\ninspired by commitizen/cz-conventional-changelog\n\nBREAKING CHANGE: refactor types\nhttps://github.com/conventional-changelog/commitlint/issues/94", ); - } + }, ); }); - test('should show validation and stop process when subject is empty', () => { + test("should show validation and stop process when subject is empty", () => { const answers = { - type: 'refactor', - scope: 'prompt', - body: 'inspired by commitizen/cz-conventional-changelog', + type: "refactor", + scope: "prompt", + body: "inspired by commitizen/cz-conventional-changelog", isBreaking: true, - breaking: 'refactor types', + breaking: "refactor types", isIssueAffected: true, - issues: 'https://github.com/conventional-changelog/commitlint/issues/94', + issues: "https://github.com/conventional-changelog/commitlint/issues/94", }; return process(rules, prompts, InquirerFactory(answers)).then(() => { expect(mockShowValidation).toHaveBeenCalledWith( - 'subject can not be empty' + "subject can not be empty", ); expect(mockShowTitle).toHaveBeenCalledTimes(3); }); diff --git a/@commitlint/cz-commitlint/src/Process.ts b/@commitlint/cz-commitlint/src/Process.ts index 4023477bff..48ec039d6f 100644 --- a/@commitlint/cz-commitlint/src/Process.ts +++ b/@commitlint/cz-commitlint/src/Process.ts @@ -1,27 +1,27 @@ -import {QualifiedRules, UserPromptConfig} from '@commitlint/types'; -import type {Answers, DistinctQuestion} from 'inquirer'; +import { QualifiedRules, UserPromptConfig } from "@commitlint/types"; +import type { Answers, DistinctQuestion } from "inquirer"; import { combineCommitMessage as combineBody, getQuestions as getBodyQuestions, -} from './SectionBody.js'; +} from "./SectionBody.js"; import { combineCommitMessage as combineFooter, getQuestions as getFooterQuestions, -} from './SectionFooter.js'; +} from "./SectionFooter.js"; import { combineCommitMessage as combineHeader, getQuestions as getHeaderQuestions, -} from './SectionHeader.js'; -import {setPromptConfig} from './store/prompts.js'; -import {setRules} from './store/rules.js'; +} from "./SectionHeader.js"; +import { setPromptConfig } from "./store/prompts.js"; +import { setRules } from "./store/rules.js"; export default async function ( rules: QualifiedRules, prompts: UserPromptConfig, inquirer: { prompt(questions: DistinctQuestion[]): Promise<Answers>; - } + }, ): Promise<string> { setRules(rules); setPromptConfig(prompts); @@ -35,5 +35,5 @@ export default async function ( const body = combineBody(answers); const footer = combineFooter(answers); - return [header, body, footer].filter(Boolean).join('\n'); + return [header, body, footer].filter(Boolean).join("\n"); } diff --git a/@commitlint/cz-commitlint/src/Question.test.ts b/@commitlint/cz-commitlint/src/Question.test.ts index fd9ea3eb7f..d04ba708fb 100644 --- a/@commitlint/cz-commitlint/src/Question.test.ts +++ b/@commitlint/cz-commitlint/src/Question.test.ts @@ -1,19 +1,19 @@ -import {describe, test, expect, vi} from 'vitest'; -import chalk from 'chalk'; -import inquirer, {Answers, InputQuestionOptions} from 'inquirer'; +import { describe, test, expect, vi } from "vitest"; +import chalk from "chalk"; +import inquirer, { Answers, InputQuestionOptions } from "inquirer"; -import Question from './Question.js'; +import Question from "./Question.js"; const MESSAGES = { - skip: '(press enter to skip)', - max: 'upper %d chars', - min: '%d chars at least', - emptyWarning: '%s can not be empty', - upperLimitWarning: '%s: %s over limit %d', - lowerLimitWarning: '%s: %s below limit %d', + skip: "(press enter to skip)", + max: "upper %d chars", + min: "%d chars at least", + emptyWarning: "%s can not be empty", + upperLimitWarning: "%s: %s over limit %d", + lowerLimitWarning: "%s: %s below limit %d", }; const QUESTION_CONFIG = { - title: 'please input', + title: "please input", messages: MESSAGES, }; @@ -22,347 +22,347 @@ const caseFn = (input: string | string[], delimiter?: string) => .map((segment) => segment[0].toUpperCase() + segment.slice(1)) .join(delimiter); -describe('name', () => { - test('should throw error when name is not a meaningful string', () => { +describe("name", () => { + test("should throw error when name is not a meaningful string", () => { expect( () => - new Question('' as any, { + new Question("" as any, { ...QUESTION_CONFIG, - }) + }), ).toThrow(); expect( () => new Question( function () { - return 'scope'; + return "scope"; } as any, { ...QUESTION_CONFIG, - } - ) + }, + ), ).toThrow(); }); - test('should set name when name is valid', () => { + test("should set name when name is valid", () => { expect( - new Question('test' as any, { + new Question("test" as any, { ...QUESTION_CONFIG, - }).question - ).toHaveProperty('name', 'test'); + }).question, + ).toHaveProperty("name", "test"); }); }); -describe('type', () => { +describe("type", () => { test('should return "list" type when enumList is array and multipleSelectDefaultDelimiter is undefined', () => { - const question = new Question('scope', { + const question = new Question("scope", { ...QUESTION_CONFIG, - enumList: ['cli', 'core'], + enumList: ["cli", "core"], }).question; - expect(question).toHaveProperty('type', 'list'); - expect(question).toHaveProperty('choices', ['cli', 'core']); - expect(question).not.toHaveProperty('transformer'); + expect(question).toHaveProperty("type", "list"); + expect(question).toHaveProperty("choices", ["cli", "core"]); + expect(question).not.toHaveProperty("transformer"); }); test('should return "checkbox" type when enumList is array and multipleSelectDefaultDelimiter is defined', () => { - const question = new Question('scope', { + const question = new Question("scope", { ...QUESTION_CONFIG, - enumList: ['cli', 'core'], - multipleSelectDefaultDelimiter: ',', + enumList: ["cli", "core"], + multipleSelectDefaultDelimiter: ",", }).question; - expect(question).toHaveProperty('type', 'checkbox'); - expect(question).toHaveProperty('choices', ['cli', 'core']); - expect(question).not.toHaveProperty('transformer'); + expect(question).toHaveProperty("type", "checkbox"); + expect(question).toHaveProperty("choices", ["cli", "core"]); + expect(question).not.toHaveProperty("transformer"); }); test('should contain "skip" list item when enumList is array and skip is true', () => { - const question = new Question('scope', { + const question = new Question("scope", { ...QUESTION_CONFIG, - enumList: ['cli', 'core'], + enumList: ["cli", "core"], skip: true, }).question; - expect(question).toHaveProperty('type', 'list'); - expect(question).toHaveProperty('choices', [ - 'cli', - 'core', + expect(question).toHaveProperty("type", "list"); + expect(question).toHaveProperty("choices", [ + "cli", + "core", new inquirer.Separator(), { - name: 'empty', - value: '', + name: "empty", + value: "", }, ]); - expect(question).not.toHaveProperty('transformer'); + expect(question).not.toHaveProperty("transformer"); }); test('should return "confirm" type when name is start with "is"', () => { - const question = new Question('isSubmit' as any, { + const question = new Question("isSubmit" as any, { ...QUESTION_CONFIG, }).question; - expect(question).toHaveProperty('type', 'confirm'); - expect(question).not.toHaveProperty('choices'); - expect(question).not.toHaveProperty('transformer'); + expect(question).toHaveProperty("type", "confirm"); + expect(question).not.toHaveProperty("choices"); + expect(question).not.toHaveProperty("transformer"); }); test('should return "input" type in other cases', () => { - const question = new Question('body', { + const question = new Question("body", { ...QUESTION_CONFIG, }).question; - expect(question).toHaveProperty('type', 'input'); - expect(question).not.toHaveProperty('choices'); - expect(question).toHaveProperty('transformer', expect.any(Function)); + expect(question).toHaveProperty("type", "input"); + expect(question).not.toHaveProperty("choices"); + expect(question).toHaveProperty("transformer", expect.any(Function)); }); }); -describe('message', () => { - test('should display title when it is not input', () => { - const question = new Question('body', { +describe("message", () => { + test("should display title when it is not input", () => { + const question = new Question("body", { ...QUESTION_CONFIG, - enumList: ['cli', 'core'], + enumList: ["cli", "core"], }).question; - expect(question).toHaveProperty('message', expect.any(Function)); - expect((question.message as any)()).toBe('please input:'); + expect(question).toHaveProperty("message", expect.any(Function)); + expect((question.message as any)()).toBe("please input:"); }); - test('should display skip hint when it is input and can skip', () => { - const question = new Question('body' as any, { + test("should display skip hint when it is input and can skip", () => { + const question = new Question("body" as any, { ...QUESTION_CONFIG, skip: true, }).question; - expect(question).toHaveProperty('message', expect.any(Function)); + expect(question).toHaveProperty("message", expect.any(Function)); expect((question.message as any)()).toBe( - 'please input (press enter to skip):\n' + "please input (press enter to skip):\n", ); }); - test('should not display skip hint when it is input and without skip string', () => { - const question = new Question('scope', { + test("should not display skip hint when it is input and without skip string", () => { + const question = new Question("scope", { ...QUESTION_CONFIG, messages: {}, skip: true, } as any).question; - expect(question).toHaveProperty('message', expect.any(Function)); - expect((question.message as any)()).toBe('please input:\n'); + expect(question).toHaveProperty("message", expect.any(Function)); + expect((question.message as any)()).toBe("please input:\n"); }); - test('should display upper limit hint when it is input and has max length', () => { - const question = new Question('scope', { + test("should display upper limit hint when it is input and has max length", () => { + const question = new Question("scope", { ...QUESTION_CONFIG, maxLength: 80, } as any).question; - expect(question).toHaveProperty('message', expect.any(Function)); - expect((question.message as any)()).toBe('please input: upper 80 chars\n'); + expect(question).toHaveProperty("message", expect.any(Function)); + expect((question.message as any)()).toBe("please input: upper 80 chars\n"); }); - test('should display lower limit hint when it is input and has min length', () => { - const question = new Question('scope', { + test("should display lower limit hint when it is input and has min length", () => { + const question = new Question("scope", { ...QUESTION_CONFIG, minLength: 10, } as any).question; - expect(question).toHaveProperty('message', expect.any(Function)); + expect(question).toHaveProperty("message", expect.any(Function)); expect((question.message as any)()).toBe( - 'please input: 10 chars at least\n' + "please input: 10 chars at least\n", ); }); - test('should display hints with correct format', () => { - const question = new Question('scope', { + test("should display hints with correct format", () => { + const question = new Question("scope", { ...QUESTION_CONFIG, minLength: 10, maxLength: 80, skip: true, } as any).question; - expect(question).toHaveProperty('message', expect.any(Function)); + expect(question).toHaveProperty("message", expect.any(Function)); expect((question.message as any)()).toBe( - 'please input (press enter to skip): 10 chars at least, upper 80 chars\n' + "please input (press enter to skip): 10 chars at least, upper 80 chars\n", ); }); - test('should execute function beforeQuestionStart when init message', () => { + test("should execute function beforeQuestionStart when init message", () => { const mockFn = vi.fn(); class CustomQuestion extends Question { beforeQuestionStart(answers: Answers): void { mockFn(answers); } } - const question = new CustomQuestion('body', { + const question = new CustomQuestion("body", { ...QUESTION_CONFIG, } as any).question; - expect(question).toHaveProperty('message', expect.any(Function)); + expect(question).toHaveProperty("message", expect.any(Function)); const answers = { - header: 'This is header', - footer: 'This is footer', + header: "This is header", + footer: "This is footer", }; (question.message as any)(answers); expect(mockFn).toHaveBeenCalledWith(answers); }); }); -describe('filter', () => { - test('should auto fix case and full-stop', () => { - const question = new Question('body', { +describe("filter", () => { + test("should auto fix case and full-stop", () => { + const question = new Question("body", { ...QUESTION_CONFIG, caseFn, - fullStopFn: (input: string) => input + '!', + fullStopFn: (input: string) => input + "!", }).question; - expect(question.filter?.('xxxx', {})).toBe('Xxxx!'); + expect(question.filter?.("xxxx", {})).toBe("Xxxx!"); }); - test('should transform each item with same case when input is array', () => { - const question = new Question('body', { + test("should transform each item with same case when input is array", () => { + const question = new Question("body", { ...QUESTION_CONFIG, caseFn, - fullStopFn: (input: string) => input + '!', + fullStopFn: (input: string) => input + "!", }).question; - expect(question.filter?.(['xxxx', 'yyyy'], {})).toBe('Xxxx,Yyyy!'); + expect(question.filter?.(["xxxx", "yyyy"], {})).toBe("Xxxx,Yyyy!"); }); - test('should concat items with multipleSelectDefaultDelimiter when input is array', () => { - const question = new Question('body', { + test("should concat items with multipleSelectDefaultDelimiter when input is array", () => { + const question = new Question("body", { ...QUESTION_CONFIG, caseFn, - fullStopFn: (input: string) => input + '!', - multipleSelectDefaultDelimiter: '|', + fullStopFn: (input: string) => input + "!", + multipleSelectDefaultDelimiter: "|", }).question; - expect(question.filter?.(['xxxx', 'yyyy'], {})).toBe('Xxxx|Yyyy!'); + expect(question.filter?.(["xxxx", "yyyy"], {})).toBe("Xxxx|Yyyy!"); }); - test('should split the string to items when multipleValueDelimiters is defined', () => { - const question = new Question('body', { + test("should split the string to items when multipleValueDelimiters is defined", () => { + const question = new Question("body", { ...QUESTION_CONFIG, caseFn, - fullStopFn: (input: string) => input + '!', + fullStopFn: (input: string) => input + "!", multipleValueDelimiters: /,|\|/g, }).question; - expect(question.filter?.('xxxx,yyyy|zzzz', {})).toBe('Xxxx,Yyyy|Zzzz!'); - expect(question.filter?.('xxxx-yyyy-zzzz', {})).toBe('Xxxx-yyyy-zzzz!'); + expect(question.filter?.("xxxx,yyyy|zzzz", {})).toBe("Xxxx,Yyyy|Zzzz!"); + expect(question.filter?.("xxxx-yyyy-zzzz", {})).toBe("Xxxx-yyyy-zzzz!"); }); - test('should works well when does not pass caseFn/fullStopFn', () => { - const question = new Question('body', { + test("should works well when does not pass caseFn/fullStopFn", () => { + const question = new Question("body", { ...QUESTION_CONFIG, }).question; - expect(question.filter?.('xxxx', {})).toBe('xxxx'); + expect(question.filter?.("xxxx", {})).toBe("xxxx"); }); }); -describe('validate', () => { - test('should display empty warning when can not skip but string is empty', () => { - const question = new Question('body', { +describe("validate", () => { + test("should display empty warning when can not skip but string is empty", () => { + const question = new Question("body", { ...QUESTION_CONFIG, skip: false, }).question; - expect(question.validate?.('')).toBe('body can not be empty'); + expect(question.validate?.("")).toBe("body can not be empty"); }); - test('should ignore empty validation when can skip', () => { - const question = new Question('body', { + test("should ignore empty validation when can skip", () => { + const question = new Question("body", { ...QUESTION_CONFIG, skip: true, }).question; - expect(question.validate?.('')).toBe(true); + expect(question.validate?.("")).toBe(true); }); - test('should display upper limit warning when char count is over upper limit', () => { - const question = new Question('body', { + test("should display upper limit warning when char count is over upper limit", () => { + const question = new Question("body", { ...QUESTION_CONFIG, maxLength: 5, }).question; - expect(question.validate?.('xxxxxx')).toBe('body: body over limit 1'); + expect(question.validate?.("xxxxxx")).toBe("body: body over limit 1"); }); - test('should display lower limit warning when char count is less than lower limit', () => { - const question = new Question('body', { + test("should display lower limit warning when char count is less than lower limit", () => { + const question = new Question("body", { ...QUESTION_CONFIG, minLength: 5, }).question; - expect(question.validate?.('xxx')).toBe('body: body below limit 2'); + expect(question.validate?.("xxx")).toBe("body: body below limit 2"); }); - test('should validate the final submit string', () => { - const question = new Question('body', { + test("should validate the final submit string", () => { + const question = new Question("body", { ...QUESTION_CONFIG, - caseFn: () => '', + caseFn: () => "", skip: false, }).question; - expect(question.validate?.('xxxx')).not.toBe(true); + expect(question.validate?.("xxxx")).not.toBe(true); }); }); -describe('transformer', () => { - test('should auto transform case and full-stop', () => { - const question = new Question('body', { +describe("transformer", () => { + test("should auto transform case and full-stop", () => { + const question = new Question("body", { ...QUESTION_CONFIG, caseFn, - fullStopFn: (input: string) => input + '!', + fullStopFn: (input: string) => input + "!", }).question; expect( - (question as InputQuestionOptions)?.transformer?.('xxxx', {}, {}) - ).toBe('Xxxx!'); + (question as InputQuestionOptions)?.transformer?.("xxxx", {}, {}), + ).toBe("Xxxx!"); }); - test('should char count with green color when in the limit range', () => { - let question = new Question('body', { + test("should char count with green color when in the limit range", () => { + let question = new Question("body", { ...QUESTION_CONFIG, maxLength: 5, }).question; expect( - (question as InputQuestionOptions)?.transformer?.('xxx', {}, {}) + (question as InputQuestionOptions)?.transformer?.("xxx", {}, {}), ).toEqual(chalk.green(`(3) xxx`)); - question = new Question('body', { + question = new Question("body", { ...QUESTION_CONFIG, minLength: 2, }).question; expect( - (question as InputQuestionOptions)?.transformer?.('xxx', {}, {}) + (question as InputQuestionOptions)?.transformer?.("xxx", {}, {}), ).toEqual(chalk.green(`(3) xxx`)); }); - test('should char count with red color when over the limit range', () => { - let question = new Question('body', { + test("should char count with red color when over the limit range", () => { + let question = new Question("body", { ...QUESTION_CONFIG, maxLength: 5, }).question; expect( - (question as InputQuestionOptions)?.transformer?.('xxxxxx', {}, {}) + (question as InputQuestionOptions)?.transformer?.("xxxxxx", {}, {}), ).toEqual(chalk.red(`(6) xxxxxx`)); - question = new Question('body', { + question = new Question("body", { ...QUESTION_CONFIG, minLength: 2, }).question; expect( - (question as InputQuestionOptions)?.transformer?.('x', {}, {}) + (question as InputQuestionOptions)?.transformer?.("x", {}, {}), ).toEqual(chalk.red(`(1) x`)); }); }); -describe('inquirer question', () => { +describe("inquirer question", () => { test('should pass "when" and "default" field to inquirer question', () => { const when = (answers: Answers) => !!answers.header; - const question = new Question('body', { + const question = new Question("body", { ...QUESTION_CONFIG, when, - defaultValue: 'update', + defaultValue: "update", }).question; - expect(question).toHaveProperty('default', 'update'); - expect(question).toHaveProperty('when', when); + expect(question).toHaveProperty("default", "update"); + expect(question).toHaveProperty("when", when); }); }); diff --git a/@commitlint/cz-commitlint/src/Question.ts b/@commitlint/cz-commitlint/src/Question.ts index a641a4436a..c6a7ab24ad 100644 --- a/@commitlint/cz-commitlint/src/Question.ts +++ b/@commitlint/cz-commitlint/src/Question.ts @@ -1,9 +1,13 @@ -import {PromptMessages, PromptName} from '@commitlint/types'; -import chalk from 'chalk'; -import inquirer, {Answers, ChoiceCollection, DistinctQuestion} from 'inquirer'; +import { PromptMessages, PromptName } from "@commitlint/types"; +import chalk from "chalk"; +import inquirer, { + Answers, + ChoiceCollection, + DistinctQuestion, +} from "inquirer"; -import {CaseFn} from './utils/case-fn.js'; -import {FullStopFn} from './utils/full-stop-fn.js'; +import { CaseFn } from "./utils/case-fn.js"; +import { FullStopFn } from "./utils/full-stop-fn.js"; export type QuestionConfig = { title: string; @@ -11,7 +15,7 @@ export type QuestionConfig = { maxLength?: number; minLength?: number; defaultValue?: string; - when?: DistinctQuestion['when']; + when?: DistinctQuestion["when"]; skip?: boolean; enumList?: ChoiceCollection<{ name: string; @@ -49,15 +53,15 @@ export default class Question { minLength, multipleValueDelimiters, multipleSelectDefaultDelimiter, - }: QuestionConfig + }: QuestionConfig, ) { - if (!name || typeof name !== 'string') - throw new Error('Question: name is required'); + if (!name || typeof name !== "string") + throw new Error("Question: name is required"); this._maxLength = maxLength ?? Infinity; this._minLength = minLength ?? 0; this.messages = messages; - this.title = title ?? ''; + this.title = title ?? ""; this.skip = skip ?? false; this.fullStopFn = fullStopFn ?? ((_: string) => _); this.caseFn = @@ -69,25 +73,25 @@ export default class Question { if (enumList && Array.isArray(enumList)) { this._question = { - type: multipleSelectDefaultDelimiter ? 'checkbox' : 'list', + type: multipleSelectDefaultDelimiter ? "checkbox" : "list", choices: skip ? [ ...enumList, new inquirer.Separator(), { - name: 'empty', - value: '', + name: "empty", + value: "", }, - ] + ] : [...enumList], }; } else if (/^is[A-Z]/.test(name)) { this._question = { - type: 'confirm', + type: "confirm", }; } else { this._question = { - type: 'input', + type: "input", transformer: this.transformer.bind(this), }; } @@ -103,7 +107,7 @@ export default class Question { } getMessage(key: string): string { - return this.messages[key] ?? ''; + return this.messages[key] ?? ""; } get question(): Readonly<DistinctQuestion> { @@ -132,19 +136,19 @@ export default class Question { protected validate(input: string): boolean | string { const output = this.filter(input); - const questionName = this.question.name ?? ''; + const questionName = this.question.name ?? ""; if (!this.skip && output.length === 0) { - return this.getMessage('emptyWarning').replace(/%s/g, questionName); + return this.getMessage("emptyWarning").replace(/%s/g, questionName); } if (output.length > this.maxLength) { - return this.getMessage('upperLimitWarning') + return this.getMessage("upperLimitWarning") .replace(/%s/g, questionName) .replace(/%d/g, `${output.length - this.maxLength}`); } if (output.length < this.minLength) { - return this.getMessage('lowerLimitWarning') + return this.getMessage("lowerLimitWarning") .replace(/%s/g, questionName) .replace(/%d/g, `${this.minLength - output.length}`); } @@ -158,13 +162,13 @@ export default class Question { toCased = this.caseFn(input, this.multipleSelectDefaultDelimiter); } else if (this.multipleValueDelimiters) { const segments = input.split(this.multipleValueDelimiters); - const casedString = this.caseFn(segments, ','); - const casedSegments = casedString.split(','); + const casedString = this.caseFn(segments, ","); + const casedSegments = casedString.split(","); toCased = input.replace( - new RegExp(`[^${this.multipleValueDelimiters.source}]+`, 'g'), + new RegExp(`[^${this.multipleValueDelimiters.source}]+`, "g"), (segment) => { return casedSegments[segments.indexOf(segment)]; - } + }, ); } else { toCased = this.caseFn(input); @@ -183,38 +187,38 @@ export default class Question { output.length <= this.maxLength && output.length >= this.minLength ? chalk.green : chalk.red; - return color('(' + output.length + ') ' + output); + return color("(" + output.length + ") " + output); } protected decorateMessage(_answers: Answers): string { if (this.beforeQuestionStart) { this.beforeQuestionStart(_answers); } - if (this.question.type === 'input') { + if (this.question.type === "input") { const countLimitMessage = (() => { const messages = []; - if (this.minLength > 0 && this.getMessage('min')) { + if (this.minLength > 0 && this.getMessage("min")) { messages.push( - this.getMessage('min').replace(/%d/g, this.minLength + '') + this.getMessage("min").replace(/%d/g, this.minLength + ""), ); } - if (this.maxLength < Infinity && this.getMessage('max')) { + if (this.maxLength < Infinity && this.getMessage("max")) { messages.push( - this.getMessage('max').replace(/%d/g, this.maxLength + '') + this.getMessage("max").replace(/%d/g, this.maxLength + ""), ); } - return messages.join(', '); + return messages.join(", "); })(); - const skipMessage = this.skip && this.getMessage('skip'); + const skipMessage = this.skip && this.getMessage("skip"); return ( this.title + - (skipMessage ? ` ${skipMessage}` : '') + - ':' + - (countLimitMessage ? ` ${countLimitMessage}` : '') + - '\n' + (skipMessage ? ` ${skipMessage}` : "") + + ":" + + (countLimitMessage ? ` ${countLimitMessage}` : "") + + "\n" ); } else { return `${this.title}:`; diff --git a/@commitlint/cz-commitlint/src/SectionBody.test.ts b/@commitlint/cz-commitlint/src/SectionBody.test.ts index 5846ff6129..0d7e2bf9c9 100644 --- a/@commitlint/cz-commitlint/src/SectionBody.test.ts +++ b/@commitlint/cz-commitlint/src/SectionBody.test.ts @@ -1,96 +1,96 @@ -import {describe, test, expect} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { describe, test, expect } from "vitest"; +import { RuleConfigSeverity } from "@commitlint/types"; -import {combineCommitMessage, getQuestions} from './SectionBody.js'; -import {setRules} from './store/rules.js'; +import { combineCommitMessage, getQuestions } from "./SectionBody.js"; +import { setRules } from "./store/rules.js"; -describe('getQuestions', () => { - test('should exclude question when body must be empty', () => { +describe("getQuestions", () => { + test("should exclude question when body must be empty", () => { setRules({ - 'body-empty': [RuleConfigSeverity.Error, 'always'], + "body-empty": [RuleConfigSeverity.Error, "always"], }); const questions = getQuestions(); expect(questions).toHaveLength(0); }); - test('should only return body question', () => { + test("should only return body question", () => { setRules({}); const questions = getQuestions(); expect(questions).toHaveLength(1); expect(questions).toEqual([ expect.objectContaining({ - name: 'body', + name: "body", }), ]); }); }); -describe('combineCommitMessage', () => { - test('should wrap message to multi lines when max-line-length set', () => { +describe("combineCommitMessage", () => { + test("should wrap message to multi lines when max-line-length set", () => { setRules({ - 'body-max-line-length': [RuleConfigSeverity.Error, 'always', 10], + "body-max-line-length": [RuleConfigSeverity.Error, "always", 10], }); const commitMessage = combineCommitMessage({ - body: 'This is the body message.', + body: "This is the body message.", }); - expect(commitMessage).toBe('This is\nthe body\nmessage.'); + expect(commitMessage).toBe("This is\nthe body\nmessage."); }); - test('should auto apply leading blank', () => { + test("should auto apply leading blank", () => { setRules({ - 'body-leading-blank': [RuleConfigSeverity.Error, 'always'], + "body-leading-blank": [RuleConfigSeverity.Error, "always"], }); const commitMessage = combineCommitMessage({ - body: 'This is the body message.', + body: "This is the body message.", }); - expect(commitMessage).toBe('\nThis is the body message.'); + expect(commitMessage).toBe("\nThis is the body message."); }); - test('should return correct string when leading-blank and max-line-length both set', () => { + test("should return correct string when leading-blank and max-line-length both set", () => { setRules({ - 'body-max-line-length': [RuleConfigSeverity.Error, 'always', 10], - 'body-leading-blank': [RuleConfigSeverity.Error, 'always'], + "body-max-line-length": [RuleConfigSeverity.Error, "always", 10], + "body-leading-blank": [RuleConfigSeverity.Error, "always"], }); const commitMessage = combineCommitMessage({ - body: 'This is the body message.', + body: "This is the body message.", }); - expect(commitMessage).toBe('\nThis is\nthe body\nmessage.'); + expect(commitMessage).toBe("\nThis is\nthe body\nmessage."); }); - test('should use breakingBody when body message is empty but commit has BREAK CHANGE', () => { + test("should use breakingBody when body message is empty but commit has BREAK CHANGE", () => { setRules({}); const commitMessage = combineCommitMessage({ - breakingBody: 'This is breaking body message.', + breakingBody: "This is breaking body message.", }); - expect(commitMessage).toBe('This is breaking body message.'); + expect(commitMessage).toBe("This is breaking body message."); }); - test('should use issueBody when body message is empty but commit has issue note', () => { + test("should use issueBody when body message is empty but commit has issue note", () => { setRules({}); const commitMessage = combineCommitMessage({ - issuesBody: 'This is issue body message.', + issuesBody: "This is issue body message.", }); - expect(commitMessage).toBe('This is issue body message.'); + expect(commitMessage).toBe("This is issue body message."); }); - test('should use issueBody when body message is empty string but commit has issue note', () => { + test("should use issueBody when body message is empty string but commit has issue note", () => { setRules({}); const commitMessage = combineCommitMessage({ - body: '', - issuesBody: 'This is issue body message.', + body: "", + issuesBody: "This is issue body message.", }); - expect(commitMessage).toBe('This is issue body message.'); + expect(commitMessage).toBe("This is issue body message."); }); - test('should return empty message when body is empty', () => { + test("should return empty message when body is empty", () => { setRules({}); const commitMessage = combineCommitMessage({ - body: '', + body: "", }); - expect(commitMessage).toBe(''); + expect(commitMessage).toBe(""); }); }); diff --git a/@commitlint/cz-commitlint/src/SectionBody.ts b/@commitlint/cz-commitlint/src/SectionBody.ts index 68fa78a433..07f1c22cd0 100644 --- a/@commitlint/cz-commitlint/src/SectionBody.ts +++ b/@commitlint/cz-commitlint/src/SectionBody.ts @@ -1,26 +1,26 @@ -import {Answers, DistinctQuestion} from 'inquirer'; -import wrap from 'word-wrap'; +import { Answers, DistinctQuestion } from "inquirer"; +import wrap from "word-wrap"; -import Question from './Question.js'; -import getRuleQuestionConfig from './services/getRuleQuestionConfig.js'; -import {getRule} from './store/rules.js'; -import getLeadingBlankFn from './utils/leading-blank-fn.js'; -import {getMaxLength} from './utils/rules.js'; +import Question from "./Question.js"; +import getRuleQuestionConfig from "./services/getRuleQuestionConfig.js"; +import { getRule } from "./store/rules.js"; +import getLeadingBlankFn from "./utils/leading-blank-fn.js"; +import { getMaxLength } from "./utils/rules.js"; export function getQuestions(): Array<DistinctQuestion> { // body - const questionConfig = getRuleQuestionConfig('body'); + const questionConfig = getRuleQuestionConfig("body"); if (!questionConfig) return []; - else return [new Question('body', questionConfig).question]; + else return [new Question("body", questionConfig).question]; } export function combineCommitMessage(answers: Answers): string { - const maxLineLength = getMaxLength(getRule('body', 'max-line-length')); - const leadingBlankFn = getLeadingBlankFn(getRule('body', 'leading-blank')); - const {body, breakingBody, issuesBody} = answers; + const maxLineLength = getMaxLength(getRule("body", "max-line-length")); + const leadingBlankFn = getLeadingBlankFn(getRule("body", "leading-blank")); + const { body, breakingBody, issuesBody } = answers; - const commitBody = body || breakingBody || issuesBody || ''; + const commitBody = body || breakingBody || issuesBody || ""; if (commitBody) { return leadingBlankFn( @@ -28,11 +28,11 @@ export function combineCommitMessage(answers: Answers): string { ? wrap(commitBody, { width: maxLineLength, trim: true, - indent: '', - }) - : commitBody.trim() + indent: "", + }) + : commitBody.trim(), ); } else { - return ''; + return ""; } } diff --git a/@commitlint/cz-commitlint/src/SectionFooter.test.ts b/@commitlint/cz-commitlint/src/SectionFooter.test.ts index 6e1c497958..e16c9fadc8 100644 --- a/@commitlint/cz-commitlint/src/SectionFooter.test.ts +++ b/@commitlint/cz-commitlint/src/SectionFooter.test.ts @@ -1,24 +1,24 @@ -import {describe, test, expect, beforeEach} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { describe, test, expect, beforeEach } from "vitest"; +import { RuleConfigSeverity } from "@commitlint/types"; -import {combineCommitMessage, getQuestions} from './SectionFooter.js'; -import {setPromptConfig} from './store/prompts.js'; -import {setRules} from './store/rules.js'; +import { combineCommitMessage, getQuestions } from "./SectionFooter.js"; +import { setPromptConfig } from "./store/prompts.js"; +import { setRules } from "./store/rules.js"; beforeEach(() => { setRules({}); setPromptConfig({}); }); -describe('getQuestions', () => { - test('should only ask questions that listed in prompt question config', () => { +describe("getQuestions", () => { + test("should only ask questions that listed in prompt question config", () => { setPromptConfig({ questions: { footer: { description: - '<footer> holds further meta data, such as breaking changes and issue ids', + "<footer> holds further meta data, such as breaking changes and issue ids", }, issues: { - description: '<issues> link', + description: "<issues> link", }, }, }); @@ -28,19 +28,19 @@ describe('getQuestions', () => { expect(questions).toHaveLength(2); expect(questions).toEqual([ expect.objectContaining({ - name: 'issues', + name: "issues", }), expect.objectContaining({ - name: 'footer', + name: "footer", }), ]); }); - test('should not have break change as default', () => { + test("should not have break change as default", () => { setPromptConfig({ questions: { isBreaking: { - description: 'Are there any breaking changes?', + description: "Are there any breaking changes?", }, }, }); @@ -48,20 +48,20 @@ describe('getQuestions', () => { const questions = getQuestions(); expect(questions).toEqual([ expect.objectContaining({ - name: 'isBreaking', + name: "isBreaking", default: false, }), ]); }); - test('should ask for break change info when have break change', () => { + test("should ask for break change info when have break change", () => { setPromptConfig({ questions: { isBreaking: { - description: 'Are there any breaking changes?', + description: "Are there any breaking changes?", }, breaking: { - description: 'Describe the breaking changes', + description: "Describe the breaking changes", }, }, }); @@ -70,24 +70,24 @@ describe('getQuestions', () => { expect( (questions[1].when as any)({ isBreaking: false, - }) + }), ).toBe(false); expect( (questions[1].when as any)({ isBreaking: true, - }) + }), ).toBe(true); }); - test('should ask for body info when have break change but does not have body message', () => { + test("should ask for body info when have break change but does not have body message", () => { setPromptConfig({ questions: { isBreaking: { - description: 'Describe the breaking changes', + description: "Describe the breaking changes", }, breakingBody: { description: - 'A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself', + "A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself", }, }, }); @@ -97,28 +97,28 @@ describe('getQuestions', () => { expect( (questions[1].when as any)({ isBreaking: true, - }) + }), ).toBe(true); expect( (questions[1].when as any)({ isBreaking: true, - body: 'xxx', - }) + body: "xxx", + }), ).toBe(false); expect( (questions[1].when as any)({ isBreaking: false, - }) + }), ).toBe(false); }); - test('should change does not affect any issues as default', () => { + test("should change does not affect any issues as default", () => { setPromptConfig({ questions: { isIssueAffected: { - description: 'Does this change affect any open issues?', + description: "Does this change affect any open issues?", }, }, }); @@ -126,17 +126,17 @@ describe('getQuestions', () => { const questions = getQuestions(); expect(questions).toEqual([ expect.objectContaining({ - name: 'isIssueAffected', + name: "isIssueAffected", default: false, }), ]); }); - test('should ask for issue info when have issue affected', () => { + test("should ask for issue info when have issue affected", () => { setPromptConfig({ questions: { isIssueAffected: { - description: 'Does this change affect any open issues?', + description: "Does this change affect any open issues?", }, issues: { description: 'Add issue references (e.g. "fix #123", "re #123".)', @@ -148,24 +148,24 @@ describe('getQuestions', () => { expect( (questions[1].when as any)({ isIssueAffected: false, - }) + }), ).toBe(false); expect( (questions[1].when as any)({ isIssueAffected: true, - }) + }), ).toBe(true); }); - test('should ask for body info when have issue affected but does not have body message', () => { + test("should ask for body info when have issue affected but does not have body message", () => { setPromptConfig({ questions: { isIssueAffected: { - description: 'Does this change affect any open issues?', + description: "Does this change affect any open issues?", }, issuesBody: { description: - 'If issues are closed, the commit requires a body. Please enter a longer description of the commit itself', + "If issues are closed, the commit requires a body. Please enter a longer description of the commit itself", }, issues: { description: 'Add issue references (e.g. "fix #123", "re #123".)', @@ -178,139 +178,139 @@ describe('getQuestions', () => { expect( (questions[1].when as any)({ isIssueAffected: true, - }) + }), ).toBe(true); expect( (questions[1].when as any)({ isIssueAffected: true, - body: 'xxx', - }) + body: "xxx", + }), ).toBe(false); expect( (questions[1].when as any)({ isIssueAffected: false, - breaking: 'xxxxx', - }) + breaking: "xxxxx", + }), ).toBe(false); }); }); -describe('combineCommitMessage', () => { +describe("combineCommitMessage", () => { test('should return BreakChange start with "BREAKING CHANGE: "', () => { let commitMessage = combineCommitMessage({ - breaking: 'BREAKING CHANGE: xxxxxx', + breaking: "BREAKING CHANGE: xxxxxx", }); - expect(commitMessage).toBe('BREAKING CHANGE: xxxxxx'); + expect(commitMessage).toBe("BREAKING CHANGE: xxxxxx"); commitMessage = combineCommitMessage({ - breaking: 'xxxxxx', + breaking: "xxxxxx", }); - expect(commitMessage).toBe('BREAKING CHANGE: xxxxxx'); + expect(commitMessage).toBe("BREAKING CHANGE: xxxxxx"); }); - test('should return correct string with BreakChange,issue,footer', () => { + test("should return correct string with BreakChange,issue,footer", () => { const commitMessage = combineCommitMessage({ issues: - 'https://github.com/conventional-changelog/commitlint/issues/2507', - breaking: 'BREAKING CHANGE: xxxxxx', - footer: 'Other footer information.', + "https://github.com/conventional-changelog/commitlint/issues/2507", + breaking: "BREAKING CHANGE: xxxxxx", + footer: "Other footer information.", }); expect(commitMessage).toBe( - 'BREAKING CHANGE: xxxxxx\nhttps://github.com/conventional-changelog/commitlint/issues/2507\nOther footer information.' + "BREAKING CHANGE: xxxxxx\nhttps://github.com/conventional-changelog/commitlint/issues/2507\nOther footer information.", ); }); - test('should return wrap string with footer-max-line-length', () => { + test("should return wrap string with footer-max-line-length", () => { setRules({ - 'footer-max-line-length': [RuleConfigSeverity.Error, 'always', 10], + "footer-max-line-length": [RuleConfigSeverity.Error, "always", 10], }); const commitMessage = combineCommitMessage({ issues: - 'https://github.com/conventional-changelog/commitlint/issues/2507', - breaking: 'BREAKING CHANGE: xxxxxx', - footer: 'Other footer information.', + "https://github.com/conventional-changelog/commitlint/issues/2507", + breaking: "BREAKING CHANGE: xxxxxx", + footer: "Other footer information.", }); expect(commitMessage).toBe( - 'BREAKING\nCHANGE:\nxxxxxx\nhttps://github.com/conventional-changelog/commitlint/issues/2507\nOther\nfooter\ninformation.' + "BREAKING\nCHANGE:\nxxxxxx\nhttps://github.com/conventional-changelog/commitlint/issues/2507\nOther\nfooter\ninformation.", ); }); - test('should auto leading blank when footer-leading-blank is set', () => { + test("should auto leading blank when footer-leading-blank is set", () => { setRules({ - 'footer-max-line-length': [RuleConfigSeverity.Error, 'always', 10], - 'footer-leading-blank': [RuleConfigSeverity.Error, 'always'], + "footer-max-line-length": [RuleConfigSeverity.Error, "always", 10], + "footer-leading-blank": [RuleConfigSeverity.Error, "always"], }); const commitMessage = combineCommitMessage({ issues: - 'https://github.com/conventional-changelog/commitlint/issues/2507', - breaking: 'BREAKING CHANGE: xxxxxx', - footer: 'Other footer information.', + "https://github.com/conventional-changelog/commitlint/issues/2507", + breaking: "BREAKING CHANGE: xxxxxx", + footer: "Other footer information.", }); expect(commitMessage).toBe( - '\nBREAKING\nCHANGE:\nxxxxxx\nhttps://github.com/conventional-changelog/commitlint/issues/2507\nOther\nfooter\ninformation.' + "\nBREAKING\nCHANGE:\nxxxxxx\nhttps://github.com/conventional-changelog/commitlint/issues/2507\nOther\nfooter\ninformation.", ); }); - test('when does not have break change', () => { + test("when does not have break change", () => { const commitMessage = combineCommitMessage({ issues: - 'https://github.com/conventional-changelog/commitlint/issues/2507', - footer: 'Other footer information.', + "https://github.com/conventional-changelog/commitlint/issues/2507", + footer: "Other footer information.", }); expect(commitMessage).toBe( - 'https://github.com/conventional-changelog/commitlint/issues/2507\nOther footer information.' + "https://github.com/conventional-changelog/commitlint/issues/2507\nOther footer information.", ); }); - test('when does not have issue', () => { + test("when does not have issue", () => { const commitMessage = combineCommitMessage({ - footer: 'Other footer information.', + footer: "Other footer information.", }); - expect(commitMessage).toBe('Other footer information.'); + expect(commitMessage).toBe("Other footer information."); }); }); -describe('FooterQuestion', () => { - test('should limited by footer maxLength and minLength', () => { +describe("FooterQuestion", () => { + test("should limited by footer maxLength and minLength", () => { setRules({ - 'footer-max-length': [RuleConfigSeverity.Error, 'always', 30], - 'footer-min-length': [RuleConfigSeverity.Error, 'always', 10], + "footer-max-length": [RuleConfigSeverity.Error, "always", 30], + "footer-min-length": [RuleConfigSeverity.Error, "always", 10], }); setPromptConfig({ messages: { - skip: '(press enter to skip)', - max: 'upper %d chars', - min: '%d chars at least', - emptyWarning: '%s can not be empty', - upperLimitWarning: '%s: %s over limit %d', - lowerLimitWarning: '%s: %s below limit %d', + skip: "(press enter to skip)", + max: "upper %d chars", + min: "%d chars at least", + emptyWarning: "%s can not be empty", + upperLimitWarning: "%s: %s over limit %d", + lowerLimitWarning: "%s: %s below limit %d", }, questions: { breaking: { - description: 'Describe the breaking changes', + description: "Describe the breaking changes", }, issues: { - description: '<issues> link', + description: "<issues> link", }, footer: { description: - '<footer> holds further meta data, such as breaking changes and issue ids', + "<footer> holds further meta data, such as breaking changes and issue ids", }, }, }); const questions = getQuestions(); const answers = { - breaking: 'BREAKING CHANGE: xxxxxx', - issues: ''.padEnd(6, 'y'), + breaking: "BREAKING CHANGE: xxxxxx", + issues: "".padEnd(6, "y"), }; const lastQuestion = questions[2]; (lastQuestion.message as any)(answers); - expect(lastQuestion?.validate?.(''.padEnd(10, 'z'), answers)).toBe( - 'footer: footer over limit 11' + expect(lastQuestion?.validate?.("".padEnd(10, "z"), answers)).toBe( + "footer: footer over limit 11", ); }); }); diff --git a/@commitlint/cz-commitlint/src/SectionFooter.ts b/@commitlint/cz-commitlint/src/SectionFooter.ts index 620bca2d05..f278e226eb 100644 --- a/@commitlint/cz-commitlint/src/SectionFooter.ts +++ b/@commitlint/cz-commitlint/src/SectionFooter.ts @@ -1,13 +1,13 @@ -import {PromptName} from '@commitlint/types'; -import {Answers, DistinctQuestion} from 'inquirer'; -import wrap from 'word-wrap'; +import { PromptName } from "@commitlint/types"; +import { Answers, DistinctQuestion } from "inquirer"; +import wrap from "word-wrap"; -import Question, {QuestionConfig} from './Question.js'; -import getRuleQuestionConfig from './services/getRuleQuestionConfig.js'; -import {getPromptMessages, getPromptQuestions} from './store/prompts.js'; -import {getRule} from './store/rules.js'; -import getLeadingBlankFn from './utils/leading-blank-fn.js'; -import {getMaxLength} from './utils/rules.js'; +import Question, { QuestionConfig } from "./Question.js"; +import getRuleQuestionConfig from "./services/getRuleQuestionConfig.js"; +import { getPromptMessages, getPromptQuestions } from "./store/prompts.js"; +import { getRule } from "./store/rules.js"; +import getLeadingBlankFn from "./utils/leading-blank-fn.js"; +import { getMaxLength } from "./utils/rules.js"; export class FooterQuestion extends Question { footerMaxLength: number; @@ -16,7 +16,7 @@ export class FooterQuestion extends Question { name: PromptName, questionConfig: QuestionConfig, footerMaxLength?: number, - footerMinLength?: number + footerMinLength?: number, ) { super(name, questionConfig); this.footerMaxLength = footerMaxLength ?? Infinity; @@ -24,14 +24,14 @@ export class FooterQuestion extends Question { } beforeQuestionStart(answers: Answers): void { const footerRemainLength = - this.footerMaxLength - combineCommitMessage(answers).length - '\n'.length; + this.footerMaxLength - combineCommitMessage(answers).length - "\n".length; this.maxLength = Math.min(this.maxLength, footerRemainLength); this.minLength = Math.min(this.minLength, this.footerMinLength); } } export function getQuestions(): Array<DistinctQuestion> { - const footerQuestionConfig = getRuleQuestionConfig('footer'); + const footerQuestionConfig = getRuleQuestionConfig("footer"); if (!footerQuestionConfig) return []; @@ -39,13 +39,13 @@ export function getQuestions(): Array<DistinctQuestion> { const footerMinLength = footerQuestionConfig.minLength; const fields: PromptName[] = [ - 'isBreaking', - 'breakingBody', - 'breaking', - 'isIssueAffected', - 'issuesBody', - 'issues', - 'footer', + "isBreaking", + "breakingBody", + "breaking", + "isIssueAffected", + "issuesBody", + "issues", + "footer", ]; return fields @@ -54,19 +54,19 @@ export function getQuestions(): Array<DistinctQuestion> { const questions = getPromptQuestions(); const questionConfigs = { - title: questions[name]?.description ?? '', + title: questions[name]?.description ?? "", messages: getPromptMessages(), footerMaxLength, footerMinLength, }; - if (name === 'isBreaking') { + if (name === "isBreaking") { Object.assign(questionConfigs, { defaultValue: false, }); } - if (name === 'breakingBody') { + if (name === "breakingBody") { Object.assign(questionConfigs, { when: (answers: Answers) => { return answers.isBreaking && !answers.body; @@ -74,7 +74,7 @@ export function getQuestions(): Array<DistinctQuestion> { }); } - if (name === 'breaking') { + if (name === "breaking") { Object.assign(questionConfigs, { when: (answers: Answers) => { return answers.isBreaking; @@ -82,13 +82,13 @@ export function getQuestions(): Array<DistinctQuestion> { }); } - if (name === 'isIssueAffected') { + if (name === "isIssueAffected") { Object.assign(questionConfigs, { defaultValue: false, }); } - if (name === 'issuesBody') { + if (name === "issuesBody") { Object.assign(questionConfigs, { when: (answers: Answers) => { return ( @@ -98,7 +98,7 @@ export function getQuestions(): Array<DistinctQuestion> { }); } - if (name === 'issues') { + if (name === "issues") { Object.assign(questionConfigs, { when: (answers: Answers) => { return answers.isIssueAffected; @@ -106,7 +106,7 @@ export function getQuestions(): Array<DistinctQuestion> { }); } - if (name === 'footer') { + if (name === "footer") { Object.assign(questionConfigs, { ...footerQuestionConfig, }); @@ -116,7 +116,7 @@ export function getQuestions(): Array<DistinctQuestion> { name, questionConfigs, footerMaxLength, - footerMinLength + footerMinLength, ); return instance.question; @@ -126,24 +126,24 @@ export function getQuestions(): Array<DistinctQuestion> { export function combineCommitMessage(answers: Answers): string { // TODO references-empty // TODO signed-off-by - const maxLineLength = getMaxLength(getRule('footer', 'max-line-length')); - const leadingBlankFn = getLeadingBlankFn(getRule('footer', 'leading-blank')); + const maxLineLength = getMaxLength(getRule("footer", "max-line-length")); + const leadingBlankFn = getLeadingBlankFn(getRule("footer", "leading-blank")); - const {footer, breaking, issues} = answers; + const { footer, breaking, issues } = answers; const footerNotes: string[] = []; if (breaking) { - const BREAKING_CHANGE = 'BREAKING CHANGE: '; + const BREAKING_CHANGE = "BREAKING CHANGE: "; const message = - BREAKING_CHANGE + breaking.replace(new RegExp(`^${BREAKING_CHANGE}`), ''); + BREAKING_CHANGE + breaking.replace(new RegExp(`^${BREAKING_CHANGE}`), ""); footerNotes.push( maxLineLength < Infinity ? wrap(message, { width: maxLineLength, trim: true, - indent: '', - }) - : message.trim() + indent: "", + }) + : message.trim(), ); } @@ -153,9 +153,9 @@ export function combineCommitMessage(answers: Answers): string { ? wrap(issues, { width: maxLineLength, trim: true, - indent: '', - }) - : issues.trim() + indent: "", + }) + : issues.trim(), ); } @@ -165,11 +165,11 @@ export function combineCommitMessage(answers: Answers): string { ? wrap(footer, { width: maxLineLength, trim: true, - indent: '', - }) - : footer + indent: "", + }) + : footer, ); } - return leadingBlankFn(footerNotes.join('\n')); + return leadingBlankFn(footerNotes.join("\n")); } diff --git a/@commitlint/cz-commitlint/src/SectionHeader.test.ts b/@commitlint/cz-commitlint/src/SectionHeader.test.ts index 5ff96f2c83..350c1fe746 100644 --- a/@commitlint/cz-commitlint/src/SectionHeader.test.ts +++ b/@commitlint/cz-commitlint/src/SectionHeader.test.ts @@ -1,156 +1,156 @@ -import {describe, test, expect, beforeEach} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { describe, test, expect, beforeEach } from "vitest"; +import { RuleConfigSeverity } from "@commitlint/types"; import { combineCommitMessage, getQuestions, getQuestionConfig, -} from './SectionHeader.js'; -import {setPromptConfig} from './store/prompts.js'; -import {setRules} from './store/rules.js'; +} from "./SectionHeader.js"; +import { setPromptConfig } from "./store/prompts.js"; +import { setRules } from "./store/rules.js"; beforeEach(() => { setRules({}); setPromptConfig({}); }); -describe('getQuestions', () => { +describe("getQuestions", () => { test("should contain 'type','scope','subject'", () => { const questions = getQuestions(); expect(questions).toHaveLength(3); expect(questions).toEqual([ expect.objectContaining({ - name: 'type', + name: "type", }), expect.objectContaining({ - name: 'scope', + name: "scope", }), expect.objectContaining({ - name: 'subject', + name: "subject", }), ]); }); - test('should exclude question when must be empty', () => { + test("should exclude question when must be empty", () => { setRules({ - 'scope-empty': [RuleConfigSeverity.Error, 'always'], + "scope-empty": [RuleConfigSeverity.Error, "always"], }); const questions = getQuestions(); expect(questions).toHaveLength(2); expect(questions).toEqual([ expect.objectContaining({ - name: 'type', + name: "type", }), expect.objectContaining({ - name: 'subject', + name: "subject", }), ]); }); }); -describe('getQuestionConfig', () => { +describe("getQuestionConfig", () => { test("should 'scope' supports multiple items separated with ',\\/'", () => { - const config = getQuestionConfig('scope'); + const config = getQuestionConfig("scope"); expect(config).toEqual( expect.objectContaining({ multipleValueDelimiters: /\/|\\|,/g, - }) + }), ); }); test("should 'scope' supports multiple select separated with settings.scopeEnumSeparator and enableMultipleScopes", () => { setPromptConfig({ settings: { - scopeEnumSeparator: '/', + scopeEnumSeparator: "/", enableMultipleScopes: true, }, }); - const config = getQuestionConfig('scope'); + const config = getQuestionConfig("scope"); expect(config).toEqual( expect.objectContaining({ - multipleSelectDefaultDelimiter: '/', - }) + multipleSelectDefaultDelimiter: "/", + }), ); }); test("should 'scope' disable multiple select by default", () => { - const config = getQuestionConfig('scope'); - expect(config).not.toContain('multipleSelectDefaultDelimiter'); + const config = getQuestionConfig("scope"); + expect(config).not.toContain("multipleSelectDefaultDelimiter"); }); }); -describe('combineCommitMessage', () => { - test('should return correct string when type,scope,subject are not empty', () => { +describe("combineCommitMessage", () => { + test("should return correct string when type,scope,subject are not empty", () => { const commitMessage = combineCommitMessage({ - type: 'build', - scope: 'typescript', - subject: 'update tsconfig.json', + type: "build", + scope: "typescript", + subject: "update tsconfig.json", }); - expect(commitMessage).toBe('build(typescript): update tsconfig.json'); + expect(commitMessage).toBe("build(typescript): update tsconfig.json"); }); - test('when type is empty', () => { + test("when type is empty", () => { let commitMessage = combineCommitMessage({ - scope: 'typescript', - subject: 'update tsconfig.json', + scope: "typescript", + subject: "update tsconfig.json", }); - expect(commitMessage).toBe('(typescript): update tsconfig.json'); + expect(commitMessage).toBe("(typescript): update tsconfig.json"); commitMessage = combineCommitMessage({ - scope: 'typescript', + scope: "typescript", }); - expect(commitMessage).toBe('(typescript)'); + expect(commitMessage).toBe("(typescript)"); }); - test('when scope is empty', () => { + test("when scope is empty", () => { let commitMessage = combineCommitMessage({ - type: 'build', - subject: 'update tsconfig.json', + type: "build", + subject: "update tsconfig.json", }); - expect(commitMessage).toBe('build: update tsconfig.json'); + expect(commitMessage).toBe("build: update tsconfig.json"); commitMessage = combineCommitMessage({ - subject: 'update tsconfig.json', + subject: "update tsconfig.json", }); - expect(commitMessage).toBe('update tsconfig.json'); + expect(commitMessage).toBe("update tsconfig.json"); }); - test('when subject is empty', () => { + test("when subject is empty", () => { const commitMessage = combineCommitMessage({ - type: 'build', - scope: 'typescript', + type: "build", + scope: "typescript", }); - expect(commitMessage).toBe('build(typescript)'); + expect(commitMessage).toBe("build(typescript)"); }); }); -describe('HeaderQuestion', () => { - test('should limited by header maxLength and minLength', () => { +describe("HeaderQuestion", () => { + test("should limited by header maxLength and minLength", () => { setRules({ - 'header-max-length': [RuleConfigSeverity.Error, 'always', 20], - 'header-min-length': [RuleConfigSeverity.Error, 'always', 10], - 'subject-max-length': [RuleConfigSeverity.Error, 'always', 10], - 'subject-min-length': [RuleConfigSeverity.Error, 'always', 5], + "header-max-length": [RuleConfigSeverity.Error, "always", 20], + "header-min-length": [RuleConfigSeverity.Error, "always", 10], + "subject-max-length": [RuleConfigSeverity.Error, "always", 10], + "subject-min-length": [RuleConfigSeverity.Error, "always", 5], }); setPromptConfig({ messages: { - skip: '(press enter to skip)', - max: 'upper %d chars', - min: '%d chars at least', - emptyWarning: '%s can not be empty', - upperLimitWarning: '%s: %s over limit %d', - lowerLimitWarning: '%s: %s below limit %d', + skip: "(press enter to skip)", + max: "upper %d chars", + min: "%d chars at least", + emptyWarning: "%s can not be empty", + upperLimitWarning: "%s: %s over limit %d", + lowerLimitWarning: "%s: %s below limit %d", }, }); const questions = getQuestions(); const answers = { - type: ''.padEnd(8, 'x'), - scope: ''.padEnd(6, 'y'), + type: "".padEnd(8, "x"), + scope: "".padEnd(6, "y"), }; const lastQuestion = questions[2]; (lastQuestion.message as any)(answers); - expect(lastQuestion?.validate?.(''.padEnd(10, 'z'), answers)).toBe( - 'subject: subject over limit 6' + expect(lastQuestion?.validate?.("".padEnd(10, "z"), answers)).toBe( + "subject: subject over limit 6", ); }); }); diff --git a/@commitlint/cz-commitlint/src/SectionHeader.ts b/@commitlint/cz-commitlint/src/SectionHeader.ts index 1952db3c70..bf43f0a2a3 100644 --- a/@commitlint/cz-commitlint/src/SectionHeader.ts +++ b/@commitlint/cz-commitlint/src/SectionHeader.ts @@ -1,9 +1,9 @@ -import {PromptName, RuleField} from '@commitlint/types'; -import {Answers, DistinctQuestion} from 'inquirer'; +import { PromptName, RuleField } from "@commitlint/types"; +import { Answers, DistinctQuestion } from "inquirer"; -import Question, {QuestionConfig} from './Question.js'; -import getRuleQuestionConfig from './services/getRuleQuestionConfig.js'; -import {getPromptSettings} from './store/prompts.js'; +import Question, { QuestionConfig } from "./Question.js"; +import getRuleQuestionConfig from "./services/getRuleQuestionConfig.js"; +import { getPromptSettings } from "./store/prompts.js"; export class HeaderQuestion extends Question { headerMaxLength: number; @@ -12,7 +12,7 @@ export class HeaderQuestion extends Question { name: PromptName, questionConfig: QuestionConfig, headerMaxLength?: number, - headerMinLength?: number + headerMinLength?: number, ) { super(name, questionConfig); this.headerMaxLength = headerMaxLength ?? Infinity; @@ -27,11 +27,11 @@ export class HeaderQuestion extends Question { } export function combineCommitMessage(answers: Answers): string { - const {type = '', scope = '', subject = ''} = answers; - const prefix = `${type}${scope ? `(${scope})` : ''}`; + const { type = "", scope = "", subject = "" } = answers; + const prefix = `${type}${scope ? `(${scope})` : ""}`; if (subject) { - return ((prefix ? prefix + ': ' : '') + subject).trim(); + return ((prefix ? prefix + ": " : "") + subject).trim(); } else { return prefix.trim(); } @@ -41,8 +41,8 @@ export function getQuestions(): Array<DistinctQuestion> { // header: type, scope, subject const questions: Array<DistinctQuestion> = []; - const headerRuleFields: RuleField[] = ['type', 'scope', 'subject']; - const headerRuleQuestionConfig = getRuleQuestionConfig('header'); + const headerRuleFields: RuleField[] = ["type", "scope", "subject"]; + const headerRuleQuestionConfig = getRuleQuestionConfig("header"); if (!headerRuleQuestionConfig) { return []; @@ -55,7 +55,7 @@ export function getQuestions(): Array<DistinctQuestion> { name, questionConfig, headerRuleQuestionConfig.maxLength, - headerRuleQuestionConfig.minLength + headerRuleQuestionConfig.minLength, ); questions.push(instance.question); } @@ -64,15 +64,15 @@ export function getQuestions(): Array<DistinctQuestion> { } export function getQuestionConfig( - name: RuleField + name: RuleField, ): ReturnType<typeof getRuleQuestionConfig> { const questionConfig = getRuleQuestionConfig(name); if (questionConfig) { - if (name === 'scope') { - if (getPromptSettings()['enableMultipleScopes']) { + if (name === "scope") { + if (getPromptSettings()["enableMultipleScopes"]) { questionConfig.multipleSelectDefaultDelimiter = - getPromptSettings()['scopeEnumSeparator']; + getPromptSettings()["scopeEnumSeparator"]; } // split scope string to segments, match commitlint rules questionConfig.multipleValueDelimiters = /\/|\\|,/g; diff --git a/@commitlint/cz-commitlint/src/index.ts b/@commitlint/cz-commitlint/src/index.ts index 6011d5b4c5..0baeefbf2c 100644 --- a/@commitlint/cz-commitlint/src/index.ts +++ b/@commitlint/cz-commitlint/src/index.ts @@ -1,7 +1,7 @@ -import load from '@commitlint/load'; -import type {Answers, DistinctQuestion} from 'inquirer'; +import load from "@commitlint/load"; +import type { Answers, DistinctQuestion } from "inquirer"; -import process from './Process.js'; +import process from "./Process.js"; type Commit = (message: string) => void; /** @@ -14,9 +14,9 @@ export function prompter( inquirerIns: { prompt(questions: DistinctQuestion[]): Promise<Answers>; }, - commit: Commit + commit: Commit, ): void { - load().then(({rules, prompt = {}}) => { + load().then(({ rules, prompt = {} }) => { process(rules, prompt, inquirerIns).then(commit); }); } diff --git a/@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.test.ts b/@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.test.ts index 338f323c8f..ddae52ae61 100644 --- a/@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.test.ts +++ b/@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.test.ts @@ -1,60 +1,60 @@ -import {describe, test, expect} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { RuleConfigSeverity } from "@commitlint/types"; +import { describe, expect, test } from "vitest"; -import {setPromptConfig} from '../store/prompts.js'; -import {setRules} from '../store/rules.js'; -import getRuleQuestionConfig from './getRuleQuestionConfig.js'; +import { setPromptConfig } from "../store/prompts.js"; +import { setRules } from "../store/rules.js"; +import getRuleQuestionConfig from "./getRuleQuestionConfig.js"; // let rules = {}; // let rules: QualifiedRules = {}; // const getRules = jest.fn().mockReturnValue(rules); -describe('empty rule', () => { - test('should return null when must be empty', () => { +describe("empty rule", () => { + test("should return null when must be empty", () => { setRules({ - 'body-empty': [RuleConfigSeverity.Error, 'always'], + "body-empty": [RuleConfigSeverity.Error, "always"], }); - expect(getRuleQuestionConfig('body')).toBe(null); + expect(getRuleQuestionConfig("body")).toBe(null); }); test("should field 'skip' be false when can not be empty", () => { setRules({ - 'body-empty': [RuleConfigSeverity.Error, 'never'], + "body-empty": [RuleConfigSeverity.Error, "never"], }); - expect(getRuleQuestionConfig('body')?.skip).toBe(false); + expect(getRuleQuestionConfig("body")?.skip).toBe(false); }); test('should field "skip" be true when not set empty rule', () => { setRules({ - 'body-case': [RuleConfigSeverity.Warning, 'never', 'camel-case'], - 'body-max-length': [RuleConfigSeverity.Error, 'always', 100], + "body-case": [RuleConfigSeverity.Warning, "never", "camel-case"], + "body-max-length": [RuleConfigSeverity.Error, "always", 100], }); - expect(getRuleQuestionConfig('body')?.skip).toBe(true); + expect(getRuleQuestionConfig("body")?.skip).toBe(true); }); test('should field "skip" be true when disable empty rule', () => { setRules({ - 'body-empty': [RuleConfigSeverity.Disabled], + "body-empty": [RuleConfigSeverity.Disabled], }); - expect(getRuleQuestionConfig('body')?.skip).toBe(true); + expect(getRuleQuestionConfig("body")?.skip).toBe(true); setRules({ - 'body-empty': [RuleConfigSeverity.Disabled, 'always'], + "body-empty": [RuleConfigSeverity.Disabled, "always"], }); - expect(getRuleQuestionConfig('body')?.skip).toBe(true); + expect(getRuleQuestionConfig("body")?.skip).toBe(true); setRules({ - 'body-empty': [RuleConfigSeverity.Disabled, 'never'], + "body-empty": [RuleConfigSeverity.Disabled, "never"], }); - expect(getRuleQuestionConfig('body')?.skip).toBe(true); + expect(getRuleQuestionConfig("body")?.skip).toBe(true); }); }); -describe('title', () => { +describe("title", () => { test("should field 'title' set by 'description config'", () => { - const TEST_DESC = 'test the description'; + const TEST_DESC = "test the description"; setPromptConfig({ questions: { body: { @@ -63,7 +63,7 @@ describe('title', () => { }, }); - expect(getRuleQuestionConfig('body')?.title).toBe(TEST_DESC); + expect(getRuleQuestionConfig("body")?.title).toBe(TEST_DESC); }); test("should field 'title' be default string when without 'description' config", () => { @@ -73,83 +73,83 @@ describe('title', () => { }, }); - expect(getRuleQuestionConfig('body')?.title).toBe('body:'); + expect(getRuleQuestionConfig("body")?.title).toBe("body:"); }); }); -describe('enum list', () => { - test('should enumList be undefined when without enum rule', () => { +describe("enum list", () => { + test("should enumList be undefined when without enum rule", () => { setRules({ - 'scope-case': [RuleConfigSeverity.Warning, 'never', 'camel-case'], + "scope-case": [RuleConfigSeverity.Warning, "never", "camel-case"], }); - expect(getRuleQuestionConfig('scope')?.enumList).toBeUndefined(); + expect(getRuleQuestionConfig("scope")?.enumList).toBeUndefined(); }); - test('should enumList be undefined when enum rule is not active', () => { + test("should enumList be undefined when enum rule is not active", () => { setRules({ - 'scope-enum': [RuleConfigSeverity.Disabled], + "scope-enum": [RuleConfigSeverity.Disabled], }); - expect(getRuleQuestionConfig('scope')?.enumList).toBeUndefined(); + expect(getRuleQuestionConfig("scope")?.enumList).toBeUndefined(); setRules({ - 'scope-enum': [ + "scope-enum": [ RuleConfigSeverity.Error, - 'never', - ['cli', 'core', 'lint'], + "never", + ["cli", "core", "lint"], ], }); - expect(getRuleQuestionConfig('scope')?.enumList).toBeUndefined(); + expect(getRuleQuestionConfig("scope")?.enumList).toBeUndefined(); setRules({ - 'scope-enum': [RuleConfigSeverity.Error, 'always'], + "scope-enum": [RuleConfigSeverity.Error, "always"], } as any); - expect(getRuleQuestionConfig('scope')?.enumList).toBeUndefined(); + expect(getRuleQuestionConfig("scope")?.enumList).toBeUndefined(); }); - test('should enumList be undefined when enum rule is not a array', () => { + test("should enumList be undefined when enum rule is not a array", () => { setRules({ - 'scope-enum': [RuleConfigSeverity.Error, 'always', {}], + "scope-enum": [RuleConfigSeverity.Error, "always", {}], } as any); - expect(getRuleQuestionConfig('scope')?.enumList).toBeUndefined(); + expect(getRuleQuestionConfig("scope")?.enumList).toBeUndefined(); }); test("should enumList same with enum rule when without 'enum' config", () => { - const ENUM_RULE_LIST = ['cli', 'core', 'lint']; + const ENUM_RULE_LIST = ["cli", "core", "lint"]; setRules({ - 'scope-enum': [RuleConfigSeverity.Error, 'always', ENUM_RULE_LIST], + "scope-enum": [RuleConfigSeverity.Error, "always", ENUM_RULE_LIST], } as any); setPromptConfig({ questions: { scope: { - description: 'test scope', + description: "test scope", }, }, }); - const enumList = getRuleQuestionConfig('scope')?.enumList; + const enumList = getRuleQuestionConfig("scope")?.enumList; expect(enumList).not.toBe(ENUM_RULE_LIST); expect(enumList).toEqual(ENUM_RULE_LIST); }); - test('should enumList item concat description', () => { - const ENUM_RULE_LIST = ['cli', 'core', 'lint']; + test("should enumList item concat description", () => { + const ENUM_RULE_LIST = ["cli", "core", "lint"]; setRules({ - 'scope-enum': [RuleConfigSeverity.Error, 'always', ENUM_RULE_LIST], + "scope-enum": [RuleConfigSeverity.Error, "always", ENUM_RULE_LIST], } as any); setPromptConfig({ questions: { scope: { - description: 'test scope', + description: "test scope", enum: { cli: { - description: 'CLI', + description: "CLI", }, core: { - description: 'CORE', + description: "CORE", }, lint: {}, }, @@ -157,70 +157,70 @@ describe('enum list', () => { }, }); - const enumList = getRuleQuestionConfig('scope')?.enumList; + const enumList = getRuleQuestionConfig("scope")?.enumList; expect(enumList).toHaveLength(3); expect(enumList).toEqual([ { name: expect.stringMatching(/cli:[\s]*CLI/), - value: 'cli', - short: 'cli', + value: "cli", + short: "cli", }, { name: expect.stringMatching(/core:[\s]*CORE/), - value: 'core', - short: 'core', + value: "core", + short: "core", }, - 'lint', + "lint", ]); }); - test('should enumList item padding format with 4 blank', () => { + test("should enumList item padding format with 4 blank", () => { const LONGEST = 12; - const longestItem = ''.padEnd(LONGEST, 'x'); - const enumRuleList = ['cli', 'core', longestItem]; + const longestItem = "".padEnd(LONGEST, "x"); + const enumRuleList = ["cli", "core", longestItem]; setRules({ - 'scope-enum': [RuleConfigSeverity.Error, 'always', enumRuleList], + "scope-enum": [RuleConfigSeverity.Error, "always", enumRuleList], } as any); setPromptConfig({ questions: { scope: { - description: 'test scope', + description: "test scope", enum: { cli: { - description: 'Test CLI', + description: "Test CLI", }, core: { - description: 'Test CORE', + description: "Test CORE", }, [longestItem]: { - description: 'Test', + description: "Test", }, }, }, }, }); - const enumList = getRuleQuestionConfig('scope')?.enumList; + const enumList = getRuleQuestionConfig("scope")?.enumList; expect(enumList).toHaveLength(3); expect(enumList).toEqual([ { name: expect.stringMatching( - new RegExp(`^cli:[\\s]{${LONGEST - 4 + 4}}Test CLI$`) + new RegExp(`^cli:[\\s]{${LONGEST - 4 + 4}}Test CLI$`), ), - value: 'cli', - short: 'cli', + value: "cli", + short: "cli", }, { name: expect.stringMatching( - new RegExp(`^core:[\\s]{${LONGEST - 5 + 4}}Test CORE$`) + new RegExp(`^core:[\\s]{${LONGEST - 5 + 4}}Test CORE$`), ), - value: 'core', - short: 'core', + value: "core", + short: "core", }, { name: expect.stringMatching( - new RegExp(`^${longestItem}:[\\s]{${-1 + 4}}Test$`) + new RegExp(`^${longestItem}:[\\s]{${-1 + 4}}Test$`), ), value: longestItem, short: longestItem, @@ -229,15 +229,15 @@ describe('enum list', () => { }); test("should enumList item sorted by 'enum' config order", () => { - const ENUM_RULE_LIST = ['cli', 'core', 'lint']; + const ENUM_RULE_LIST = ["cli", "core", "lint"]; setRules({ - 'scope-enum': [RuleConfigSeverity.Error, 'always', ENUM_RULE_LIST], + "scope-enum": [RuleConfigSeverity.Error, "always", ENUM_RULE_LIST], } as any); setPromptConfig({ questions: { scope: { - description: 'test scope', + description: "test scope", enum: { core: {}, lint: {}, @@ -247,89 +247,359 @@ describe('enum list', () => { }, }); - const enumList = getRuleQuestionConfig('scope')?.enumList; + const enumList = getRuleQuestionConfig("scope")?.enumList; expect(enumList).toHaveLength(3); - expect(enumList?.[0]).toBe('core'); - expect(enumList?.[1]).toBe('lint'); - expect(enumList?.[2]).toBe('cli'); + expect(enumList?.[0]).toBe("core"); + expect(enumList?.[1]).toBe("lint"); + expect(enumList?.[2]).toBe("cli"); + }); + + test("should format enum items with emojis and descriptions, ensuring consistent spacing", () => { + const ENUM_RULE_LIST = ["feat", "fix", "chore"]; + setRules({ + "type-enum": [RuleConfigSeverity.Error, "always", ENUM_RULE_LIST], + } as any); + + setPromptConfig({ + questions: { + type: { + enum: { + feat: { + description: "Features", + emoji: "✨", + }, + fix: { + description: "Bug fixes", + emoji: "🐛", + }, + chore: { + description: "Chore", + emoji: "♻️", + }, + }, + }, + }, + }); + + const enumList = getRuleQuestionConfig("type")?.enumList; + expect(enumList).toEqual([ + { + name: "✨ feat: Features", + value: "feat", + short: "feat", + }, + { + name: "🐛 fix: Bug fixes", + value: "fix", + short: "fix", + }, + { + name: "♻️ chore: Chore", + value: "chore", + short: "chore", + }, + ]); + }); + + test("should handle custom alignment for emoji and description with extra space", () => { + const ENUM_RULE_LIST = ["feat", "fix", "chore"]; + setRules({ + "type-enum": [RuleConfigSeverity.Error, "always", ENUM_RULE_LIST], + } as any); + + setPromptConfig({ + questions: { + type: { + enum: { + feat: { + description: "Features", + emoji: "✨ ", + }, + fix: { + description: "Bug fixes", + emoji: "🐛 ", + }, + chore: { + description: "Chore", + emoji: "♻️ ", + }, + }, + }, + }, + }); + + const enumList = getRuleQuestionConfig("type")?.enumList; + expect(enumList).toEqual([ + { + name: "✨ feat: Features", + value: "feat", + short: "feat", + }, + { + name: "🐛 fix: Bug fixes", + value: "fix", + short: "fix", + }, + { + name: "♻️ chore: Chore", + value: "chore", + short: "chore", + }, + ]); + }); + + test("should handle inconsistent emoji usage by using 4 blank spaces as a prefix", () => { + const ENUM_RULE_LIST = ["feat", "fix", "chore"]; + setRules({ + "type-enum": [RuleConfigSeverity.Error, "always", ENUM_RULE_LIST], + } as any); + + setPromptConfig({ + questions: { + type: { + enum: { + feat: { + description: "Features", + emoji: "✨", + }, + fix: { + description: "Bug fixes", + }, + chore: { + description: "Chore", + }, + }, + }, + }, + }); + + const enumList = getRuleQuestionConfig("type")?.enumList; + expect(enumList).toEqual([ + { + name: "✨ feat: Features", + value: "feat", + short: "feat", + }, + { + name: " fix: Bug fixes", + value: "fix", + short: "fix", + }, + { + name: " chore: Chore", + value: "chore", + short: "chore", + }, + ]); + }); + + test("should handle no enums having emojis correctly", () => { + const ENUM_RULE_LIST = ["feat", "fix", "chore"]; + setRules({ + "type-enum": [RuleConfigSeverity.Error, "always", ENUM_RULE_LIST], + } as any); + + setPromptConfig({ + questions: { + type: { + enum: { + feat: { + description: "Features", + }, + fix: { + description: "Bug fixes", + }, + chore: { + description: "Chore", + }, + }, + }, + }, + }); + + const enumList = getRuleQuestionConfig("type")?.enumList; + expect(enumList).toEqual([ + { + name: "feat: Features", + value: "feat", + short: "feat", + }, + { + name: "fix: Bug fixes", + value: "fix", + short: "fix", + }, + { + name: "chore: Chore", + value: "chore", + short: "chore", + }, + ]); + }); + + test("should include the emoji in the value when `emojiInHeader` is true", () => { + const ENUM_RULE_LIST = ["feat", "fix"]; + setRules({ + "type-enum": [RuleConfigSeverity.Error, "always", ENUM_RULE_LIST], + } as any); + + setPromptConfig({ + questions: { + type: { + emojiInHeader: true, + enum: { + feat: { + description: "Features", + emoji: "✨", + }, + fix: { + description: "Bug fixes", + emoji: "🐛", + }, + }, + }, + }, + }); + + const enumList = getRuleQuestionConfig("type")?.enumList; + expect(enumList).toEqual([ + { + name: "✨ feat: Features", + value: "✨ feat", + short: "feat", + }, + { + name: "🐛 fix: Bug fixes", + value: "🐛 fix", + short: "fix", + }, + ]); + }); + + test("should trim empty spaces from emoji in the answer", () => { + const ENUM_RULE_LIST = ["feat", "fix", "chore"]; + setRules({ + "type-enum": [RuleConfigSeverity.Error, "always", ENUM_RULE_LIST], + } as any); + + setPromptConfig({ + questions: { + type: { + emojiInHeader: true, + enum: { + feat: { + description: "Features", + emoji: "✨ ", + }, + fix: { + description: "Bug fixes", + emoji: "🐛 ", + }, + chore: { + description: "Chore", + emoji: "♻️ ", + }, + }, + }, + }, + }); + + const enumList = getRuleQuestionConfig("type")?.enumList; + expect(enumList).toEqual([ + { + name: "✨ feat: Features", + value: "✨ feat", + short: "feat", + }, + { + name: "🐛 fix: Bug fixes", + value: "🐛 fix", + short: "fix", + }, + { + name: "♻️ chore: Chore", + value: "♻️ chore", + short: "chore", + }, + ]); }); }); -test('should return correct question config', () => { +test("should return correct question config", () => { setRules({ - 'body-empty': [RuleConfigSeverity.Error, 'never'], - 'body-case': [RuleConfigSeverity.Error, 'always', 'sentence-case'], - 'body-full-stop': [RuleConfigSeverity.Error, 'always', '!'], - 'body-min-length': [RuleConfigSeverity.Error, 'always', 10], - 'body-max-length': [RuleConfigSeverity.Error, 'always', 100], - 'scope-enum': [RuleConfigSeverity.Error, 'always', ['cli', 'core', 'lint']], + "body-empty": [RuleConfigSeverity.Error, "never"], + "body-case": [RuleConfigSeverity.Error, "always", "sentence-case"], + "body-full-stop": [RuleConfigSeverity.Error, "always", "!"], + "body-min-length": [RuleConfigSeverity.Error, "always", 10], + "body-max-length": [RuleConfigSeverity.Error, "always", 100], + "scope-enum": [RuleConfigSeverity.Error, "always", ["cli", "core", "lint"]], } as any); const MESSAGES = { - skip: ':skip', - max: 'upper %d chars', - min: '%d chars at least', - emptyWarning: 'can not be empty', - upperLimitWarning: 'over limit', - lowerLimitWarning: 'below limit', + skip: ":skip", + max: "upper %d chars", + min: "%d chars at least", + emptyWarning: "can not be empty", + upperLimitWarning: "over limit", + lowerLimitWarning: "below limit", }; setPromptConfig({ messages: MESSAGES, questions: { body: { - description: 'please input body: (Test)', + description: "please input body: (Test)", }, scope: { - description: 'please choose the scope: (Test)', + description: "please choose the scope: (Test)", enum: { core: { - description: 'CORE', + description: "CORE", }, lint: { - description: 'LINT', + description: "LINT", }, cli: { - description: 'CLI', + description: "CLI", }, }, }, }, }); - const scopeQuestionConfig = getRuleQuestionConfig('scope'); + const scopeQuestionConfig = getRuleQuestionConfig("scope"); expect(scopeQuestionConfig).toEqual({ skip: true, - title: 'please choose the scope: (Test)', + title: "please choose the scope: (Test)", messages: MESSAGES, minLength: 0, maxLength: Infinity, enumList: [ { - name: 'core: CORE', - value: 'core', - short: 'core', + name: "core: CORE", + value: "core", + short: "core", }, { - name: 'lint: LINT', - value: 'lint', - short: 'lint', + name: "lint: LINT", + value: "lint", + short: "lint", }, { - name: 'cli: CLI', - value: 'cli', - short: 'cli', + name: "cli: CLI", + value: "cli", + short: "cli", }, ], caseFn: expect.any(Function), fullStopFn: expect.any(Function), }); - expect(scopeQuestionConfig?.caseFn?.('xxxx')).toBe('xxxx'); - expect(scopeQuestionConfig?.fullStopFn?.('xxxx')).toBe('xxxx'); + expect(scopeQuestionConfig?.caseFn?.("xxxx")).toBe("xxxx"); + expect(scopeQuestionConfig?.fullStopFn?.("xxxx")).toBe("xxxx"); - const bodyQuestionConfig = getRuleQuestionConfig('body'); + const bodyQuestionConfig = getRuleQuestionConfig("body"); expect(bodyQuestionConfig).toEqual({ skip: false, - title: 'please input body: (Test)', + title: "please input body: (Test)", messages: MESSAGES, minLength: 10, maxLength: 100, @@ -337,6 +607,6 @@ test('should return correct question config', () => { caseFn: expect.any(Function), fullStopFn: expect.any(Function), }); - expect(bodyQuestionConfig?.caseFn?.('xxxx')).toBe('Xxxx'); - expect(bodyQuestionConfig?.fullStopFn?.('xxxx')).toBe('xxxx!'); + expect(bodyQuestionConfig?.caseFn?.("xxxx")).toBe("Xxxx"); + expect(bodyQuestionConfig?.fullStopFn?.("xxxx")).toBe("xxxx!"); }); diff --git a/@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.ts b/@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.ts index f1f146fbe6..50ee8a1907 100644 --- a/@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.ts +++ b/@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.ts @@ -1,9 +1,9 @@ -import {RuleField} from '@commitlint/types'; -import {QuestionConfig} from '../Question.js'; -import {getPromptMessages, getPromptQuestions} from '../store/prompts.js'; -import {getRule} from '../store/rules.js'; -import getCaseFn from '../utils/case-fn.js'; -import getFullStopFn from '../utils/full-stop-fn.js'; +import { RuleField } from "@commitlint/types"; +import { QuestionConfig } from "../Question.js"; +import { getPromptMessages, getPromptQuestions } from "../store/prompts.js"; +import { getRule } from "../store/rules.js"; +import getCaseFn from "../utils/case-fn.js"; +import getFullStopFn from "../utils/full-stop-fn.js"; import { enumRuleIsActive, getEnumList, @@ -12,12 +12,12 @@ import { ruleIsActive, ruleIsApplicable, ruleIsDisabled, -} from '../utils/rules.js'; +} from "../utils/rules.js"; export default function (rulePrefix: RuleField): QuestionConfig | null { const questions = getPromptQuestions(); const questionSettings = questions[rulePrefix]; - const emptyRule = getRule(rulePrefix, 'empty'); + const emptyRule = getRule(rulePrefix, "empty"); const mustBeEmpty = emptyRule && ruleIsActive(emptyRule) && ruleIsApplicable(emptyRule); @@ -28,30 +28,48 @@ export default function (rulePrefix: RuleField): QuestionConfig | null { const canBeSkip = !emptyRule || ruleIsDisabled(emptyRule); - const enumRule = getRule(rulePrefix, 'enum'); + const enumRule = getRule(rulePrefix, "enum"); const enumRuleList = enumRule && enumRuleIsActive(enumRule) ? getEnumList(enumRule) : null; let enumList; if (enumRuleList) { - const enumDescriptions = questionSettings?.['enum']; + const enumDescriptions = questionSettings?.["enum"]; + const emojiInHeader = questionSettings?.emojiInHeader; if (enumDescriptions) { const enumNames = Object.keys(enumDescriptions); const longest = Math.max( - ...enumRuleList.map((enumName) => enumName.length) + ...enumRuleList.map((enumName) => enumName.length), + ); + const firstHasEmoji = + (enumDescriptions[enumNames[0]]?.emoji?.length ?? 0) > 0; + const hasConsistentEmojiUsage = !enumRuleList.some( + (enumName) => + (enumDescriptions[enumName]?.emoji?.length ?? 0) > 0 !== + firstHasEmoji, ); - // TODO emoji + title enumList = enumRuleList .sort((a, b) => enumNames.indexOf(a) - enumNames.indexOf(b)) .map((enumName) => { const enumDescription = enumDescriptions[enumName]?.description; if (enumDescription) { - return { - name: `${enumName}:`.padEnd(longest + 4) + enumDescription, - value: enumName, - short: enumName, - }; + const emoji = enumDescriptions[enumName]?.emoji; + + const emojiPrefix = emoji + ? `${emoji} ` + : hasConsistentEmojiUsage + ? "" + : " "; + + const paddedName = `${enumName}:`.padEnd(longest + 4); + + const name = `${emojiPrefix}${paddedName}${enumDescription}`; + + const value = + emojiInHeader && emoji ? `${emoji.trim()} ${enumName}` : enumName; + + return { name, value, short: enumName }; } else { return enumName; } @@ -64,11 +82,11 @@ export default function (rulePrefix: RuleField): QuestionConfig | null { return { skip: canBeSkip, enumList, - title: questionSettings?.['description'] ?? `${rulePrefix}:`, - caseFn: getCaseFn(getRule(rulePrefix, 'case')), - fullStopFn: getFullStopFn(getRule(rulePrefix, 'full-stop')), - minLength: getMinLength(getRule(rulePrefix, 'min-length')), - maxLength: getMaxLength(getRule(rulePrefix, 'max-length')), + title: questionSettings?.["description"] ?? `${rulePrefix}:`, + caseFn: getCaseFn(getRule(rulePrefix, "case")), + fullStopFn: getFullStopFn(getRule(rulePrefix, "full-stop")), + minLength: getMinLength(getRule(rulePrefix, "min-length")), + maxLength: getMaxLength(getRule(rulePrefix, "max-length")), messages: getPromptMessages(), }; } diff --git a/@commitlint/cz-commitlint/src/store/defaultPromptConfigs.ts b/@commitlint/cz-commitlint/src/store/defaultPromptConfigs.ts index e4a4ce8998..650b3762d8 100644 --- a/@commitlint/cz-commitlint/src/store/defaultPromptConfigs.ts +++ b/@commitlint/cz-commitlint/src/store/defaultPromptConfigs.ts @@ -1,33 +1,33 @@ export default { settings: { - scopeEnumSeparator: ',', + scopeEnumSeparator: ",", enableMultipleScopes: false, }, messages: { - skip: '(press enter to skip)', - max: '(max %d chars)', - min: '(min %d chars)', - emptyWarning: '(%s is required)', - upperLimitWarning: '%s is %d characters longer than the upper limit', - lowerLimitWarning: '%s is %d characters less than the lower limit', + skip: "(press enter to skip)", + max: "(max %d chars)", + min: "(min %d chars)", + emptyWarning: "(%s is required)", + upperLimitWarning: "%s is %d characters longer than the upper limit", + lowerLimitWarning: "%s is %d characters less than the lower limit", }, questions: { type: { - description: '<type> holds information about the goal of a change.', + description: "<type> holds information about the goal of a change.", }, scope: { description: - '<scope> marks which sub-component of the project is affected', + "<scope> marks which sub-component of the project is affected", }, subject: { - description: '<subject> is a short, high-level description of the change', + description: "<subject> is a short, high-level description of the change", }, body: { - description: '<body> holds additional information about the change', + description: "<body> holds additional information about the change", }, footer: { description: - '<footer> holds further meta data, such as breaking changes and issue ids', + "<footer> holds further meta data, such as breaking changes and issue ids", }, }, }; diff --git a/@commitlint/cz-commitlint/src/store/prompts.test.ts b/@commitlint/cz-commitlint/src/store/prompts.test.ts index 37e1ceeaa0..9d378b4ed5 100644 --- a/@commitlint/cz-commitlint/src/store/prompts.test.ts +++ b/@commitlint/cz-commitlint/src/store/prompts.test.ts @@ -1,5 +1,5 @@ -import {describe, test, expect, vi, beforeEach} from 'vitest'; -import * as prompts from './prompts.js'; +import { describe, test, expect, vi, beforeEach } from "vitest"; +import * as prompts from "./prompts.js"; let getPromptQuestions: typeof prompts.getPromptQuestions; let getPromptMessages: typeof prompts.getPromptMessages; @@ -8,16 +8,20 @@ let setPromptConfig: typeof prompts.setPromptConfig; beforeEach(async () => { vi.resetModules(); - ({getPromptQuestions, getPromptMessages, getPromptSettings, setPromptConfig} = - await import('./prompts.js')); + ({ + getPromptQuestions, + getPromptMessages, + getPromptSettings, + setPromptConfig, + } = await import("./prompts.js")); }); -describe('setPromptConfig', () => { - test('should cover questions when prompt config questions is plain object', () => { +describe("setPromptConfig", () => { + test("should cover questions when prompt config questions is plain object", () => { const promptConfig = { questions: { type: { - description: 'input type', + description: "input type", }, }, }; @@ -25,15 +29,15 @@ describe('setPromptConfig', () => { expect(getPromptQuestions()).toBe(promptConfig.questions); }); - test('should not set questions when prompt config questions is not a plain object', () => { - const initialQuestions = {...getPromptQuestions()}; + test("should not set questions when prompt config questions is not a plain object", () => { + const initialQuestions = { ...getPromptQuestions() }; setPromptConfig({ questions: null, } as any); expect(getPromptQuestions()).toEqual(initialQuestions); setPromptConfig({ - questions: 'questions', + questions: "questions", } as any); expect(getPromptQuestions()).toEqual(initialQuestions); @@ -43,66 +47,66 @@ describe('setPromptConfig', () => { expect(getPromptQuestions()).toEqual(initialQuestions); }); - test('should merge message when prompt config message is string', () => { - const initialMessages = {...getPromptMessages()}; + test("should merge message when prompt config message is string", () => { + const initialMessages = { ...getPromptMessages() }; const promptConfig = { messages: { - emptyWarning: '(%s can not be empty)', + emptyWarning: "(%s can not be empty)", }, }; setPromptConfig(promptConfig); - expect(getPromptMessages()['emptyWarning']).toBe( - promptConfig.messages.emptyWarning + expect(getPromptMessages()["emptyWarning"]).toBe( + promptConfig.messages.emptyWarning, ); - expect(getPromptMessages()['lowerLimitWarning']).toBe( - initialMessages['lowerLimitWarning'] + expect(getPromptMessages()["lowerLimitWarning"]).toBe( + initialMessages["lowerLimitWarning"], ); }); - test('should not merge message when prompt config message is not a string', () => { - const initialMessages = {...getPromptMessages()}; + test("should not merge message when prompt config message is not a string", () => { + const initialMessages = { ...getPromptMessages() }; const promptConfig = { messages: { - emptyWarning: '(%s can not be empty)', + emptyWarning: "(%s can not be empty)", min: function () { - return 'min:'; + return "min:"; }, }, }; setPromptConfig(promptConfig as any); - expect(getPromptMessages()['emptyWarning']).toBe( - promptConfig.messages.emptyWarning + expect(getPromptMessages()["emptyWarning"]).toBe( + promptConfig.messages.emptyWarning, ); - expect(getPromptMessages()['min']).toBe(initialMessages['min']); + expect(getPromptMessages()["min"]).toBe(initialMessages["min"]); }); - test('should ignore non-essential message', () => { - const initialMessages = {...getPromptMessages()}; + test("should ignore non-essential message", () => { + const initialMessages = { ...getPromptMessages() }; const promptConfig = { messages: { - more: 'learn more', + more: "learn more", }, }; setPromptConfig(promptConfig); expect(getPromptMessages()).toEqual(initialMessages); }); - test('should fields be independent', () => { - const initialQuestions = {...getPromptQuestions()}; + test("should fields be independent", () => { + const initialQuestions = { ...getPromptQuestions() }; setPromptConfig({ messages: { - emptyWarning: '(%s can not be empty)', + emptyWarning: "(%s can not be empty)", }, }); expect(getPromptQuestions()).toEqual(initialQuestions); - const initialMessages = {...getPromptMessages()}; + const initialMessages = { ...getPromptMessages() }; setPromptConfig({ questions: { type: { - description: 'input type', + description: "input type", }, }, }); @@ -112,29 +116,29 @@ describe('setPromptConfig', () => { test('should settings scopeEnumSeparator be set when value is ",\\/"', () => { setPromptConfig({ settings: { - scopeEnumSeparator: '/', + scopeEnumSeparator: "/", }, }); - expect(getPromptSettings()['scopeEnumSeparator']).toEqual('/'); + expect(getPromptSettings()["scopeEnumSeparator"]).toEqual("/"); const processExit = vi - .spyOn(process, 'exit') + .spyOn(process, "exit") .mockImplementation(() => undefined as never); setPromptConfig({ settings: { - scopeEnumSeparator: '-', + scopeEnumSeparator: "-", }, }); expect(processExit).toHaveBeenCalledWith(1); processExit.mockClear(); }); - test('should pass on settings', () => { + test("should pass on settings", () => { setPromptConfig({ settings: { enableMultipleScopes: true, }, }); - expect(getPromptSettings()['enableMultipleScopes']).toEqual(true); + expect(getPromptSettings()["enableMultipleScopes"]).toEqual(true); }); }); diff --git a/@commitlint/cz-commitlint/src/store/prompts.ts b/@commitlint/cz-commitlint/src/store/prompts.ts index 87faf0e047..dfa1846833 100644 --- a/@commitlint/cz-commitlint/src/store/prompts.ts +++ b/@commitlint/cz-commitlint/src/store/prompts.ts @@ -1,9 +1,9 @@ -import type {PromptConfig, UserPromptConfig} from '@commitlint/types'; -import isPlainObject from 'lodash.isplainobject'; +import type { PromptConfig, UserPromptConfig } from "@commitlint/types"; +import isPlainObject from "lodash.isplainobject"; -import defaultPromptConfigs from './defaultPromptConfigs.js'; +import defaultPromptConfigs from "./defaultPromptConfigs.js"; -const storeKey = Symbol('promptConfig'); +const storeKey = Symbol("promptConfig"); const store: { [storeKey]: PromptConfig; @@ -12,46 +12,46 @@ const store: { }; export function setPromptConfig(newPromptConfig: UserPromptConfig): void { - const {settings, messages, questions} = newPromptConfig; + const { settings, messages, questions } = newPromptConfig; if (messages) { const requiredMessageKeys = Object.keys(defaultPromptConfigs.messages); requiredMessageKeys.forEach((key: string) => { const message = messages[key]; - if (typeof message === 'string') { - store[storeKey]['messages'][key] = message; + if (typeof message === "string") { + store[storeKey]["messages"][key] = message; } }); } if (questions && isPlainObject(questions)) { - store[storeKey]['questions'] = questions; + store[storeKey]["questions"] = questions; } if (settings && isPlainObject(settings)) { if ( - settings['scopeEnumSeparator'] && - !/^\/|\\|,$/.test(settings['scopeEnumSeparator']) + settings["scopeEnumSeparator"] && + !/^\/|\\|,$/.test(settings["scopeEnumSeparator"]) ) { console.log( - `prompt.settings.scopeEnumSeparator must be one of ',', '\\', '/'.` + `prompt.settings.scopeEnumSeparator must be one of ',', '\\', '/'.`, ); process.exit(1); } - store[storeKey]['settings'] = { + store[storeKey]["settings"] = { ...defaultPromptConfigs.settings, ...settings, }; } } -export function getPromptMessages(): Readonly<PromptConfig['messages']> { - return (store[storeKey] && store[storeKey]['messages']) ?? {}; +export function getPromptMessages(): Readonly<PromptConfig["messages"]> { + return (store[storeKey] && store[storeKey]["messages"]) ?? {}; } -export function getPromptQuestions(): Readonly<PromptConfig['questions']> { - return (store[storeKey] && store[storeKey]['questions']) ?? {}; +export function getPromptQuestions(): Readonly<PromptConfig["questions"]> { + return (store[storeKey] && store[storeKey]["questions"]) ?? {}; } -export function getPromptSettings(): Readonly<PromptConfig['settings']> { - return (store[storeKey] && store[storeKey]['settings']) ?? {}; +export function getPromptSettings(): Readonly<PromptConfig["settings"]> { + return (store[storeKey] && store[storeKey]["settings"]) ?? {}; } diff --git a/@commitlint/cz-commitlint/src/store/rules.test.ts b/@commitlint/cz-commitlint/src/store/rules.test.ts index 9fb5280943..373dd6f101 100644 --- a/@commitlint/cz-commitlint/src/store/rules.test.ts +++ b/@commitlint/cz-commitlint/src/store/rules.test.ts @@ -1,70 +1,70 @@ -import {describe, test, expect, vi, beforeEach} from 'vitest'; -import {QualifiedRules, RuleConfigSeverity} from '@commitlint/types'; +import { describe, test, expect, vi, beforeEach } from "vitest"; +import { QualifiedRules, RuleConfigSeverity } from "@commitlint/types"; -import {GetRuleMethod, SetRulesMethod} from './rules.js'; +import { GetRuleMethod, SetRulesMethod } from "./rules.js"; let getRule: GetRuleMethod; let setRules: SetRulesMethod; beforeEach(async () => { vi.resetModules(); - ({getRule, setRules} = await import('./rules.js')); + ({ getRule, setRules } = await import("./rules.js")); }); -describe('getRule', () => { - test('should get rule when prefix and property strict match', () => { +describe("getRule", () => { + test("should get rule when prefix and property strict match", () => { const rules: QualifiedRules = { - 'body-max-length': [RuleConfigSeverity.Error, 'always', 100], - 'footer-max-line-length': [RuleConfigSeverity.Error, 'always', 100], - 'subject-empty': [RuleConfigSeverity.Error, 'never'], + "body-max-length": [RuleConfigSeverity.Error, "always", 100], + "footer-max-line-length": [RuleConfigSeverity.Error, "always", 100], + "subject-empty": [RuleConfigSeverity.Error, "never"], }; setRules(rules); - expect(getRule('body', 'max-length')).toBe(rules['body-max-length']); - expect(getRule('footer', 'max-line-length')).toBe( - rules['footer-max-line-length'] + expect(getRule("body", "max-length")).toBe(rules["body-max-length"]); + expect(getRule("footer", "max-line-length")).toBe( + rules["footer-max-line-length"], ); - expect(getRule('subject', 'empty')).toBe(rules['subject-empty']); + expect(getRule("subject", "empty")).toBe(rules["subject-empty"]); }); - test('should not get rule when prefix is invalid', () => { + test("should not get rule when prefix is invalid", () => { const rules: QualifiedRules = { - 'body-max-length': [RuleConfigSeverity.Error, 'always', 100], + "body-max-length": [RuleConfigSeverity.Error, "always", 100], }; setRules(rules); - expect(getRule('body-max', 'length')).toBeUndefined(); - expect(getRule('body-max', 'max-length')).toBeUndefined(); - expect(getRule('', 'body-max-length')).toBeUndefined(); + expect(getRule("body-max", "length")).toBeUndefined(); + expect(getRule("body-max", "max-length")).toBeUndefined(); + expect(getRule("", "body-max-length")).toBeUndefined(); }); - test('should not get rule when property is partial match', () => { + test("should not get rule when property is partial match", () => { const rules: QualifiedRules = { - 'body-max-length': [RuleConfigSeverity.Error, 'always', 100], - 'body-leading-blank': [RuleConfigSeverity.Warning, 'always'], + "body-max-length": [RuleConfigSeverity.Error, "always", 100], + "body-leading-blank": [RuleConfigSeverity.Warning, "always"], }; setRules(rules); - expect(getRule('body', 'length')).toBeUndefined(); - expect(getRule('body', 'line-leading-blank')).toBeUndefined(); + expect(getRule("body", "length")).toBeUndefined(); + expect(getRule("body", "line-leading-blank")).toBeUndefined(); }); }); -describe('setRule', () => { - test('should overwrite all rules when setRule', () => { - expect(getRule('body', 'max-length')).toBeUndefined(); +describe("setRule", () => { + test("should overwrite all rules when setRule", () => { + expect(getRule("body", "max-length")).toBeUndefined(); let rules: QualifiedRules = { - 'body-max-length': [RuleConfigSeverity.Error, 'always', 100], + "body-max-length": [RuleConfigSeverity.Error, "always", 100], }; setRules(rules); - expect(getRule('body', 'max-length')).toBe(rules['body-max-length']); + expect(getRule("body", "max-length")).toBe(rules["body-max-length"]); rules = { - 'footer-max-length': [RuleConfigSeverity.Error, 'always', 100], + "footer-max-length": [RuleConfigSeverity.Error, "always", 100], }; setRules(rules); - expect(getRule('body', 'max-length')).toBeUndefined(); - expect(getRule('footer', 'max-length')).toBe(rules['footer-max-length']); + expect(getRule("body", "max-length")).toBeUndefined(); + expect(getRule("footer", "max-length")).toBe(rules["footer-max-length"]); }); }); diff --git a/@commitlint/cz-commitlint/src/store/rules.ts b/@commitlint/cz-commitlint/src/store/rules.ts index 5308b4fb9e..661d4e0ebd 100644 --- a/@commitlint/cz-commitlint/src/store/rules.ts +++ b/@commitlint/cz-commitlint/src/store/rules.ts @@ -1,8 +1,8 @@ -import {QualifiedRules} from '@commitlint/types'; +import { QualifiedRules } from "@commitlint/types"; -import type {Rule} from '../types.js'; +import type { Rule } from "../types.js"; -const storeKey = Symbol('rules'); +const storeKey = Symbol("rules"); const store: { [storeKey]: QualifiedRules; @@ -11,7 +11,7 @@ const store: { }; export function getRule(key: string, property: string): Rule | undefined { - if (key.split('-').length > 1) { + if (key.split("-").length > 1) { return; } return store[storeKey][`${key}-${property}`]; diff --git a/@commitlint/cz-commitlint/src/types.ts b/@commitlint/cz-commitlint/src/types.ts index fba53c54eb..b0c2d2c528 100644 --- a/@commitlint/cz-commitlint/src/types.ts +++ b/@commitlint/cz-commitlint/src/types.ts @@ -1,4 +1,4 @@ -import {RuleConfigCondition, RuleConfigSeverity} from '@commitlint/types'; +import { RuleConfigCondition, RuleConfigSeverity } from "@commitlint/types"; export type Rule = | Readonly<[RuleConfigSeverity.Disabled]> diff --git a/@commitlint/cz-commitlint/src/utils/case-fn.test.ts b/@commitlint/cz-commitlint/src/utils/case-fn.test.ts index 4861cb3462..a1c0a44f33 100644 --- a/@commitlint/cz-commitlint/src/utils/case-fn.test.ts +++ b/@commitlint/cz-commitlint/src/utils/case-fn.test.ts @@ -1,93 +1,93 @@ -import {test, expect} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { test, expect } from "vitest"; +import { RuleConfigSeverity } from "@commitlint/types"; -import getCaseFn from './case-fn.js'; +import getCaseFn from "./case-fn.js"; -test('should not transform when rule is disabled', () => { +test("should not transform when rule is disabled", () => { let rule = getCaseFn([RuleConfigSeverity.Disabled]); - expect(rule('test')).toBe('test'); - expect(rule('test-foo')).toBe('test-foo'); - expect(rule('testFoo')).toBe('testFoo'); - expect(rule('TEST_FOO')).toBe('TEST_FOO'); + expect(rule("test")).toBe("test"); + expect(rule("test-foo")).toBe("test-foo"); + expect(rule("testFoo")).toBe("testFoo"); + expect(rule("TEST_FOO")).toBe("TEST_FOO"); rule = getCaseFn(); - expect(rule('test')).toBe('test'); - expect(rule('test-foo')).toBe('test-foo'); - expect(rule('testFoo')).toBe('testFoo'); - expect(rule('TEST_FOO')).toBe('TEST_FOO'); - - rule = getCaseFn([RuleConfigSeverity.Warning, 'never']); - expect(rule('test')).toBe('test'); - expect(rule('test-foo')).toBe('test-foo'); - expect(rule('testFoo')).toBe('testFoo'); - expect(rule('TEST_FOO')).toBe('TEST_FOO'); + expect(rule("test")).toBe("test"); + expect(rule("test-foo")).toBe("test-foo"); + expect(rule("testFoo")).toBe("testFoo"); + expect(rule("TEST_FOO")).toBe("TEST_FOO"); + + rule = getCaseFn([RuleConfigSeverity.Warning, "never"]); + expect(rule("test")).toBe("test"); + expect(rule("test-foo")).toBe("test-foo"); + expect(rule("testFoo")).toBe("testFoo"); + expect(rule("TEST_FOO")).toBe("TEST_FOO"); }); -test('should throw error on invalid casing', () => { - let rule = getCaseFn([RuleConfigSeverity.Warning, 'always']); - expect(() => rule('test')).toThrow('Unknown target case "undefined"'); +test("should throw error on invalid casing", () => { + let rule = getCaseFn([RuleConfigSeverity.Warning, "always"]); + expect(() => rule("test")).toThrow('Unknown target case "undefined"'); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'foo']); - expect(() => rule('test')).toThrow('Unknown target case "foo"'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "foo"]); + expect(() => rule("test")).toThrow('Unknown target case "foo"'); }); -test('should transform text correctly with single case', () => { - let rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'camel-case']); - expect(rule('TEST_FOOBar-baz baz')).toBe('testFooBarBazBaz'); +test("should transform text correctly with single case", () => { + let rule = getCaseFn([RuleConfigSeverity.Warning, "always", "camel-case"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("testFooBarBazBaz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'kebab-case']); - expect(rule('TEST_FOOBar-baz baz')).toBe('test-foo-bar-baz-baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "kebab-case"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("test-foo-bar-baz-baz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'snake-case']); - expect(rule('TEST_FOOBar-baz baz')).toBe('test_foo_bar_baz_baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "snake-case"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("test_foo_bar_baz_baz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'pascal-case']); - expect(rule('TEST_FOOBar-baz baz')).toBe('TestFooBarBazBaz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "pascal-case"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("TestFooBarBazBaz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'start-case']); - expect(rule('TEST_FOOBar-baz baz')).toBe('TEST FOO Bar Baz Baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "start-case"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("TEST FOO Bar Baz Baz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'upper-case']); - expect(rule('TEST_FOOBar-baz baz')).toBe('TEST_FOOBAR-BAZ BAZ'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "upper-case"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("TEST_FOOBAR-BAZ BAZ"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'uppercase']); - expect(rule('TEST_FOOBar-baz baz')).toBe('TEST_FOOBAR-BAZ BAZ'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "uppercase"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("TEST_FOOBAR-BAZ BAZ"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'sentence-case']); - expect(rule('tEST_FOOBar-baz baz')).toBe('TEST_FOOBar-baz baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "sentence-case"]); + expect(rule("tEST_FOOBar-baz baz")).toBe("TEST_FOOBar-baz baz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'sentencecase']); - expect(rule('tEST_FOOBar-baz baz')).toBe('TEST_FOOBar-baz baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "sentencecase"]); + expect(rule("tEST_FOOBar-baz baz")).toBe("TEST_FOOBar-baz baz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'lower-case']); - expect(rule('TEST_FOOBar-baz baz')).toBe('test_foobar-baz baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "lower-case"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("test_foobar-baz baz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'lowercase']); - expect(rule('TEST_FOOBar-baz baz')).toBe('test_foobar-baz baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "lowercase"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("test_foobar-baz baz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'lowerCase']); - expect(rule('TEST_FOOBar-baz baz')).toBe('test_foobar-baz baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "lowerCase"]); + expect(rule("TEST_FOOBar-baz baz")).toBe("test_foobar-baz baz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'lowerCase']); - expect(rule(['TEST_FOOBar-baz', 'bAz'])).toBe('test_foobar-baz,baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "lowerCase"]); + expect(rule(["TEST_FOOBar-baz", "bAz"])).toBe("test_foobar-baz,baz"); - rule = getCaseFn([RuleConfigSeverity.Warning, 'always', 'lowerCase']); - expect(rule(['TEST_FOOBar-baz', 'bAz'], '|')).toBe('test_foobar-baz|baz'); + rule = getCaseFn([RuleConfigSeverity.Warning, "always", "lowerCase"]); + expect(rule(["TEST_FOOBar-baz", "bAz"], "|")).toBe("test_foobar-baz|baz"); }); -test('should transform text correctly with multiple cases', () => { +test("should transform text correctly with multiple cases", () => { const rule = getCaseFn([ RuleConfigSeverity.Warning, - 'always', - ['camel-case', 'lowercase'], + "always", + ["camel-case", "lowercase"], ]); - expect(rule('test')).toBe('test'); - expect(rule('test-foo')).toBe('test-foo'); - expect(rule('testFoo')).toBe('testFoo'); - expect(rule('TEST_FOO')).toBe('testFoo'); - - expect(rule(['testFoo', 'test_foo'])).toBe('testFoo,testFoo'); - expect(rule(['TEST_foo', 'test_foo'])).toBe('test_foo,test_foo'); - expect(rule(['TEST_FOO', 'Test_foo'])).toBe('testFoo,testFoo'); - expect(rule(['TEST_FOO', 'Test_foo'], '|')).toBe('testFoo|testFoo'); + expect(rule("test")).toBe("test"); + expect(rule("test-foo")).toBe("test-foo"); + expect(rule("testFoo")).toBe("testFoo"); + expect(rule("TEST_FOO")).toBe("testFoo"); + + expect(rule(["testFoo", "test_foo"])).toBe("testFoo,testFoo"); + expect(rule(["TEST_foo", "test_foo"])).toBe("test_foo,test_foo"); + expect(rule(["TEST_FOO", "Test_foo"])).toBe("testFoo,testFoo"); + expect(rule(["TEST_FOO", "Test_foo"], "|")).toBe("testFoo|testFoo"); }); diff --git a/@commitlint/cz-commitlint/src/utils/case-fn.ts b/@commitlint/cz-commitlint/src/utils/case-fn.ts index 394b786a0c..81723af7ca 100644 --- a/@commitlint/cz-commitlint/src/utils/case-fn.ts +++ b/@commitlint/cz-commitlint/src/utils/case-fn.ts @@ -1,8 +1,8 @@ -import {case as ensureCase, toCase} from '@commitlint/ensure'; -import {TargetCaseType} from '@commitlint/types'; +import { case as ensureCase, toCase } from "@commitlint/ensure"; +import { TargetCaseType } from "@commitlint/types"; -import {Rule} from '../types.js'; -import {ruleIsActive, ruleIsNotApplicable} from './rules.js'; +import { Rule } from "../types.js"; +import { ruleIsActive, ruleIsNotApplicable } from "./rules.js"; export type CaseFn = (input: string | string[], delimiter?: string) => string; diff --git a/@commitlint/cz-commitlint/src/utils/full-stop-fn.test.ts b/@commitlint/cz-commitlint/src/utils/full-stop-fn.test.ts index a70c2a0c18..418af8af35 100644 --- a/@commitlint/cz-commitlint/src/utils/full-stop-fn.test.ts +++ b/@commitlint/cz-commitlint/src/utils/full-stop-fn.test.ts @@ -1,69 +1,69 @@ -import {test, expect} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { test, expect } from "vitest"; +import { RuleConfigSeverity } from "@commitlint/types"; -import getFullStopFn from './full-stop-fn.js'; +import getFullStopFn from "./full-stop-fn.js"; -test('should not apply', () => { +test("should not apply", () => { let rule = getFullStopFn([RuleConfigSeverity.Disabled]); - expect(rule('test.')).toBe('test.'); - expect(rule('test')).toBe('test'); - expect(rule('test..')).toBe('test..'); - expect(rule('')).toBe(''); + expect(rule("test.")).toBe("test."); + expect(rule("test")).toBe("test"); + expect(rule("test..")).toBe("test.."); + expect(rule("")).toBe(""); rule = getFullStopFn(); - expect(rule('test.')).toBe('test.'); - expect(rule('test')).toBe('test'); - expect(rule('test..')).toBe('test..'); - expect(rule('')).toBe(''); + expect(rule("test.")).toBe("test."); + expect(rule("test")).toBe("test"); + expect(rule("test..")).toBe("test.."); + expect(rule("")).toBe(""); - rule = getFullStopFn([RuleConfigSeverity.Disabled, 'always']); - expect(rule('test.')).toBe('test.'); - expect(rule('test')).toBe('test'); - expect(rule('test..')).toBe('test..'); - expect(rule('')).toBe(''); + rule = getFullStopFn([RuleConfigSeverity.Disabled, "always"]); + expect(rule("test.")).toBe("test."); + expect(rule("test")).toBe("test"); + expect(rule("test..")).toBe("test.."); + expect(rule("")).toBe(""); - rule = getFullStopFn([RuleConfigSeverity.Disabled, 'always', 1]); - expect(rule('test.')).toBe('test.'); - expect(rule('test')).toBe('test'); - expect(rule('test..')).toBe('test..'); - expect(rule('')).toBe(''); + rule = getFullStopFn([RuleConfigSeverity.Disabled, "always", 1]); + expect(rule("test.")).toBe("test."); + expect(rule("test")).toBe("test"); + expect(rule("test..")).toBe("test.."); + expect(rule("")).toBe(""); - rule = getFullStopFn([RuleConfigSeverity.Disabled, 'never']); - expect(rule('test.')).toBe('test.'); - expect(rule('test')).toBe('test'); - expect(rule('test..')).toBe('test..'); - expect(rule('')).toBe(''); + rule = getFullStopFn([RuleConfigSeverity.Disabled, "never"]); + expect(rule("test.")).toBe("test."); + expect(rule("test")).toBe("test"); + expect(rule("test..")).toBe("test.."); + expect(rule("")).toBe(""); - rule = getFullStopFn([RuleConfigSeverity.Disabled, 'never', ['.']]); - expect(rule('test.')).toBe('test.'); - expect(rule('test')).toBe('test'); - expect(rule('test..')).toBe('test..'); - expect(rule('')).toBe(''); + rule = getFullStopFn([RuleConfigSeverity.Disabled, "never", ["."]]); + expect(rule("test.")).toBe("test."); + expect(rule("test")).toBe("test"); + expect(rule("test..")).toBe("test.."); + expect(rule("")).toBe(""); }); -test('should add full stop', () => { - let rule = getFullStopFn([RuleConfigSeverity.Error, 'always', '.']); - expect(rule('test')).toBe('test.'); - expect(rule('test.')).toBe('test.'); - expect(rule('')).toBe('.'); +test("should add full stop", () => { + let rule = getFullStopFn([RuleConfigSeverity.Error, "always", "."]); + expect(rule("test")).toBe("test."); + expect(rule("test.")).toBe("test."); + expect(rule("")).toBe("."); - rule = getFullStopFn([RuleConfigSeverity.Error, 'always', '\n']); - expect(rule('test')).toBe('test\n'); - expect(rule('test.')).toBe('test.\n'); - expect(rule('')).toBe('\n'); + rule = getFullStopFn([RuleConfigSeverity.Error, "always", "\n"]); + expect(rule("test")).toBe("test\n"); + expect(rule("test.")).toBe("test.\n"); + expect(rule("")).toBe("\n"); }); -test('should remove full stop', () => { - let rule = getFullStopFn([RuleConfigSeverity.Error, 'never', '.']); - expect(rule('test')).toBe('test'); - expect(rule('test.')).toBe('test'); - expect(rule('')).toBe(''); - expect(rule('test..')).toBe('test'); - expect(rule('test.end')).toBe('test.end'); +test("should remove full stop", () => { + let rule = getFullStopFn([RuleConfigSeverity.Error, "never", "."]); + expect(rule("test")).toBe("test"); + expect(rule("test.")).toBe("test"); + expect(rule("")).toBe(""); + expect(rule("test..")).toBe("test"); + expect(rule("test.end")).toBe("test.end"); - rule = getFullStopFn([RuleConfigSeverity.Error, 'never', '\n']); - expect(rule('test')).toBe('test'); - expect(rule('test.')).toBe('test.'); - expect(rule('test\n\n')).toBe('test'); - expect(rule('test.\n')).toBe('test.'); + rule = getFullStopFn([RuleConfigSeverity.Error, "never", "\n"]); + expect(rule("test")).toBe("test"); + expect(rule("test.")).toBe("test."); + expect(rule("test\n\n")).toBe("test"); + expect(rule("test.\n")).toBe("test."); }); diff --git a/@commitlint/cz-commitlint/src/utils/full-stop-fn.ts b/@commitlint/cz-commitlint/src/utils/full-stop-fn.ts index 9b219e0001..659a15e915 100644 --- a/@commitlint/cz-commitlint/src/utils/full-stop-fn.ts +++ b/@commitlint/cz-commitlint/src/utils/full-stop-fn.ts @@ -1,5 +1,5 @@ -import {Rule} from '../types.js'; -import {ruleIsActive, ruleIsNotApplicable} from './rules.js'; +import { Rule } from "../types.js"; +import { ruleIsActive, ruleIsNotApplicable } from "./rules.js"; export type FullStopFn = (input: string) => string; @@ -15,7 +15,7 @@ export default function getFullStopFn(rule?: Rule): FullStopFn { return noop; } - if (typeof rule[2] !== 'string') return noop; + if (typeof rule[2] !== "string") return noop; const symbol: string = rule[2]; diff --git a/@commitlint/cz-commitlint/src/utils/leading-blank-fn.test.ts b/@commitlint/cz-commitlint/src/utils/leading-blank-fn.test.ts index 9eb773b87c..c82893859c 100644 --- a/@commitlint/cz-commitlint/src/utils/leading-blank-fn.test.ts +++ b/@commitlint/cz-commitlint/src/utils/leading-blank-fn.test.ts @@ -1,39 +1,39 @@ -import {test, expect} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { test, expect } from "vitest"; +import { RuleConfigSeverity } from "@commitlint/types"; -import getLeadingBlankFn from './leading-blank-fn.js'; +import getLeadingBlankFn from "./leading-blank-fn.js"; -test('should not apply', () => { +test("should not apply", () => { let rule = getLeadingBlankFn([RuleConfigSeverity.Disabled]); - expect(rule('test')).toBe('test'); - expect(rule('\ntest')).toBe('\ntest'); - expect(rule('aaa\ntest')).toBe('aaa\ntest'); - expect(rule('')).toBe(''); + expect(rule("test")).toBe("test"); + expect(rule("\ntest")).toBe("\ntest"); + expect(rule("aaa\ntest")).toBe("aaa\ntest"); + expect(rule("")).toBe(""); rule = getLeadingBlankFn(); - expect(rule('test')).toBe('test'); - expect(rule('\ntest')).toBe('\ntest'); - expect(rule('aaa\ntest')).toBe('aaa\ntest'); - expect(rule('')).toBe(''); + expect(rule("test")).toBe("test"); + expect(rule("\ntest")).toBe("\ntest"); + expect(rule("aaa\ntest")).toBe("aaa\ntest"); + expect(rule("")).toBe(""); }); -test('should add leading blank', () => { - const rule = getLeadingBlankFn([RuleConfigSeverity.Error, 'always']); - expect(rule('test')).toBe('\ntest'); - expect(rule('\ntest')).toBe('\ntest'); - expect(rule('\n\ntest')).toBe('\n\ntest'); - expect(rule('aaa\ntest')).toBe('\naaa\ntest'); - expect(rule('\naaa\ntest')).toBe('\naaa\ntest'); - expect(rule('')).toBe(''); +test("should add leading blank", () => { + const rule = getLeadingBlankFn([RuleConfigSeverity.Error, "always"]); + expect(rule("test")).toBe("\ntest"); + expect(rule("\ntest")).toBe("\ntest"); + expect(rule("\n\ntest")).toBe("\n\ntest"); + expect(rule("aaa\ntest")).toBe("\naaa\ntest"); + expect(rule("\naaa\ntest")).toBe("\naaa\ntest"); + expect(rule("")).toBe(""); }); -test('should remove leading blank', () => { - const rule = getLeadingBlankFn([RuleConfigSeverity.Error, 'never']); - expect(rule('test')).toBe('test'); - expect(rule('\ntest')).toBe('test'); - expect(rule('\n\ntest')).toBe('test'); - expect(rule('aaa\ntest')).toBe('aaa\ntest'); - expect(rule('\naaa\ntest')).toBe('aaa\ntest'); - expect(rule('\n\n\naaa\ntest')).toBe('aaa\ntest'); - expect(rule('')).toBe(''); +test("should remove leading blank", () => { + const rule = getLeadingBlankFn([RuleConfigSeverity.Error, "never"]); + expect(rule("test")).toBe("test"); + expect(rule("\ntest")).toBe("test"); + expect(rule("\n\ntest")).toBe("test"); + expect(rule("aaa\ntest")).toBe("aaa\ntest"); + expect(rule("\naaa\ntest")).toBe("aaa\ntest"); + expect(rule("\n\n\naaa\ntest")).toBe("aaa\ntest"); + expect(rule("")).toBe(""); }); diff --git a/@commitlint/cz-commitlint/src/utils/leading-blank-fn.ts b/@commitlint/cz-commitlint/src/utils/leading-blank-fn.ts index c40e15637d..9400b8c1ed 100644 --- a/@commitlint/cz-commitlint/src/utils/leading-blank-fn.ts +++ b/@commitlint/cz-commitlint/src/utils/leading-blank-fn.ts @@ -1,5 +1,5 @@ -import type {Rule} from '../types.js'; -import {ruleIsActive, ruleIsNotApplicable} from './rules.js'; +import type { Rule } from "../types.js"; +import { ruleIsActive, ruleIsNotApplicable } from "./rules.js"; /** * Get forced leading for rule @@ -7,22 +7,22 @@ import {ruleIsActive, ruleIsNotApplicable} from './rules.js'; * @return transform function applying the leading */ export default function getLeadingBlankFn( - rule?: Rule + rule?: Rule, ): (input: string) => string { if (!rule || !ruleIsActive(rule)) { return (input: string): string => input; } const remove = (input: string): string => { - const fragments = input.split('\n'); - while (fragments.length > 0 && fragments[0] === '') { + const fragments = input.split("\n"); + while (fragments.length > 0 && fragments[0] === "") { fragments.shift(); } - return fragments.join('\n'); + return fragments.join("\n"); }; const lead = (input: string): string => { - const fragments = input.split('\n'); - return fragments[0] === '' ? input : ['', ...fragments].join('\n'); + const fragments = input.split("\n"); + return fragments[0] === "" ? input : ["", ...fragments].join("\n"); }; return !ruleIsNotApplicable(rule) ? lead : remove; diff --git a/@commitlint/cz-commitlint/src/utils/rules.test.ts b/@commitlint/cz-commitlint/src/utils/rules.test.ts index af93a40f7d..4c9855078c 100644 --- a/@commitlint/cz-commitlint/src/utils/rules.test.ts +++ b/@commitlint/cz-commitlint/src/utils/rules.test.ts @@ -1,5 +1,5 @@ -import {test, expect} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { test, expect } from "vitest"; +import { RuleConfigSeverity } from "@commitlint/types"; import { enumRuleIsActive, @@ -10,118 +10,118 @@ import { ruleIsApplicable, ruleIsDisabled, ruleIsNotApplicable, -} from './rules.js'; +} from "./rules.js"; -test('ruleIsDisabled', () => { +test("ruleIsDisabled", () => { expect(ruleIsDisabled([RuleConfigSeverity.Disabled])).toBe(true); - expect(ruleIsDisabled([RuleConfigSeverity.Disabled, 'never'])).toBe(true); - expect(ruleIsDisabled([RuleConfigSeverity.Disabled, 'always'])).toBe(true); + expect(ruleIsDisabled([RuleConfigSeverity.Disabled, "never"])).toBe(true); + expect(ruleIsDisabled([RuleConfigSeverity.Disabled, "always"])).toBe(true); expect(ruleIsDisabled([RuleConfigSeverity.Error] as any)).toBe(false); - expect(ruleIsDisabled([RuleConfigSeverity.Error, 'always'] as any)).toBe( - false + expect(ruleIsDisabled([RuleConfigSeverity.Error, "always"] as any)).toBe( + false, ); }); -test('ruleIsActive', () => { - expect(ruleIsActive([RuleConfigSeverity.Error, 'always'])).toBe(true); - expect(ruleIsActive([RuleConfigSeverity.Warning, 'never'])).toBe(true); - expect(ruleIsActive([RuleConfigSeverity.Disabled, 'always'])).toBe(false); +test("ruleIsActive", () => { + expect(ruleIsActive([RuleConfigSeverity.Error, "always"])).toBe(true); + expect(ruleIsActive([RuleConfigSeverity.Warning, "never"])).toBe(true); + expect(ruleIsActive([RuleConfigSeverity.Disabled, "always"])).toBe(false); expect(ruleIsActive([RuleConfigSeverity.Error] as any)).toBe(true); }); -test('ruleIsApplicable', () => { - expect(ruleIsApplicable([RuleConfigSeverity.Error, 'always'])).toBe(true); - expect(ruleIsApplicable([RuleConfigSeverity.Warning, 'always'])).toBe(true); - expect(ruleIsApplicable([RuleConfigSeverity.Disabled, 'always'])).toBe(true); +test("ruleIsApplicable", () => { + expect(ruleIsApplicable([RuleConfigSeverity.Error, "always"])).toBe(true); + expect(ruleIsApplicable([RuleConfigSeverity.Warning, "always"])).toBe(true); + expect(ruleIsApplicable([RuleConfigSeverity.Disabled, "always"])).toBe(true); expect(ruleIsApplicable(undefined as any)).toBe(false); - expect(ruleIsApplicable('' as any)).toBe(false); + expect(ruleIsApplicable("" as any)).toBe(false); expect(ruleIsApplicable([RuleConfigSeverity.Disabled])).toBe(false); - expect(ruleIsApplicable([RuleConfigSeverity.Disabled, 'never'])).toBe(false); + expect(ruleIsApplicable([RuleConfigSeverity.Disabled, "never"])).toBe(false); }); -test('ruleIsNotApplicable', () => { - expect(ruleIsNotApplicable([RuleConfigSeverity.Error, 'never'])).toBe(true); - expect(ruleIsNotApplicable([RuleConfigSeverity.Warning, 'never'])).toBe(true); - expect(ruleIsNotApplicable([RuleConfigSeverity.Disabled, 'never'])).toBe( - true +test("ruleIsNotApplicable", () => { + expect(ruleIsNotApplicable([RuleConfigSeverity.Error, "never"])).toBe(true); + expect(ruleIsNotApplicable([RuleConfigSeverity.Warning, "never"])).toBe(true); + expect(ruleIsNotApplicable([RuleConfigSeverity.Disabled, "never"])).toBe( + true, ); expect(ruleIsNotApplicable(undefined as any)).toBe(false); - expect(ruleIsNotApplicable('' as any)).toBe(false); + expect(ruleIsNotApplicable("" as any)).toBe(false); expect(ruleIsNotApplicable([RuleConfigSeverity.Error] as any)).toBe(false); - expect(ruleIsNotApplicable([RuleConfigSeverity.Error, 'always'])).toBe(false); - expect(ruleIsNotApplicable([RuleConfigSeverity.Error, 'always', 100])).toBe( - false + expect(ruleIsNotApplicable([RuleConfigSeverity.Error, "always"])).toBe(false); + expect(ruleIsNotApplicable([RuleConfigSeverity.Error, "always", 100])).toBe( + false, ); }); -test('getMaxLength', () => { - expect(getMaxLength([RuleConfigSeverity.Error, 'always', 100])).toBe(100); - expect(getMaxLength([RuleConfigSeverity.Warning, 'never'])).toBe(Infinity); - expect(getMaxLength([RuleConfigSeverity.Disabled, 'always'])).toBe(Infinity); +test("getMaxLength", () => { + expect(getMaxLength([RuleConfigSeverity.Error, "always", 100])).toBe(100); + expect(getMaxLength([RuleConfigSeverity.Warning, "never"])).toBe(Infinity); + expect(getMaxLength([RuleConfigSeverity.Disabled, "always"])).toBe(Infinity); expect(getMaxLength([RuleConfigSeverity.Error] as any)).toBe(Infinity); const rules: any = { - 'body-max-line-length': [RuleConfigSeverity.Error, 'always', 100], - 'header-max-length': [RuleConfigSeverity.Error, 'always', 100], - 'test-max-length': [RuleConfigSeverity.Disabled, 'always', 100], + "body-max-line-length": [RuleConfigSeverity.Error, "always", 100], + "header-max-length": [RuleConfigSeverity.Error, "always", 100], + "test-max-length": [RuleConfigSeverity.Disabled, "always", 100], }; - let lengthRule = rules['header-max-length']; + let lengthRule = rules["header-max-length"]; expect(getMaxLength(lengthRule)).toBe(100); - lengthRule = rules['body-max-line-length']; + lengthRule = rules["body-max-line-length"]; expect(getMaxLength(lengthRule)).toBe(100); - lengthRule = rules['body-max-length']; + lengthRule = rules["body-max-length"]; expect(getMaxLength(lengthRule)).toBe(Infinity); - lengthRule = rules['test-max-length']; + lengthRule = rules["test-max-length"]; expect(getMaxLength(lengthRule)).toBe(Infinity); }); -test('getMinLength', () => { - expect(getMinLength([RuleConfigSeverity.Error, 'always', 10])).toBe(10); - expect(getMinLength([RuleConfigSeverity.Warning, 'never'])).toBe(0); - expect(getMinLength([RuleConfigSeverity.Disabled, 'always'])).toBe(0); +test("getMinLength", () => { + expect(getMinLength([RuleConfigSeverity.Error, "always", 10])).toBe(10); + expect(getMinLength([RuleConfigSeverity.Warning, "never"])).toBe(0); + expect(getMinLength([RuleConfigSeverity.Disabled, "always"])).toBe(0); expect(getMinLength([RuleConfigSeverity.Error] as any)).toBe(0); const rules: any = { - 'body-min-length': [RuleConfigSeverity.Error, 'always', 10], - 'footer-min-length': [RuleConfigSeverity.Error, 'always', 20], - 'test-min-length': [RuleConfigSeverity.Disabled, 'always', 100], + "body-min-length": [RuleConfigSeverity.Error, "always", 10], + "footer-min-length": [RuleConfigSeverity.Error, "always", 20], + "test-min-length": [RuleConfigSeverity.Disabled, "always", 100], }; - let lengthRule = rules['header-min-length']; + let lengthRule = rules["header-min-length"]; expect(getMinLength(lengthRule)).toBe(0); - lengthRule = rules['body-min-length']; + lengthRule = rules["body-min-length"]; expect(getMinLength(lengthRule)).toBe(10); - lengthRule = rules['test-min-length']; + lengthRule = rules["test-min-length"]; expect(getMinLength(lengthRule)).toBe(0); }); -test('enumRuleIsActive', () => { +test("enumRuleIsActive", () => { const rules: any = { - 'enum-string': [RuleConfigSeverity.Warning, 'always', ['1', '2', '3']], - 'type-enum': [RuleConfigSeverity.Error, 'always', ['build', 'chore', 'ci']], - 'scope-enum': [RuleConfigSeverity.Error, 'never', ['cli', 'core', 'lint']], - 'bar-enum': [RuleConfigSeverity.Disabled, 'always', ['foo', 'bar', 'baz']], + "enum-string": [RuleConfigSeverity.Warning, "always", ["1", "2", "3"]], + "type-enum": [RuleConfigSeverity.Error, "always", ["build", "chore", "ci"]], + "scope-enum": [RuleConfigSeverity.Error, "never", ["cli", "core", "lint"]], + "bar-enum": [RuleConfigSeverity.Disabled, "always", ["foo", "bar", "baz"]], }; - expect(enumRuleIsActive(rules['type-enum'])).toBe(true); - expect(enumRuleIsActive(rules['string-enum'])).toBe(false); - expect(enumRuleIsActive(rules['enum-string'])).toBe(true); - expect(enumRuleIsActive(rules['bar-enum'])).toBe(false); - expect(enumRuleIsActive(rules['scope-enum'])).toBe(false); + expect(enumRuleIsActive(rules["type-enum"])).toBe(true); + expect(enumRuleIsActive(rules["string-enum"])).toBe(false); + expect(enumRuleIsActive(rules["enum-string"])).toBe(true); + expect(enumRuleIsActive(rules["bar-enum"])).toBe(false); + expect(enumRuleIsActive(rules["scope-enum"])).toBe(false); }); -test('getEnumList', () => { +test("getEnumList", () => { const rules: any = { - 'type-enum': [RuleConfigSeverity.Error, 'always', ['build', 'chore', 'ci']], - 'scope-enum': [RuleConfigSeverity.Error, 'never', ''], - 'bar-enum': [RuleConfigSeverity.Disabled, 'always'], + "type-enum": [RuleConfigSeverity.Error, "always", ["build", "chore", "ci"]], + "scope-enum": [RuleConfigSeverity.Error, "never", ""], + "bar-enum": [RuleConfigSeverity.Disabled, "always"], }; - expect(getEnumList(rules['type-enum'])).toEqual(['build', 'chore', 'ci']); - expect(getEnumList(rules['scope-enum'])).toEqual([]); - expect(getEnumList(rules['bar-enum'])).toEqual([]); + expect(getEnumList(rules["type-enum"])).toEqual(["build", "chore", "ci"]); + expect(getEnumList(rules["scope-enum"])).toEqual([]); + expect(getEnumList(rules["bar-enum"])).toEqual([]); }); diff --git a/@commitlint/cz-commitlint/src/utils/rules.ts b/@commitlint/cz-commitlint/src/utils/rules.ts index 03557c4eef..d2570cd392 100644 --- a/@commitlint/cz-commitlint/src/utils/rules.ts +++ b/@commitlint/cz-commitlint/src/utils/rules.ts @@ -1,8 +1,8 @@ -import {RuleConfigSeverity} from '@commitlint/types'; -import type {Rule} from '../types.js'; +import { RuleConfigSeverity } from "@commitlint/types"; +import type { Rule } from "../types.js"; export function ruleIsDisabled( - rule: Rule + rule: Rule, ): rule is Readonly<[RuleConfigSeverity.Disabled]> { if (rule && Array.isArray(rule) && rule[0] === RuleConfigSeverity.Disabled) { return true; @@ -16,7 +16,7 @@ export function ruleIsDisabled( * @return if the rule definition is active */ export function ruleIsActive<T extends Rule>( - rule: T + rule: T, ): rule is Exclude<T, Readonly<[RuleConfigSeverity.Disabled]>> { if (rule && Array.isArray(rule)) { return rule[0] > RuleConfigSeverity.Disabled; @@ -30,12 +30,12 @@ export function ruleIsActive<T extends Rule>( * @return if the rule definition is applicable */ export function ruleIsApplicable( - rule: Rule + rule: Rule, ): rule is - | Readonly<[RuleConfigSeverity, 'always']> - | Readonly<[RuleConfigSeverity, 'always', unknown]> { + | Readonly<[RuleConfigSeverity, "always"]> + | Readonly<[RuleConfigSeverity, "always", unknown]> { if (rule && Array.isArray(rule)) { - return rule[1] === 'always'; + return rule[1] === "always"; } return false; } @@ -46,20 +46,20 @@ export function ruleIsApplicable( * @return if the rule definition is applicable */ export function ruleIsNotApplicable( - rule: Rule + rule: Rule, ): rule is - | Readonly<[RuleConfigSeverity, 'never']> - | Readonly<[RuleConfigSeverity, 'never', unknown]> { + | Readonly<[RuleConfigSeverity, "never"]> + | Readonly<[RuleConfigSeverity, "never", unknown]> { if (rule && Array.isArray(rule)) { - return rule[1] === 'never'; + return rule[1] === "never"; } return false; } export function enumRuleIsActive( - rule: Rule + rule: Rule, ): rule is Readonly< - [RuleConfigSeverity.Warning | RuleConfigSeverity.Error, 'always', string[]] + [RuleConfigSeverity.Warning | RuleConfigSeverity.Error, "always", string[]] > { return ( ruleIsActive(rule) && @@ -78,7 +78,7 @@ export function getMaxLength(rule?: Rule): number { rule && ruleIsActive(rule) && ruleIsApplicable(rule) && - typeof rule[2] === 'number' + typeof rule[2] === "number" ) { return rule[2]; } @@ -90,7 +90,7 @@ export function getMinLength(rule?: Rule): number { rule && ruleIsActive(rule) && ruleIsApplicable(rule) && - typeof rule[2] === 'number' + typeof rule[2] === "number" ) { return rule[2]; } diff --git a/@commitlint/cz-commitlint/tsconfig.json b/@commitlint/cz-commitlint/tsconfig.json index ff127af5ca..47e6ae4531 100644 --- a/@commitlint/cz-commitlint/tsconfig.json +++ b/@commitlint/cz-commitlint/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./src/**/*-test.ts", "./lib/**/*"], - "references": [{"path": "../cli"}] + "references": [{ "path": "../cli" }] } diff --git a/@commitlint/ensure/CHANGELOG.md b/@commitlint/ensure/CHANGELOG.md index 2d6bc9be75..611e79b829 100644 --- a/@commitlint/ensure/CHANGELOG.md +++ b/@commitlint/ensure/CHANGELOG.md @@ -3,6 +3,40 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + + +* feat(rules)!: make body-max-line-length ignore lines with URLs (#4486) ([2f37a88](https://github.com/conventional-changelog/commitlint/commit/2f37a886be4b07bcd8e1126cc6a13256e7b6cc37)), closes [#4486](https://github.com/conventional-changelog/commitlint/issues/4486) + + +### BREAKING CHANGES + +* when lines contain URLs exceeding the maximum +line length `body-max-line-length` will be ignored + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/ensure + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/ensure diff --git a/@commitlint/ensure/package.json b/@commitlint/ensure/package.json index b91140531f..5b439abef3 100644 --- a/@commitlint/ensure/package.json +++ b/@commitlint/ensure/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/ensure", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Lint your commit messages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,7 +36,7 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/utils": "^19.5.0", + "@commitlint/utils": "^20.0.0", "@types/lodash.camelcase": "^4.3.8", "@types/lodash.kebabcase": "^4.1.8", "@types/lodash.snakecase": "^4.1.8", @@ -45,12 +45,12 @@ "glob": "^10.3.10" }, "dependencies": { - "@commitlint/types": "^19.5.0", + "@commitlint/types": "^20.0.0", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", "lodash.startcase": "^4.4.0", "lodash.upperfirst": "^4.3.1" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/ensure/src/case.test.ts b/@commitlint/ensure/src/case.test.ts index 19957b0fb0..d812da8bf4 100644 --- a/@commitlint/ensure/src/case.test.ts +++ b/@commitlint/ensure/src/case.test.ts @@ -1,340 +1,340 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import ensure from './case.js'; +import ensure from "./case.js"; -test('true for no params', () => { +test("true for no params", () => { const actual = ensure(); expect(actual).toBe(true); }); -test('true for empty', () => { - const actual = ensure(''); +test("true for empty", () => { + const actual = ensure(""); expect(actual).toBe(true); }); -test('true for lowercase', () => { - const actual = ensure('a'); +test("true for lowercase", () => { + const actual = ensure("a"); expect(actual).toBe(true); }); -test('false for uppercase', () => { - const actual = ensure('A'); +test("false for uppercase", () => { + const actual = ensure("A"); expect(actual).toBe(false); }); -test('true for lowercase on lowercase', () => { - const actual = ensure('a', 'lowercase'); +test("true for lowercase on lowercase", () => { + const actual = ensure("a", "lowercase"); expect(actual).toBe(true); }); -test('false for uppercase on lowercase', () => { - const actual = ensure('A', 'lowercase'); +test("false for uppercase on lowercase", () => { + const actual = ensure("A", "lowercase"); expect(actual).toBe(false); }); -test('true for * on lowercase', () => { - const actual = ensure('*', 'lowercase'); +test("true for * on lowercase", () => { + const actual = ensure("*", "lowercase"); expect(actual).toBe(true); }); -test('true for uppercase on uppercase', () => { - const actual = ensure('A', 'uppercase'); +test("true for uppercase on uppercase", () => { + const actual = ensure("A", "uppercase"); expect(actual).toBe(true); }); -test('false for lowercase on uppercase', () => { - const actual = ensure('a', 'uppercase'); +test("false for lowercase on uppercase", () => { + const actual = ensure("a", "uppercase"); expect(actual).toBe(false); }); -test('true for * on uppercase', () => { - const actual = ensure('*', 'uppercase'); +test("true for * on uppercase", () => { + const actual = ensure("*", "uppercase"); expect(actual).toBe(true); }); -test('true for sentencecase on sentencecase', () => { - const actual = ensure('Sentence case', 'sentence-case'); +test("true for sentencecase on sentencecase", () => { + const actual = ensure("Sentence case", "sentence-case"); expect(actual).toBe(true); }); -test('false for lowercase on sentencecase', () => { - const actual = ensure('sentence case', 'sentence-case'); +test("false for lowercase on sentencecase", () => { + const actual = ensure("sentence case", "sentence-case"); expect(actual).toBe(false); }); -test('true for UPPERCASE on sentencecase', () => { - const actual = ensure('UPPERCASE', 'sentence-case'); +test("true for UPPERCASE on sentencecase", () => { + const actual = ensure("UPPERCASE", "sentence-case"); expect(actual).toBe(true); }); -test('true for Start Case on sentencecase', () => { - const actual = ensure('Start Case', 'sentence-case'); +test("true for Start Case on sentencecase", () => { + const actual = ensure("Start Case", "sentence-case"); expect(actual).toBe(true); }); -test('true for PascalCase on sentencecase', () => { - const actual = ensure('PascalCase', 'sentence-case'); +test("true for PascalCase on sentencecase", () => { + const actual = ensure("PascalCase", "sentence-case"); expect(actual).toBe(true); }); -test('false for kebab-case on sentencecase', () => { - const actual = ensure('kebab-case', 'sentence-case'); +test("false for kebab-case on sentencecase", () => { + const actual = ensure("kebab-case", "sentence-case"); expect(actual).toBe(false); }); -test('false for snake_case on sentencecase', () => { - const actual = ensure('snake_case', 'sentence-case'); +test("false for snake_case on sentencecase", () => { + const actual = ensure("snake_case", "sentence-case"); expect(actual).toBe(false); }); -test('false for camelCase on sentencecase', () => { - const actual = ensure('camelCase', 'sentence-case'); +test("false for camelCase on sentencecase", () => { + const actual = ensure("camelCase", "sentence-case"); expect(actual).toBe(false); }); -test('true for * on sentence-case', () => { - const actual = ensure('*', 'sentence-case'); +test("true for * on sentence-case", () => { + const actual = ensure("*", "sentence-case"); expect(actual).toBe(true); }); -test('true for * on camel-case', () => { - const actual = ensure('*', 'camel-case'); +test("true for * on camel-case", () => { + const actual = ensure("*", "camel-case"); expect(actual).toBe(true); }); -test('true for * on kebab-case', () => { - const actual = ensure('*', 'kebab-case'); +test("true for * on kebab-case", () => { + const actual = ensure("*", "kebab-case"); expect(actual).toBe(true); }); -test('true for * on snake-case', () => { - const actual = ensure('*', 'snake-case'); +test("true for * on snake-case", () => { + const actual = ensure("*", "snake-case"); expect(actual).toBe(true); }); -test('true for * on pascal-case', () => { - const actual = ensure('*', 'pascal-case'); +test("true for * on pascal-case", () => { + const actual = ensure("*", "pascal-case"); expect(actual).toBe(true); }); -test('true for * on start-case', () => { - const actual = ensure('*', 'start-case'); +test("true for * on start-case", () => { + const actual = ensure("*", "start-case"); expect(actual).toBe(true); }); -test('true for `Any_CASE_iN_back-quotes` on lowercase', () => { - const actual = ensure('`Any_CASE_iN_back-quotes`', 'lowercase'); +test("true for `Any_CASE_iN_back-quotes` on lowercase", () => { + const actual = ensure("`Any_CASE_iN_back-quotes`", "lowercase"); expect(actual).toBe(true); }); -test('true for `Any_CASE_iN_back-quotes` on uppercase', () => { - const actual = ensure('`Any_CASE_iN_back-quotes`', 'uppercase'); +test("true for `Any_CASE_iN_back-quotes` on uppercase", () => { + const actual = ensure("`Any_CASE_iN_back-quotes`", "uppercase"); expect(actual).toBe(true); }); -test('true for `Any_CASE_iN_back-quotes` on sentence-case', () => { - const actual = ensure('`Any_CASE_iN_back-quotes`', 'sentence-case'); +test("true for `Any_CASE_iN_back-quotes` on sentence-case", () => { + const actual = ensure("`Any_CASE_iN_back-quotes`", "sentence-case"); expect(actual).toBe(true); }); -test('true for `Any_CASE_iN_back-quotes` on camel-case', () => { - const actual = ensure('`Any_CASE_iN_back-quotes`', 'camel-case'); +test("true for `Any_CASE_iN_back-quotes` on camel-case", () => { + const actual = ensure("`Any_CASE_iN_back-quotes`", "camel-case"); expect(actual).toBe(true); }); -test('true for `Any_CASE_iN_back-quotes` on kebab-case', () => { - const actual = ensure('`Any_CASE_iN_back-quotes`', 'kebab-case'); +test("true for `Any_CASE_iN_back-quotes` on kebab-case", () => { + const actual = ensure("`Any_CASE_iN_back-quotes`", "kebab-case"); expect(actual).toBe(true); }); -test('true for `Any_CASE_iN_back-quotes` on snake-case', () => { - const actual = ensure('`Any_CASE_iN_back-quotes`', 'snake-case'); +test("true for `Any_CASE_iN_back-quotes` on snake-case", () => { + const actual = ensure("`Any_CASE_iN_back-quotes`", "snake-case"); expect(actual).toBe(true); }); -test('true for `Any_CASE_iN_back-quotes` on pascal-case', () => { - const actual = ensure('`Any_CASE_iN_back-quotes`', 'pascal-case'); +test("true for `Any_CASE_iN_back-quotes` on pascal-case", () => { + const actual = ensure("`Any_CASE_iN_back-quotes`", "pascal-case"); expect(actual).toBe(true); }); -test('true for `Any_CASE_iN_back-quotes` on start-case', () => { - const actual = ensure('`Any_CASE_iN_back-quotes`', 'start-case'); +test("true for `Any_CASE_iN_back-quotes` on start-case", () => { + const actual = ensure("`Any_CASE_iN_back-quotes`", "start-case"); expect(actual).toBe(true); }); -test('true for lowercase `Any_CASE_iN_back-quotes` lowercase on lowercase', () => { +test("true for lowercase `Any_CASE_iN_back-quotes` lowercase on lowercase", () => { const actual = ensure( - 'lowercase `Any_CASE_iN_back-quotes` lowercase', - 'lowercase' + "lowercase `Any_CASE_iN_back-quotes` lowercase", + "lowercase", ); expect(actual).toBe(true); }); -test('false for UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE on lowercase', () => { +test("false for UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE on lowercase", () => { const actual = ensure( - 'UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE', - 'lowercase' + "UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE", + "lowercase", ); expect(actual).toBe(false); }); -test('true for UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE on uppercase', () => { +test("true for UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE on uppercase", () => { const actual = ensure( - 'UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE', - 'uppercase' + "UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE", + "uppercase", ); expect(actual).toBe(true); }); -test('false for lowercase `Any_CASE_iN_back-quotes` lowercase on uppercase', () => { +test("false for lowercase `Any_CASE_iN_back-quotes` lowercase on uppercase", () => { const actual = ensure( - 'lowercase `Any_CASE_iN_back-quotes` lowercase', - 'uppercase' + "lowercase `Any_CASE_iN_back-quotes` lowercase", + "uppercase", ); expect(actual).toBe(false); }); -test('true for fooBar`Any_CASE_iN_back-quotes`fooBar on camel-case', () => { - const actual = ensure('fooBar`Any_CASE_iN_back-quotes`fooBar', 'camel-case'); +test("true for fooBar`Any_CASE_iN_back-quotes`fooBar on camel-case", () => { + const actual = ensure("fooBar`Any_CASE_iN_back-quotes`fooBar", "camel-case"); expect(actual).toBe(true); }); -test('false for Foo Bar`Any_CASE_iN_back-quotes` Foo Bar on camel-case', () => { +test("false for Foo Bar`Any_CASE_iN_back-quotes` Foo Bar on camel-case", () => { const actual = ensure( - 'Foo Bar`Any_CASE_iN_back-quotes` Foo Bar', - 'camel-case' + "Foo Bar`Any_CASE_iN_back-quotes` Foo Bar", + "camel-case", ); expect(actual).toBe(false); }); -test('true for foo-bar`Any_CASE_iN_back-quotes`foo-bar on kebab-case', () => { +test("true for foo-bar`Any_CASE_iN_back-quotes`foo-bar on kebab-case", () => { const actual = ensure( - 'foo-bar`Any_CASE_iN_back-quotes`foo-bar', - 'kebab-case' + "foo-bar`Any_CASE_iN_back-quotes`foo-bar", + "kebab-case", ); expect(actual).toBe(true); }); -test('false for Foo Bar `Any_CASE_iN_back-quotes` Foo Bar on kebab-case', () => { +test("false for Foo Bar `Any_CASE_iN_back-quotes` Foo Bar on kebab-case", () => { const actual = ensure( - 'Foo Bar `Any_CASE_iN_back-quotes` Foo Bar', - 'kebab-case' + "Foo Bar `Any_CASE_iN_back-quotes` Foo Bar", + "kebab-case", ); expect(actual).toBe(false); }); -test('true for foo_bar`Any_CASE_iN_back-quotes`foo_bar on snake-case', () => { +test("true for foo_bar`Any_CASE_iN_back-quotes`foo_bar on snake-case", () => { const actual = ensure( - 'foo_bar`Any_CASE_iN_back-quotes`foo_bar', - 'snake-case' + "foo_bar`Any_CASE_iN_back-quotes`foo_bar", + "snake-case", ); expect(actual).toBe(true); }); -test('false for Foo Bar `Any_CASE_iN_back-quotes` Foo Bar on snake-case', () => { +test("false for Foo Bar `Any_CASE_iN_back-quotes` Foo Bar on snake-case", () => { const actual = ensure( - 'Foo Bar `Any_CASE_iN_back-quotes` Foo Bar', - 'snake-case' + "Foo Bar `Any_CASE_iN_back-quotes` Foo Bar", + "snake-case", ); expect(actual).toBe(false); }); -test('true for PascalCase`Any_CASE_iN_back-quotes`PascalCase on pascal-case', () => { +test("true for PascalCase`Any_CASE_iN_back-quotes`PascalCase on pascal-case", () => { const actual = ensure( - 'PascalCase`Any_CASE_iN_back-quotes`PascalCase', - 'pascal-case' + "PascalCase`Any_CASE_iN_back-quotes`PascalCase", + "pascal-case", ); expect(actual).toBe(true); }); -test('false for Foo Bar `Any_CASE_iN_back-quotes` Foo Bar on pascal-case', () => { +test("false for Foo Bar `Any_CASE_iN_back-quotes` Foo Bar on pascal-case", () => { const actual = ensure( - 'Foo Bar `Any_CASE_iN_back-quotes` Foo Bar', - 'pascal-case' + "Foo Bar `Any_CASE_iN_back-quotes` Foo Bar", + "pascal-case", ); expect(actual).toBe(false); }); -test('true for Foo Bar`Any_CASE_iN_back-quotes` Foo Bar on start-case', () => { +test("true for Foo Bar`Any_CASE_iN_back-quotes` Foo Bar on start-case", () => { const actual = ensure( - 'Foo Bar `Any_CASE_iN_back-quotes`Foo Bar', - 'start-case' + "Foo Bar `Any_CASE_iN_back-quotes`Foo Bar", + "start-case", ); expect(actual).toBe(true); }); -test('false for foo_bar`Any_CASE_iN_back-quotes`foo_bar on start-case', () => { +test("false for foo_bar`Any_CASE_iN_back-quotes`foo_bar on start-case", () => { const actual = ensure( - 'foo_bar`Any_CASE_iN_back-quotes`foo_bar', - 'start-case' + "foo_bar`Any_CASE_iN_back-quotes`foo_bar", + "start-case", ); expect(actual).toBe(false); }); -test('true for lowercase `Any_CASE_iN_back-quotes` `Any_CASE_iN_back-quotes` lowercase on lowercase', () => { +test("true for lowercase `Any_CASE_iN_back-quotes` `Any_CASE_iN_back-quotes` lowercase on lowercase", () => { const actual = ensure( - 'lowercase `Any_CASE_iN_back-quotes` `Any_CASE_iN_back-quotes` lowercase', - 'lowercase' + "lowercase `Any_CASE_iN_back-quotes` `Any_CASE_iN_back-quotes` lowercase", + "lowercase", ); expect(actual).toBe(true); }); test("true for 'Any_CASE_iN_single-quotes' on lowercase", () => { - const actual = ensure("'Any_CASE_iN_single-quotes'", 'lowercase'); + const actual = ensure("'Any_CASE_iN_single-quotes'", "lowercase"); expect(actual).toBe(true); }); test('true for "Any_CASE_iN_double-quotes" on lowercase', () => { - const actual = ensure('"Any_CASE_iN_double-quotes"', 'lowercase'); + const actual = ensure('"Any_CASE_iN_double-quotes"', "lowercase"); expect(actual).toBe(true); }); -test('true for `lowercasel"\'` on lowercase', () => { - const actual = ensure('`lowercasel"\'`', 'lowercase'); +test("true for `lowercasel\"'` on lowercase", () => { + const actual = ensure("`lowercasel\"'`", "lowercase"); expect(actual).toBe(true); }); -test('false for `LOWERCASE on lowercase', () => { - const actual = ensure('`LOWERCASE', 'lowercase'); +test("false for `LOWERCASE on lowercase", () => { + const actual = ensure("`LOWERCASE", "lowercase"); expect(actual).toBe(false); }); -test('true for numeric on camel-case', () => { - const actual = ensure('1.0.0', 'camel-case'); +test("true for numeric on camel-case", () => { + const actual = ensure("1.0.0", "camel-case"); expect(actual).toBe(true); }); -test('true for numeric on kebab-case', () => { - const actual = ensure('1.0.0', 'kebab-case'); +test("true for numeric on kebab-case", () => { + const actual = ensure("1.0.0", "kebab-case"); expect(actual).toBe(true); }); -test('true for numeric on snake-case', () => { - const actual = ensure('1.0.0', 'snake-case'); +test("true for numeric on snake-case", () => { + const actual = ensure("1.0.0", "snake-case"); expect(actual).toBe(true); }); -test('true for numeric on pascal-case', () => { - const actual = ensure('1.0.0', 'pascal-case'); +test("true for numeric on pascal-case", () => { + const actual = ensure("1.0.0", "pascal-case"); expect(actual).toBe(true); }); -test('true for numeric on uppercase', () => { - const actual = ensure('1.0.0', 'uppercase'); +test("true for numeric on uppercase", () => { + const actual = ensure("1.0.0", "uppercase"); expect(actual).toBe(true); }); -test('true for numeric on sentencecase', () => { - const actual = ensure('1.0.0', 'sentencecase'); +test("true for numeric on sentencecase", () => { + const actual = ensure("1.0.0", "sentencecase"); expect(actual).toBe(true); }); -test('true for numeric on lowercase', () => { - const actual = ensure('1.0.0', 'lowercase'); +test("true for numeric on lowercase", () => { + const actual = ensure("1.0.0", "lowercase"); expect(actual).toBe(true); }); -test('throw TypeError for invalid case name', () => { - const actualFn = () => ensure('anything', 'someweirdcase' as any); +test("throw TypeError for invalid case name", () => { + const actualFn = () => ensure("anything", "someweirdcase" as any); expect(actualFn).toThrow(TypeError); }); diff --git a/@commitlint/ensure/src/case.ts b/@commitlint/ensure/src/case.ts index bae88a0bff..710f7e79b8 100644 --- a/@commitlint/ensure/src/case.ts +++ b/@commitlint/ensure/src/case.ts @@ -1,22 +1,22 @@ -import type {TargetCaseType} from '@commitlint/types'; +import type { TargetCaseType } from "@commitlint/types"; -import toCase from './to-case.js'; +import toCase from "./to-case.js"; export default ensureCase; function ensureCase( - raw: string = '', - target: TargetCaseType = 'lowercase' + raw: string = "", + target: TargetCaseType = "lowercase", ): boolean { // We delete any content together with quotes because he can contains proper names (example `refactor: `Eslint` configuration`). // We need trim string because content with quotes can be at the beginning or end of a line const input = String(raw) - .replace(/`.*?`|".*?"|'.*?'/g, '') + .replace(/`.*?`|".*?"|'.*?'/g, "") .trim(); const transformed = toCase(input, target); - if (transformed === '' || transformed.match(/^\d/)) { + if (transformed === "" || transformed.match(/^\d/)) { return true; } diff --git a/@commitlint/ensure/src/enum.test.ts b/@commitlint/ensure/src/enum.test.ts index a09b70bec2..817f2ce072 100644 --- a/@commitlint/ensure/src/enum.test.ts +++ b/@commitlint/ensure/src/enum.test.ts @@ -1,48 +1,48 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import ensure from './enum.js'; +import ensure from "./enum.js"; -test('false for no params', () => { +test("false for no params", () => { const actual = (ensure as () => boolean)(); expect(actual).toBe(false); }); -test('false for not array enums', () => { - const actual = ensure('a', 'a' as any); +test("false for not array enums", () => { + const actual = ensure("a", "a" as any); expect(actual).toBe(false); }); -test('true for a against a', () => { - const actual = ensure('a', ['a']); +test("true for a against a", () => { + const actual = ensure("a", ["a"]); expect(actual).toBe(true); }); -test('false for a against b', () => { - const actual = ensure('a', ['b']); +test("false for a against b", () => { + const actual = ensure("a", ["b"]); expect(actual).toBe(false); }); -test('true for a against a, b', () => { - const actual = ensure('a', ['a', 'b']); +test("true for a against a, b", () => { + const actual = ensure("a", ["a", "b"]); expect(actual).toBe(true); }); -test('false for b against a', () => { - const actual = ensure('b', ['a']); +test("false for b against a", () => { + const actual = ensure("b", ["a"]); expect(actual).toBe(false); }); -test('true for b against b', () => { - const actual = ensure('b', ['b']); +test("true for b against b", () => { + const actual = ensure("b", ["b"]); expect(actual).toBe(true); }); -test('true for b against a, b', () => { - const actual = ensure('b', ['a', 'b']); +test("true for b against a, b", () => { + const actual = ensure("b", ["a", "b"]); expect(actual).toBe(true); }); -test('false for c against a, b', () => { - const actual = ensure('c', ['a', 'b']); +test("false for c against a, b", () => { + const actual = ensure("c", ["a", "b"]); expect(actual).toBe(false); }); diff --git a/@commitlint/ensure/src/index.test.ts b/@commitlint/ensure/src/index.test.ts index 859ed49b3a..b58bb64adc 100644 --- a/@commitlint/ensure/src/index.test.ts +++ b/@commitlint/ensure/src/index.test.ts @@ -1,17 +1,17 @@ -import {test, expect} from 'vitest'; -import path from 'path'; -import {fileURLToPath} from 'url'; +import { test, expect } from "vitest"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; -import {globSync} from 'glob'; -import camelCase from 'lodash.camelcase'; +import { globSync } from "glob"; +import camelCase from "lodash.camelcase"; -import * as ensure from './index.js'; +import * as ensure from "./index.js"; -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); -test('exports all checkers', async () => { - const ignore = ['types']; - const expected = _glob('*.ts') +test("exports all checkers", async () => { + const ignore = ["types"]; + const expected = _glob("*.ts") .map((f) => camelCase(f)) .sort() .filter((item) => !ignore.includes(item)); @@ -19,14 +19,14 @@ test('exports all checkers', async () => { expect(actual).toEqual(expected); }); -test('rules export functions', () => { +test("rules export functions", () => { const actual = Object.values(ensure); - expect(actual.every((rule) => typeof rule === 'function')).toBe(true); + expect(actual.every((rule) => typeof rule === "function")).toBe(true); }); function _glob(pattern: string): string[] { const files = globSync(pattern, { - ignore: ['**/index.ts', '**/*.test.ts'], + ignore: ["**/index.ts", "**/*.test.ts"], cwd: __dirname, }); return files.map(relative).map(toExport); diff --git a/@commitlint/ensure/src/index.ts b/@commitlint/ensure/src/index.ts index 496832bf57..0590b145a3 100644 --- a/@commitlint/ensure/src/index.ts +++ b/@commitlint/ensure/src/index.ts @@ -1,11 +1,11 @@ -import ensureCase from './case.js'; -import ensureEnum from './enum.js'; -import maxLength from './max-length.js'; -import maxLineLength from './max-line-length.js'; -import minLength from './min-length.js'; -import notEmpty from './not-empty.js'; -import toCase from './to-case.js'; +import ensureCase from "./case.js"; +import ensureEnum from "./enum.js"; +import maxLength from "./max-length.js"; +import maxLineLength from "./max-line-length.js"; +import minLength from "./min-length.js"; +import notEmpty from "./not-empty.js"; +import toCase from "./to-case.js"; -export {ensureCase as case}; -export {ensureEnum as enum}; -export {maxLength, maxLineLength, minLength, notEmpty, toCase}; +export { ensureCase as case }; +export { ensureEnum as enum }; +export { maxLength, maxLineLength, minLength, notEmpty, toCase }; diff --git a/@commitlint/ensure/src/max-length.test.ts b/@commitlint/ensure/src/max-length.test.ts index 99c3813281..c18af918e8 100644 --- a/@commitlint/ensure/src/max-length.test.ts +++ b/@commitlint/ensure/src/max-length.test.ts @@ -1,28 +1,28 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import ensure from './max-length.js'; +import ensure from "./max-length.js"; -test('false for no params', () => { +test("false for no params", () => { const actual = (ensure as () => boolean)(); expect(actual).toBe(false); }); -test('true for a against 1', () => { - const actual = ensure('a', 1); +test("true for a against 1", () => { + const actual = ensure("a", 1); expect(actual).toBe(true); }); -test('false for ab against 0', () => { - const actual = ensure('a', 0); +test("false for ab against 0", () => { + const actual = ensure("a", 0); expect(actual).toBe(false); }); -test('true for a against 2', () => { - const actual = ensure('a', 2); +test("true for a against 2", () => { + const actual = ensure("a", 2); expect(actual).toBe(true); }); -test('true for ab against 2', () => { - const actual = ensure('ab', 2); +test("true for ab against 2", () => { + const actual = ensure("ab", 2); expect(actual).toBe(true); }); diff --git a/@commitlint/ensure/src/max-length.ts b/@commitlint/ensure/src/max-length.ts index 009ee0fa2e..2c78246b8a 100644 --- a/@commitlint/ensure/src/max-length.ts +++ b/@commitlint/ensure/src/max-length.ts @@ -1,2 +1,2 @@ export default (value: string | null, max: number): boolean => - typeof value === 'string' && value.length <= max; + typeof value === "string" && value.length <= max; diff --git a/@commitlint/ensure/src/max-line-length.test.ts b/@commitlint/ensure/src/max-line-length.test.ts index a51069a29a..8755824abd 100644 --- a/@commitlint/ensure/src/max-line-length.test.ts +++ b/@commitlint/ensure/src/max-line-length.test.ts @@ -1,49 +1,49 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import ensure from './max-line-length.js'; +import ensure from "./max-line-length.js"; -test('false for no params', () => { +test("false for no params", () => { const actual = (ensure as () => boolean)(); expect(actual).toBe(false); }); -test('true for a against 1', () => { - const actual = ensure('a', 1); +test("true for a against 1", () => { + const actual = ensure("a", 1); expect(actual).toBe(true); }); -test('false for ab against 0', () => { - const actual = ensure('a', 0); +test("false for ab against 0", () => { + const actual = ensure("a", 0); expect(actual).toBe(false); }); -test('true for a against 2', () => { - const actual = ensure('a', 2); +test("true for a against 2", () => { + const actual = ensure("a", 2); expect(actual).toBe(true); }); -test('true for ab against 2', () => { - const actual = ensure('ab', 2); +test("true for ab against 2", () => { + const actual = ensure("ab", 2); expect(actual).toBe(true); }); -test('false for ab/\nab/\nab 1', () => { +test("false for ab/\nab/\nab 1", () => { const actual = ensure( `ab ab ab`, - 2 + 2, ); expect(actual).toBe(true); }); -test('true for ab/\nab/\nab 2', () => { +test("true for ab/\nab/\nab 2", () => { const actual = ensure( `ab ab ab`, - 2 + 2, ); expect(actual).toBe(true); diff --git a/@commitlint/ensure/src/max-line-length.ts b/@commitlint/ensure/src/max-line-length.ts index 51f0bfaa4b..b25a2b6d1e 100644 --- a/@commitlint/ensure/src/max-line-length.ts +++ b/@commitlint/ensure/src/max-line-length.ts @@ -1,5 +1,13 @@ -import ensure from './max-length.js'; +import ensure from "./max-length.js"; + +// Allow an exception for long lines which contain URLs. +// +// This is overly lenient, in order to avoid costly regexps which +// have to worry about all the many edge cases of valid URLs. +const URL_REGEX = /\bhttps?:\/\/\S+/; export default (value: string, max: number): boolean => - typeof value === 'string' && - value.split(/\r?\n/).every((line) => ensure(line, max)); + typeof value === "string" && + value + .split(/\r?\n/) + .every((line) => URL_REGEX.test(line) || ensure(line, max)); diff --git a/@commitlint/ensure/src/min-length.test.ts b/@commitlint/ensure/src/min-length.test.ts index 8530b80811..a62395e3d1 100644 --- a/@commitlint/ensure/src/min-length.test.ts +++ b/@commitlint/ensure/src/min-length.test.ts @@ -1,28 +1,28 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import ensure from './min-length.js'; +import ensure from "./min-length.js"; -test('false for no params', () => { +test("false for no params", () => { const actual = (ensure as () => boolean)(); expect(actual).toBe(false); }); -test('true for a against 1', () => { - const actual = ensure('a', 1); +test("true for a against 1", () => { + const actual = ensure("a", 1); expect(actual).toBe(true); }); -test('false for ab against 0', () => { - const actual = ensure('a', 0); +test("false for ab against 0", () => { + const actual = ensure("a", 0); expect(actual).toBe(true); }); -test('true for a against 2', () => { - const actual = ensure('a', 2); +test("true for a against 2", () => { + const actual = ensure("a", 2); expect(actual).toBe(false); }); -test('true for ab against 2', () => { - const actual = ensure('ab', 2); +test("true for ab against 2", () => { + const actual = ensure("ab", 2); expect(actual).toBe(true); }); diff --git a/@commitlint/ensure/src/min-length.ts b/@commitlint/ensure/src/min-length.ts index 97ad15993e..e7a8186bbb 100644 --- a/@commitlint/ensure/src/min-length.ts +++ b/@commitlint/ensure/src/min-length.ts @@ -1,2 +1,2 @@ export default (value: string | null, min: number): boolean => - typeof value === 'string' && value.length >= min; + typeof value === "string" && value.length >= min; diff --git a/@commitlint/ensure/src/not-empty.test.ts b/@commitlint/ensure/src/not-empty.test.ts index 172a523caa..a0fa271b3d 100644 --- a/@commitlint/ensure/src/not-empty.test.ts +++ b/@commitlint/ensure/src/not-empty.test.ts @@ -1,18 +1,18 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import ensure from './not-empty.js'; +import ensure from "./not-empty.js"; -test('false for no params', () => { +test("false for no params", () => { const actual = (ensure as () => boolean)(); expect(actual).toBe(false); }); test('false for ""', () => { - const actual = ensure(''); + const actual = ensure(""); expect(actual).toBe(false); }); -test('true for a', () => { - const actual = ensure('a'); +test("true for a", () => { + const actual = ensure("a"); expect(actual).toBe(true); }); diff --git a/@commitlint/ensure/src/not-empty.ts b/@commitlint/ensure/src/not-empty.ts index 540cf99a3f..008380de35 100644 --- a/@commitlint/ensure/src/not-empty.ts +++ b/@commitlint/ensure/src/not-empty.ts @@ -1,2 +1,2 @@ export default (value: string): boolean => - typeof value === 'string' && value.length > 0; + typeof value === "string" && value.length > 0; diff --git a/@commitlint/ensure/src/to-case.ts b/@commitlint/ensure/src/to-case.ts index e3490faf17..df41e0033e 100644 --- a/@commitlint/ensure/src/to-case.ts +++ b/@commitlint/ensure/src/to-case.ts @@ -1,31 +1,31 @@ -import {TargetCaseType} from '@commitlint/types'; -import camelCase from 'lodash.camelcase'; -import kebabCase from 'lodash.kebabcase'; -import snakeCase from 'lodash.snakecase'; -import upperFirst from 'lodash.upperfirst'; -import startCase from 'lodash.startcase'; +import { TargetCaseType } from "@commitlint/types"; +import camelCase from "lodash.camelcase"; +import kebabCase from "lodash.kebabcase"; +import snakeCase from "lodash.snakecase"; +import upperFirst from "lodash.upperfirst"; +import startCase from "lodash.startcase"; export default function toCase(input: string, target: TargetCaseType): string { switch (target) { - case 'camel-case': + case "camel-case": return camelCase(input); - case 'kebab-case': + case "kebab-case": return kebabCase(input); - case 'snake-case': + case "snake-case": return snakeCase(input); - case 'pascal-case': + case "pascal-case": return upperFirst(camelCase(input)); - case 'start-case': + case "start-case": return startCase(input); - case 'upper-case': - case 'uppercase': + case "upper-case": + case "uppercase": return input.toUpperCase(); - case 'sentence-case': - case 'sentencecase': + case "sentence-case": + case "sentencecase": return upperFirst(input); - case 'lower-case': - case 'lowercase': - case 'lowerCase': // Backwards compat config-angular v4 + case "lower-case": + case "lowercase": + case "lowerCase": // Backwards compat config-angular v4 return input.toLowerCase(); default: throw new TypeError(`to-case: Unknown target case "${target}"`); diff --git a/@commitlint/ensure/tsconfig.json b/@commitlint/ensure/tsconfig.json index f3092129e3..0cc393e13d 100644 --- a/@commitlint/ensure/tsconfig.json +++ b/@commitlint/ensure/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["./src/**/*.ts"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], - "references": [{"path": "../types"}] + "references": [{ "path": "../types" }] } diff --git a/@commitlint/execute-rule/CHANGELOG.md b/@commitlint/execute-rule/CHANGELOG.md index b1eb18846e..2e9d17a6c0 100644 --- a/@commitlint/execute-rule/CHANGELOG.md +++ b/@commitlint/execute-rule/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/execute-rule + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/execute-rule + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/execute-rule + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/execute-rule diff --git a/@commitlint/execute-rule/package.json b/@commitlint/execute-rule/package.json index ee3c604a58..507e533f1e 100644 --- a/@commitlint/execute-rule/package.json +++ b/@commitlint/execute-rule/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/execute-rule", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Lint your commit messages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,7 +36,7 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/execute-rule/src/index.test.ts b/@commitlint/execute-rule/src/index.test.ts index f3dfb34869..23a3259707 100644 --- a/@commitlint/execute-rule/src/index.test.ts +++ b/@commitlint/execute-rule/src/index.test.ts @@ -1,28 +1,28 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import execute from './index.js'; +import execute from "./index.js"; -test('does nothing without params', async () => { +test("does nothing without params", async () => { const exec = execute as any; expect(await exec()).toBeNull(); }); -test('returns plain config', async () => { - const actual = await execute(['name', 'config']); - expect(actual).toEqual(['name', 'config']); +test("returns plain config", async () => { + const actual = await execute(["name", "config"]); + expect(actual).toEqual(["name", "config"]); }); -test('unwraps promised config', async () => { - const actual = await execute(['name', Promise.resolve('config')]); - expect(actual).toEqual(['name', 'config']); +test("unwraps promised config", async () => { + const actual = await execute(["name", Promise.resolve("config")]); + expect(actual).toEqual(["name", "config"]); }); -test('executes config functions', async () => { - const actual = await execute(['name', () => 'config']); - expect(actual).toEqual(['name', 'config']); +test("executes config functions", async () => { + const actual = await execute(["name", () => "config"]); + expect(actual).toEqual(["name", "config"]); }); -test('executes async config functions', async () => { - const actual = await execute(['name', async () => 'config']); - expect(actual).toEqual(['name', 'config']); +test("executes async config functions", async () => { + const actual = await execute(["name", async () => "config"]); + expect(actual).toEqual(["name", "config"]); }); diff --git a/@commitlint/execute-rule/src/index.ts b/@commitlint/execute-rule/src/index.ts index 47029f4b89..4ef89f9275 100644 --- a/@commitlint/execute-rule/src/index.ts +++ b/@commitlint/execute-rule/src/index.ts @@ -7,7 +7,7 @@ type ExecutedRule<T> = readonly [string, T]; export default execute; export async function execute<T = unknown>( - rule?: Rule<T> + rule?: Rule<T>, ): Promise<ExecutedRule<T> | null> { if (!Array.isArray(rule)) { return null; @@ -21,5 +21,5 @@ export async function execute<T = unknown>( } function executable<T>(config: Config<T>): config is ExectableConfig<T> { - return typeof config === 'function'; + return typeof config === "function"; } diff --git a/@commitlint/format/CHANGELOG.md b/@commitlint/format/CHANGELOG.md index 53374f880b..b809f3fa73 100644 --- a/@commitlint/format/CHANGELOG.md +++ b/@commitlint/format/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/format + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/format + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/format + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/format diff --git a/@commitlint/format/package.json b/@commitlint/format/package.json index 3527d2e02f..695428c758 100644 --- a/@commitlint/format/package.json +++ b/@commitlint/format/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/format", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Format commitlint reports", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,11 +36,11 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, "dependencies": { - "@commitlint/types": "^19.5.0", + "@commitlint/types": "^20.0.0", "chalk": "^5.3.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/format/src/format.test.ts b/@commitlint/format/src/format.test.ts index 10b70e76aa..3388e96afb 100644 --- a/@commitlint/format/src/format.test.ts +++ b/@commitlint/format/src/format.test.ts @@ -1,23 +1,23 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import {format, formatResult} from './index.js'; +import { format, formatResult } from "./index.js"; -test('does nothing without arguments', () => { +test("does nothing without arguments", () => { const actual = format(); - expect(actual).toEqual(''); + expect(actual).toEqual(""); }); -test('does nothing without report results', () => { - const actual = format({results: []}); - expect(actual).toEqual(''); +test("does nothing without report results", () => { + const actual = format({ results: [] }); + expect(actual).toEqual(""); }); -test('does nothing without .errors and .warnings', () => { - const actual = format({results: [{}]}); - expect(actual).toEqual(''); +test("does nothing without .errors and .warnings", () => { + const actual = format({ results: [{}] }); + expect(actual).toEqual(""); }); -test('returns empty summary if verbose', () => { +test("returns empty summary if verbose", () => { const actual = format( { results: [ @@ -29,13 +29,13 @@ test('returns empty summary if verbose', () => { }, { verbose: true, - } + }, ); - expect(actual).toContain('0 problems, 0 warnings'); + expect(actual).toContain("0 problems, 0 warnings"); }); -test('returns empty summary with full commit message if verbose', () => { +test("returns empty summary with full commit message if verbose", () => { const actual = format( { results: [ @@ -43,30 +43,30 @@ test('returns empty summary with full commit message if verbose', () => { errors: [], warnings: [], input: - 'feat(cli): this is a valid header\n\nThis is a valid body\n\nSigned-off-by: tester', + "feat(cli): this is a valid header\n\nThis is a valid body\n\nSigned-off-by: tester", }, ], }, { verbose: true, color: false, - } + }, ); expect(actual).toStrictEqual( - '⧗ input: feat(cli): this is a valid header\n\nThis is a valid body\n\nSigned-off-by: tester\n✔ found 0 problems, 0 warnings' + "⧗ input: feat(cli): this is a valid header\n\nThis is a valid body\n\nSigned-off-by: tester\n✔ found 0 problems, 0 warnings", ); }); -test('returns a correct summary of empty .errors and .warnings', () => { +test("returns a correct summary of empty .errors and .warnings", () => { const actualError = format({ results: [ { errors: [ { level: 2, - name: 'error-name', - message: 'There was an error', + name: "error-name", + message: "There was an error", }, ], }, @@ -79,29 +79,29 @@ test('returns a correct summary of empty .errors and .warnings', () => { warnings: [ { level: 1, - name: 'warning-name', - message: 'There was a problem', + name: "warning-name", + message: "There was a problem", }, ], }, ], }); - expect(actualError).toContain('There was an error'); - expect(actualError).toContain('1 problems, 0 warnings'); - expect(actualWarning).toContain('There was a problem'); - expect(actualWarning).toContain('0 problems, 1 warnings'); + expect(actualError).toContain("There was an error"); + expect(actualError).toContain("1 problems, 0 warnings"); + expect(actualWarning).toContain("There was a problem"); + expect(actualWarning).toContain("0 problems, 1 warnings"); }); -test('uses appropriate signs by default', () => { +test("uses appropriate signs by default", () => { const actualError = format({ results: [ { errors: [ { level: 2, - name: 'error-name', - message: 'There was an error', + name: "error-name", + message: "There was an error", }, ], }, @@ -114,20 +114,20 @@ test('uses appropriate signs by default', () => { warnings: [ { level: 1, - name: 'warning-name', - message: 'There was a problem', + name: "warning-name", + message: "There was a problem", }, ], }, ], }); - expect(actualError).toContain('✖'); - expect(actualWarning).toContain('⚠'); + expect(actualError).toContain("✖"); + expect(actualWarning).toContain("⚠"); }); -test('uses signs as configured', () => { - const options = {signs: ['HNT', 'WRN', 'ERR'] as [string, string, string]}; +test("uses signs as configured", () => { + const options = { signs: ["HNT", "WRN", "ERR"] as [string, string, string] }; const actualError = format( { results: [ @@ -135,14 +135,14 @@ test('uses signs as configured', () => { errors: [ { level: 2, - name: 'error-name', - message: 'There was an error', + name: "error-name", + message: "There was an error", }, ], }, ], }, - options + options, ); const actualWarning = format( @@ -152,154 +152,154 @@ test('uses signs as configured', () => { warnings: [ { level: 1, - name: 'warning-name', - message: 'There was a problem', + name: "warning-name", + message: "There was a problem", }, ], }, ], }, - options + options, ); - expect(actualError).toContain('ERR'); - expect(actualWarning).toContain('WRN'); + expect(actualError).toContain("ERR"); + expect(actualWarning).toContain("WRN"); }); -test('format result is empty without arguments', () => { +test("format result is empty without arguments", () => { const actual = formatResult(); - const actualText = actual.join('\n'); - expect(actualText).toBe(''); + const actualText = actual.join("\n"); + expect(actualText).toBe(""); }); -test('format result transforms error to text', () => { +test("format result transforms error to text", () => { const actual = formatResult({ errors: [ { level: 2, - name: 'error-name', - message: 'There was an error', + name: "error-name", + message: "There was an error", }, ], }); - const actualText = actual.join('\n'); + const actualText = actual.join("\n"); - expect(actualText).toContain('error-name'); - expect(actualText).toContain('There was an error'); - expect(actualText).toContain('1 problems, 0 warnings'); + expect(actualText).toContain("error-name"); + expect(actualText).toContain("There was an error"); + expect(actualText).toContain("1 problems, 0 warnings"); }); -test('format result transforms warning to text', () => { +test("format result transforms warning to text", () => { const actual = formatResult({ warnings: [ { level: 1, - name: 'warning-name', - message: 'There was a warning', + name: "warning-name", + message: "There was a warning", }, ], }); - const actualText = actual.join('\n'); + const actualText = actual.join("\n"); - expect(actualText).toContain('warning-name'); - expect(actualText).toContain('There was a warning'); - expect(actualText).toContain('0 problems, 1 warnings'); + expect(actualText).toContain("warning-name"); + expect(actualText).toContain("There was a warning"); + expect(actualText).toContain("0 problems, 1 warnings"); }); -test('format result prints help for errors', () => { +test("format result prints help for errors", () => { const actual = formatResult( { errors: [ { level: 2, - name: 'error-name', - message: 'There was an error', + name: "error-name", + message: "There was an error", }, ], }, { - helpUrl: 'https://example.com', - } + helpUrl: "https://example.com", + }, ); expect(actual).toEqual( - expect.arrayContaining([expect.stringContaining('Get help:')]) + expect.arrayContaining([expect.stringContaining("Get help:")]), ); }); -test('format result prints help for warnings', () => { +test("format result prints help for warnings", () => { const actual = formatResult( { warnings: [ { level: 2, - name: 'warning-name', - message: 'There was a warning', + name: "warning-name", + message: "There was a warning", }, ], }, { - helpUrl: 'https://example.com', - } + helpUrl: "https://example.com", + }, ); expect(actual).toEqual( - expect.arrayContaining([expect.stringContaining('Get help:')]) + expect.arrayContaining([expect.stringContaining("Get help:")]), ); }); -test('format result help cotains options.helpUrl', () => { - const helpUrl = 'https://example.com'; +test("format result help cotains options.helpUrl", () => { + const helpUrl = "https://example.com"; const actual = formatResult( { warnings: [ { level: 2, - name: 'warning-name', - message: 'There was a warning', + name: "warning-name", + message: "There was a warning", }, ], }, { helpUrl, - } + }, ); expect(actual).toEqual( - expect.arrayContaining([expect.stringContaining(helpUrl)]) + expect.arrayContaining([expect.stringContaining(helpUrl)]), ); }); -test('format result omits help for empty problems', () => { +test("format result omits help for empty problems", () => { const actual = formatResult({ warnings: [], }); expect(actual).not.toEqual( - expect.arrayContaining([expect.stringContaining('Get help:')]) + expect.arrayContaining([expect.stringContaining("Get help:")]), ); }); -test('format result should not contain `Get help` prefix if helpUrl is not provided', () => { +test("format result should not contain `Get help` prefix if helpUrl is not provided", () => { const actual = formatResult( { warnings: [ { level: 2, - name: 'warning-name', - message: 'There was a warning', + name: "warning-name", + message: "There was a warning", }, ], }, { - helpUrl: '', - } + helpUrl: "", + }, ); expect(actual).not.toEqual( - expect.arrayContaining([expect.stringContaining('Get help:')]) + expect.arrayContaining([expect.stringContaining("Get help:")]), ); }); diff --git a/@commitlint/format/src/format.ts b/@commitlint/format/src/format.ts index 13baf4bf5e..8c43f74c64 100644 --- a/@commitlint/format/src/format.ts +++ b/@commitlint/format/src/format.ts @@ -1,20 +1,20 @@ -import chalk from 'chalk'; +import chalk from "chalk"; import { ChalkColor, FormattableReport, FormatOptions, FormattableResult, WithInput, -} from '@commitlint/types'; +} from "@commitlint/types"; -const DEFAULT_SIGNS = [' ', '⚠', '✖'] as const; -const DEFAULT_COLORS = ['white', 'yellow', 'red'] as const; +const DEFAULT_SIGNS = [" ", "⚠", "✖"] as const; +const DEFAULT_COLORS = ["white", "yellow", "red"] as const; export function format( report: FormattableReport = {}, - options: FormatOptions = {} + options: FormatOptions = {}, ): string { - const {results = []} = report; + const { results = [] } = report; const fi = (result: FormattableResult & WithInput) => formatInput(result, options); const fr = (result: FormattableResult) => formatResult(result, options); @@ -24,23 +24,23 @@ export function format( .map((result) => [...fi(result), ...fr(result)]) .reduce( (acc, item) => (Array.isArray(item) ? [...acc, ...item] : [...acc, item]), - [] + [], ) - .join('\n'); + .join("\n"); } function formatInput( result: FormattableResult & WithInput, - options: FormatOptions = {} + options: FormatOptions = {}, ): string[] { - const {color: enabled = true} = options; - const {errors = [], warnings = [], input = ''} = result; + const { color: enabled = true } = options; + const { errors = [], warnings = [], input = "" } = result; if (!input) { - return ['']; + return [""]; } - const sign = '⧗'; + const sign = "⧗"; const decoration = enabled ? chalk.gray(sign) : sign; const decoratedInput = enabled ? chalk.bold(input) : input; @@ -53,18 +53,18 @@ function formatInput( export function formatResult( result: FormattableResult = {}, - options: FormatOptions = {} + options: FormatOptions = {}, ): string[] { const { signs = DEFAULT_SIGNS, colors = DEFAULT_COLORS, color: enabled = true, } = options; - const {errors = [], warnings = []} = result; + const { errors = [], warnings = [] } = result; const problems = [...errors, ...warnings].map((problem) => { - const sign = signs[problem.level] || ''; - const color: ChalkColor = colors[problem.level] || ('white' as const); + const sign = signs[problem.level] || ""; + const color: ChalkColor = colors[problem.level] || ("white" as const); const decoration = enabled ? chalk[color](sign) : sign; const name = enabled ? chalk.grey(`[${problem.name}]`) @@ -86,7 +86,7 @@ export function formatResult( : undefined; const fmtSummary = - enabled && typeof summary === 'string' ? chalk.bold(summary) : summary; + enabled && typeof summary === "string" ? chalk.bold(summary) : summary; const help = hasProblems && options.helpUrl @@ -95,25 +95,25 @@ export function formatResult( return [ ...problems, - hasProblems ? '' : undefined, + hasProblems ? "" : undefined, fmtSummary, help, - hasProblems ? '' : undefined, - ].filter((line): line is string => typeof line === 'string'); + hasProblems ? "" : undefined, + ].filter((line): line is string => typeof line === "string"); } export default format; function selectSign(result: FormattableResult): string { if ((result.errors || []).length > 0) { - return '✖'; + return "✖"; } - return (result.warnings || []).length ? '⚠' : '✔'; + return (result.warnings || []).length ? "⚠" : "✔"; } function selectColor(result: FormattableResult): ChalkColor { if ((result.errors || []).length > 0) { - return 'red'; + return "red"; } - return (result.warnings || []).length ? 'yellow' : 'green'; + return (result.warnings || []).length ? "yellow" : "green"; } diff --git a/@commitlint/format/src/index.ts b/@commitlint/format/src/index.ts index 9ec36ba06a..6f7327f1bb 100644 --- a/@commitlint/format/src/index.ts +++ b/@commitlint/format/src/index.ts @@ -1,2 +1,2 @@ -export {default} from './format.js'; -export * from './format.js'; +export { default } from "./format.js"; +export * from "./format.js"; diff --git a/@commitlint/format/tsconfig.json b/@commitlint/format/tsconfig.json index 119e645565..d691164788 100644 --- a/@commitlint/format/tsconfig.json +++ b/@commitlint/format/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], - "references": [{"path": "../types"}] + "references": [{ "path": "../types" }] } diff --git a/@commitlint/is-ignored/CHANGELOG.md b/@commitlint/is-ignored/CHANGELOG.md index 16bc20e932..70f7b36b54 100644 --- a/@commitlint/is-ignored/CHANGELOG.md +++ b/@commitlint/is-ignored/CHANGELOG.md @@ -3,6 +3,44 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/is-ignored + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/is-ignored + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Reverts + +* Revert "fix: improve security validation regex in is-ignored function (#4258)" (#4314) ([b27024a](https://github.com/conventional-changelog/commitlint/commit/b27024a5ae509d1df9373ed712f2279d0bc39170)), closes [#4258](https://github.com/conventional-changelog/commitlint/issues/4258) [#4314](https://github.com/conventional-changelog/commitlint/issues/4314) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + + +### Bug Fixes + +* improve security validation regex in is-ignored function ([#4258](https://github.com/conventional-changelog/commitlint/issues/4258)) ([7403d63](https://github.com/conventional-changelog/commitlint/commit/7403d6382cc2fb1f066a47d7229593eefe528561)) + + + + + # [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19) diff --git a/@commitlint/is-ignored/package.json b/@commitlint/is-ignored/package.json index d0a525735c..baccfbcc7f 100644 --- a/@commitlint/is-ignored/package.json +++ b/@commitlint/is-ignored/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/is-ignored", "type": "module", - "version": "19.6.0", + "version": "20.0.0", "description": "Lint your commit messages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,14 +36,14 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/parse": "^19.5.0", - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0", + "@commitlint/parse": "^20.0.0", + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0", "@types/semver": "^7.5.7" }, "dependencies": { - "@commitlint/types": "^19.5.0", + "@commitlint/types": "^20.0.0", "semver": "^7.6.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/is-ignored/src/defaults.ts b/@commitlint/is-ignored/src/defaults.ts index b9357cc75f..02fbcd6b46 100644 --- a/@commitlint/is-ignored/src/defaults.ts +++ b/@commitlint/is-ignored/src/defaults.ts @@ -1,14 +1,14 @@ -import semver from 'semver'; -import {Matcher} from '@commitlint/types'; +import semver from "semver"; +import { Matcher } from "@commitlint/types"; const isSemver = (c: string): boolean => { - const firstLine = c.split('\n').shift(); + const firstLine = c.split("\n").shift(); - if (typeof firstLine !== 'string') { + if (typeof firstLine !== "string") { return false; } - const stripped = firstLine.replace(/^chore(\([^)]+\))?:/, '').trim(); + const stripped = firstLine.replace(/^chore(\([^)]+\))?:/, "").trim(); return semver.valid(stripped) !== null; }; @@ -16,7 +16,7 @@ const test = (r: RegExp): ((c: string) => boolean) => r.test.bind(r); export const wildcards: Matcher[] = [ test( - /^((Merge pull request)|(Merge (.*?) into (.*?)|(Merge branch (.*?)))(?:\r?\n)*$)/m + /^((Merge pull request)|(Merge (.*?) into (.*?)|(Merge branch (.*?)))(?:\r?\n)*$)/m, ), test(/^(Merge tag (.*?))(?:\r?\n)*$/m), test(/^(R|r)evert (.*)/), diff --git a/@commitlint/is-ignored/src/index.ts b/@commitlint/is-ignored/src/index.ts index 603f7c5fe0..1e53818df3 100644 --- a/@commitlint/is-ignored/src/index.ts +++ b/@commitlint/is-ignored/src/index.ts @@ -1,2 +1,2 @@ -export * from './is-ignored.js'; -export {default} from './is-ignored.js'; +export * from "./is-ignored.js"; +export { default } from "./is-ignored.js"; diff --git a/@commitlint/is-ignored/src/is-ignored.test.ts b/@commitlint/is-ignored/src/is-ignored.test.ts index d3b89d7df6..07e25d1267 100644 --- a/@commitlint/is-ignored/src/is-ignored.test.ts +++ b/@commitlint/is-ignored/src/is-ignored.test.ts @@ -1,28 +1,28 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import isIgnored from './is-ignored.js'; +import isIgnored from "./is-ignored.js"; const VERSION_MESSAGES = [ - '0.0.1', - '0.1.0', - '1.0.0', - '0.0.1-alpha', - '0.0.1-some-crazy-tag', - '0.0.1-0', - '0.0.1-999', - '0.0.1-alpha.0', - '0.0.1-alpha.999', - '0.0.1-some-crazy-tag.0', - '0.0.1-some-crazy-tag.999', - '0.0.1-1e69d54', - 'v0.0.1', - ' v3.0.0', + "0.0.1", + "0.1.0", + "1.0.0", + "0.0.1-alpha", + "0.0.1-some-crazy-tag", + "0.0.1-0", + "0.0.1-999", + "0.0.1-alpha.0", + "0.0.1-alpha.999", + "0.0.1-some-crazy-tag.0", + "0.0.1-some-crazy-tag.999", + "0.0.1-1e69d54", + "v0.0.1", + " v3.0.0", ]; const AMENDMENTS = [ - 'Signed-off-by: Developer <example@example.com>', - 'Change-Id: I895114872a515a269487a683124b63303818e19c', - 'Signed-off-by: Developer <example@example.com>\nChange-Id: I895114872a515a269487a683124b63303818e19c', + "Signed-off-by: Developer <example@example.com>", + "Change-Id: I895114872a515a269487a683124b63303818e19c", + "Signed-off-by: Developer <example@example.com>\nChange-Id: I895114872a515a269487a683124b63303818e19c", ]; const AMENDED_VERSION_MESSAGES = VERSION_MESSAGES.reduce<string[]>( @@ -32,176 +32,176 @@ const AMENDED_VERSION_MESSAGES = VERSION_MESSAGES.reduce<string[]>( ...AMENDMENTS.map((amendment) => `${message}\n\n${amendment}`), ]; }, - [] + [], ); -test('should return false when called without arguments', () => { +test("should return false when called without arguments", () => { expect(isIgnored()).toBe(false); }); -test('should return false when called with empty string', () => { - expect(isIgnored('')).toBe(false); +test("should return false when called with empty string", () => { + expect(isIgnored("")).toBe(false); }); -test('should return false for normal commit', () => { - expect(isIgnored('initial commit')).toBe(false); +test("should return false for normal commit", () => { + expect(isIgnored("initial commit")).toBe(false); }); -test('should return true for branch merges', () => { +test("should return true for branch merges", () => { expect(isIgnored("Merge branch 'iss53'")).toBe(true); }); -test('should return true for branch merges with newline characters', () => { +test("should return true for branch merges with newline characters", () => { expect(isIgnored("Merge branch 'ctrom-YarnBuild'\n")).toBe(true); expect(isIgnored("Merge branch 'ctrom-YarnBuild'\r\n")).toBe(true); }); -test('should return true for branch merges with multiple newline characters', () => { +test("should return true for branch merges with multiple newline characters", () => { expect(isIgnored("Merge branch 'ctrom-YarnBuild'\n\n\n")).toBe(true); expect(isIgnored("Merge branch 'ctrom-YarnBuild'\r\n\r\n\r\n")).toBe(true); }); -test('should return true for merged PRs', () => { - expect(isIgnored('Merge pull request #369')).toBe(true); +test("should return true for merged PRs", () => { + expect(isIgnored("Merge pull request #369")).toBe(true); }); -test('should return true for branch merges with newline characters and more characters after it', () => { +test("should return true for branch merges with newline characters and more characters after it", () => { expect(isIgnored("Merge branch 'ctrom-YarnBuild'\n ")).toBe(true); expect(isIgnored("Merge branch 'ctrom-YarnBuild'\r\n # some comment")).toBe( - true + true, ); }); -test('should return true for tag merges', () => { +test("should return true for tag merges", () => { expect(isIgnored("Merge tag '1.1.1'")).toBe(true); expect(isIgnored("Merge tag 'a tag'")).toBe(true); }); -test('should return true for tag merges with newline characters', () => { +test("should return true for tag merges with newline characters", () => { expect(isIgnored("Merge tag '1.1.1'\n")).toBe(true); expect(isIgnored("Merge tag '1.1.1'\r\n")).toBe(true); }); -test('should return true for tag merges with multiple newline characters', () => { +test("should return true for tag merges with multiple newline characters", () => { expect(isIgnored("Merge tag '1.1.1'\n\n\n")).toBe(true); expect(isIgnored("Merge tag '1.1.1'\r\n\r\n\r\n")).toBe(true); }); -test('should return true for tag merges with newline characters and more characters after it', () => { +test("should return true for tag merges with newline characters and more characters after it", () => { expect(isIgnored("Merge tag '1.1.1'\n ")).toBe(true); expect(isIgnored("Merge tag '1.1.1'\r\n # some comment")).toBe(true); }); -test('should return true for revert commits', () => { +test("should return true for revert commits", () => { expect( isIgnored( - `Revert "docs: add recipe for linting of all commits in a PR (#36)"\n\nThis reverts commit 1e69d542c16c2a32acfd139e32efa07a45f19111.` - ) + `Revert "docs: add recipe for linting of all commits in a PR (#36)"\n\nThis reverts commit 1e69d542c16c2a32acfd139e32efa07a45f19111.`, + ), ).toBe(true); expect( isIgnored( - `revert "docs: add recipe for linting of all commits in a PR (#36)"\n\nThis reverts commit 1e69d542c16c2a32acfd139e32efa07a45f19111.` - ) + `revert "docs: add recipe for linting of all commits in a PR (#36)"\n\nThis reverts commit 1e69d542c16c2a32acfd139e32efa07a45f19111.`, + ), ).toBe(true); }); -test('should ignore npm semver commits', () => { +test("should ignore npm semver commits", () => { VERSION_MESSAGES.forEach((message) => expect(isIgnored(message)).toBe(true)); }); -test('should ignore npm semver commits with chore', () => { +test("should ignore npm semver commits with chore", () => { VERSION_MESSAGES.forEach((message) => - expect(isIgnored(`chore: ${message}`)).toBe(true) + expect(isIgnored(`chore: ${message}`)).toBe(true), ); VERSION_MESSAGES.forEach((message) => - expect(isIgnored(`chore(release): ${message}`)).toBe(true) + expect(isIgnored(`chore(release): ${message}`)).toBe(true), ); }); -test('should ignore npm semver commits with footers', () => { +test("should ignore npm semver commits with footers", () => { AMENDED_VERSION_MESSAGES.forEach((message) => - expect(isIgnored(message)).toBe(true) + expect(isIgnored(message)).toBe(true), ); }); -test('should return true amend commits', () => { - expect(isIgnored('amend! initial commit')).toBe(true); +test("should return true amend commits", () => { + expect(isIgnored("amend! initial commit")).toBe(true); }); -test('should return true fixup commits', () => { - expect(isIgnored('fixup! initial commit')).toBe(true); +test("should return true fixup commits", () => { + expect(isIgnored("fixup! initial commit")).toBe(true); }); -test('should return true squash commits', () => { - expect(isIgnored('squash! initial commit')).toBe(true); +test("should return true squash commits", () => { + expect(isIgnored("squash! initial commit")).toBe(true); }); -test('should return true for bitbucket merge commits', () => { +test("should return true for bitbucket merge commits", () => { expect( - isIgnored('Merged in feature/facebook-friends-sync (pull request #8)') + isIgnored("Merged in feature/facebook-friends-sync (pull request #8)"), ).toBe(true); expect( - isIgnored('Merged develop into feature/component-form-select-card') + isIgnored("Merged develop into feature/component-form-select-card"), ).toBe(true); - expect(isIgnored('Automatic merge')).toBe(true); + expect(isIgnored("Automatic merge")).toBe(true); }); -test('should return true for automatic merge commits', () => { - expect(isIgnored('Auto-merged develop into master')).toBe(true); - expect(isIgnored('Merge remote-tracking branch')).toBe(true); +test("should return true for automatic merge commits", () => { + expect(isIgnored("Auto-merged develop into master")).toBe(true); + expect(isIgnored("Merge remote-tracking branch")).toBe(true); }); -test('should return true for azure devops merge commits', () => { - expect(isIgnored('Merged PR 123: Description here')).toBe(true); +test("should return true for azure devops merge commits", () => { + expect(isIgnored("Merged PR 123: Description here")).toBe(true); }); -test('should return false for commits containing, but not starting, with merge branch', () => { - expect(isIgnored('foo bar Merge branch xxx')).toBe(false); +test("should return false for commits containing, but not starting, with merge branch", () => { + expect(isIgnored("foo bar Merge branch xxx")).toBe(false); }); -test('should return false for commits containing, but not starting, with merge tag', () => { +test("should return false for commits containing, but not starting, with merge tag", () => { expect(isIgnored("foo bar Merge tag '1.1.1'")).toBe(false); }); -test('should return false for ignored message if defaults is false', () => { +test("should return false for ignored message if defaults is false", () => { expect( - isIgnored('Auto-merged develop into master', { + isIgnored("Auto-merged develop into master", { defaults: false, - }) + }), ).toBe(false); }); -test('should return false for ignored message if custom ignores and defaults is false', () => { +test("should return false for ignored message if custom ignores and defaults is false", () => { expect( - isIgnored('Auto-merged develop into master', { + isIgnored("Auto-merged develop into master", { defaults: false, - }) + }), ).toBe(false); }); -test('should throw error if ignores is not an array', () => { - const ignoredString = 'this should be ignored'; +test("should throw error if ignores is not an array", () => { + const ignoredString = "this should be ignored"; expect(() => { isIgnored(ignoredString, { - ignores: 'throws error', + ignores: "throws error", } as any); - }).toThrow('ignores must be of type array, received '); + }).toThrow("ignores must be of type array, received "); }); -test('should return true for custom ignores as function', () => { - const ignoredString = 'this should be ignored'; +test("should return true for custom ignores as function", () => { + const ignoredString = "this should be ignored"; expect( isIgnored(ignoredString, { ignores: [(c) => c === ignoredString], - }) + }), ).toBe(true); }); -test('should throw error if any element of ignores is not a function', () => { - const ignoredString = 'this should be ignored'; +test("should throw error if any element of ignores is not a function", () => { + const ignoredString = "this should be ignored"; expect(() => { isIgnored(ignoredString, { - ignores: ['throws error'], + ignores: ["throws error"], } as any); - }).toThrow('ignores must be array of type function, received items of type:'); + }).toThrow("ignores must be array of type function, received items of type:"); }); diff --git a/@commitlint/is-ignored/src/is-ignored.ts b/@commitlint/is-ignored/src/is-ignored.ts index a3782b1f5b..98faa4c38f 100644 --- a/@commitlint/is-ignored/src/is-ignored.ts +++ b/@commitlint/is-ignored/src/is-ignored.ts @@ -1,25 +1,25 @@ -import {wildcards} from './defaults.js'; -import {IsIgnoredOptions} from '@commitlint/types'; +import { wildcards } from "./defaults.js"; +import { IsIgnoredOptions } from "@commitlint/types"; export default function isIgnored( - commit: string = '', - opts: IsIgnoredOptions = {} + commit: string = "", + opts: IsIgnoredOptions = {}, ): boolean { - const ignores = typeof opts.ignores === 'undefined' ? [] : opts.ignores; + const ignores = typeof opts.ignores === "undefined" ? [] : opts.ignores; if (!Array.isArray(ignores)) { throw new Error( - `ignores must be of type array, received ${ignores} of type ${typeof ignores}` + `ignores must be of type array, received ${ignores} of type ${typeof ignores}`, ); } - const invalids = ignores.filter((c) => typeof c !== 'function'); + const invalids = ignores.filter((c) => typeof c !== "function"); if (invalids.length > 0) { throw new Error( `ignores must be array of type function, received items of type: ${invalids .map((i) => typeof i) - .join(', ')}` + .join(", ")}`, ); } diff --git a/@commitlint/is-ignored/tsconfig.json b/@commitlint/is-ignored/tsconfig.json index f3092129e3..0cc393e13d 100644 --- a/@commitlint/is-ignored/tsconfig.json +++ b/@commitlint/is-ignored/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["./src/**/*.ts"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], - "references": [{"path": "../types"}] + "references": [{ "path": "../types" }] } diff --git a/@commitlint/lint/CHANGELOG.md b/@commitlint/lint/CHANGELOG.md index 47b47143bf..4b349f746a 100644 --- a/@commitlint/lint/CHANGELOG.md +++ b/@commitlint/lint/CHANGELOG.md @@ -3,6 +3,41 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/lint + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/lint + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package @commitlint/lint + + + + + # [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19) **Note:** Version bump only for package @commitlint/lint diff --git a/@commitlint/lint/package.json b/@commitlint/lint/package.json index 61dcb49de4..5927c0d139 100644 --- a/@commitlint/lint/package.json +++ b/@commitlint/lint/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/lint", "type": "module", - "version": "19.6.0", + "version": "20.0.0", "description": "Lint a string against commitlint rules", "main": "lib/lint.js", "types": "lib/lint.d.ts", @@ -36,14 +36,14 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0" + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0" }, "dependencies": { - "@commitlint/is-ignored": "^19.6.0", - "@commitlint/parse": "^19.5.0", - "@commitlint/rules": "^19.6.0", - "@commitlint/types": "^19.5.0" + "@commitlint/is-ignored": "^20.0.0", + "@commitlint/parse": "^20.0.0", + "@commitlint/rules": "^20.0.0", + "@commitlint/types": "^20.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/lint/src/commit-message.ts b/@commitlint/lint/src/commit-message.ts index 7d8c99f047..fb9d8363ee 100644 --- a/@commitlint/lint/src/commit-message.ts +++ b/@commitlint/lint/src/commit-message.ts @@ -14,5 +14,5 @@ export const buildCommitMessage = ({ message = body ? `${message}\n\n${body}` : message; message = footer ? `${message}\n\n${footer}` : message; - return message || ''; + return message || ""; }; diff --git a/@commitlint/lint/src/lint.test.ts b/@commitlint/lint/src/lint.test.ts index f8b47f3523..0d37aca402 100644 --- a/@commitlint/lint/src/lint.test.ts +++ b/@commitlint/lint/src/lint.test.ts @@ -1,315 +1,315 @@ -import {test, expect} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { test, expect } from "vitest"; +import { RuleConfigSeverity } from "@commitlint/types"; -import lint from './lint.js'; +import lint from "./lint.js"; -test('throws without params', async () => { +test("throws without params", async () => { const error = (lint as any)(); - await expect(error).rejects.toThrow('Expected a raw commit'); + await expect(error).rejects.toThrow("Expected a raw commit"); }); -test('positive on empty message', async () => { - expect(await lint('')).toMatchObject({ +test("positive on empty message", async () => { + expect(await lint("")).toMatchObject({ valid: true, errors: [], warnings: [], }); }); -test('positive on stub message and no rule', async () => { - const actual = await lint('foo: bar'); +test("positive on stub message and no rule", async () => { + const actual = await lint("foo: bar"); expect(actual.valid).toBe(true); }); -test('positive on stub message and adhered rule', async () => { - const actual = await lint('foo: bar', { - 'type-enum': [RuleConfigSeverity.Error, 'always', ['foo']], +test("positive on stub message and adhered rule", async () => { + const actual = await lint("foo: bar", { + "type-enum": [RuleConfigSeverity.Error, "always", ["foo"]], }); expect(actual.valid).toBe(true); }); -test('negative on stub message and broken rule', async () => { - const actual = await lint('foo: bar', { - 'type-enum': [RuleConfigSeverity.Error, 'never', ['foo']], +test("negative on stub message and broken rule", async () => { + const actual = await lint("foo: bar", { + "type-enum": [RuleConfigSeverity.Error, "never", ["foo"]], }); expect(actual.valid).toBe(false); }); -test('positive on ignored message and broken rule', async () => { +test("positive on ignored message and broken rule", async () => { const actual = await lint('Revert "some bogus commit"', { - 'type-empty': [RuleConfigSeverity.Error, 'never'], + "type-empty": [RuleConfigSeverity.Error, "never"], }); expect(actual.valid).toBe(true); expect(actual.input).toBe('Revert "some bogus commit"'); }); -test('negative on ignored message, disabled ignored messages and broken rule', async () => { +test("negative on ignored message, disabled ignored messages and broken rule", async () => { const actual = await lint( 'Revert "some bogus commit"', { - 'type-empty': [RuleConfigSeverity.Error, 'never'], + "type-empty": [RuleConfigSeverity.Error, "never"], }, { defaultIgnores: false, - } + }, ); expect(actual.valid).toBe(false); }); -test('positive on custom ignored message and broken rule', async () => { - const ignoredMessage = 'some ignored custom message'; +test("positive on custom ignored message and broken rule", async () => { + const ignoredMessage = "some ignored custom message"; const actual = await lint( ignoredMessage, { - 'type-empty': [RuleConfigSeverity.Error, 'never'], + "type-empty": [RuleConfigSeverity.Error, "never"], }, { ignores: [(c) => c === ignoredMessage], - } + }, ); expect(actual.valid).toBe(true); expect(actual.input).toBe(ignoredMessage); }); -test('positive on stub message and opts', async () => { +test("positive on stub message and opts", async () => { const actual = await lint( - 'foo-bar', + "foo-bar", { - 'type-enum': [RuleConfigSeverity.Error, 'always', ['foo']], - 'type-empty': [RuleConfigSeverity.Error, 'never'], + "type-enum": [RuleConfigSeverity.Error, "always", ["foo"]], + "type-empty": [RuleConfigSeverity.Error, "never"], }, { parserOpts: { headerPattern: /^(\w*)(?:\((.*)\))?-(.*)$/, }, - } + }, ); expect(actual.valid).toBe(true); }); -test('throws for invalid rule names', async () => { - const error = lint('foo', { - foo: [RuleConfigSeverity.Error, 'always'], - bar: [RuleConfigSeverity.Warning, 'never'], +test("throws for invalid rule names", async () => { + const error = lint("foo", { + foo: [RuleConfigSeverity.Error, "always"], + bar: [RuleConfigSeverity.Warning, "never"], }); await expect(error).rejects.toThrow( - /^Found rules without implementation: foo, bar/ + /^Found rules without implementation: foo, bar/, ); }); -test('throws for invalid rule config', async () => { - const error = lint('type(scope): foo', { - 'type-enum': 1, - 'scope-enum': {0: 2, 1: 'never', 2: ['foo'], length: 3}, +test("throws for invalid rule config", async () => { + const error = lint("type(scope): foo", { + "type-enum": 1, + "scope-enum": { 0: 2, 1: "never", 2: ["foo"], length: 3 }, } as any); - await expect(error).rejects.toThrow('type-enum must be array'); - await expect(error).rejects.toThrow('scope-enum must be array'); + await expect(error).rejects.toThrow("type-enum must be array"); + await expect(error).rejects.toThrow("scope-enum must be array"); }); -test('allows disable shorthand', async () => { - const result = lint('foo', {'type-enum': [0], 'scope-enum': [0]}); +test("allows disable shorthand", async () => { + const result = lint("foo", { "type-enum": [0], "scope-enum": [0] }); await expect(result).resolves.toEqual({ errors: [], - input: 'foo', + input: "foo", valid: true, warnings: [], }); }); -test('throws for rule with invalid length', async () => { - const error = lint('type(scope): foo', {'scope-enum': [1, 2, 3, 4]} as any); +test("throws for rule with invalid length", async () => { + const error = lint("type(scope): foo", { "scope-enum": [1, 2, 3, 4] } as any); - await expect(error).rejects.toThrow('scope-enum must be 2 or 3 items long'); + await expect(error).rejects.toThrow("scope-enum must be 2 or 3 items long"); }); -test('throws for rule with invalid level', async () => { - const error = lint('type(scope): foo', { - 'type-enum': ['2', 'always'] as any, - 'header-max-length': [{}, 'always'] as any, +test("throws for rule with invalid level", async () => { + const error = lint("type(scope): foo", { + "type-enum": ["2", "always"] as any, + "header-max-length": [{}, "always"] as any, }); - await expect(error).rejects.toThrow('rule type-enum must be number'); - await expect(error).rejects.toThrow('rule header-max-length must be number'); + await expect(error).rejects.toThrow("rule type-enum must be number"); + await expect(error).rejects.toThrow("rule header-max-length must be number"); }); -test('throws for rule with out of range level', async () => { - const error = lint('type(scope): foo', { - 'type-enum': [-1, 'always'] as any, - 'header-max-length': [3, 'always'] as any, +test("throws for rule with out of range level", async () => { + const error = lint("type(scope): foo", { + "type-enum": [-1, "always"] as any, + "header-max-length": [3, "always"] as any, }); - await expect(error).rejects.toThrow('rule type-enum must be between 0 and 2'); + await expect(error).rejects.toThrow("rule type-enum must be between 0 and 2"); await expect(error).rejects.toThrow( - 'rule header-max-length must be between 0 and 2' + "rule header-max-length must be between 0 and 2", ); }); -test('throws for rule with invalid condition', async () => { - const error = lint('type(scope): foo', { - 'type-enum': [1, 2] as any, - 'header-max-length': [1, {}] as any, +test("throws for rule with invalid condition", async () => { + const error = lint("type(scope): foo", { + "type-enum": [1, 2] as any, + "header-max-length": [1, {}] as any, }); - await expect(error).rejects.toThrow('type-enum must be string'); - await expect(error).rejects.toThrow('header-max-length must be string'); + await expect(error).rejects.toThrow("type-enum must be string"); + await expect(error).rejects.toThrow("header-max-length must be string"); }); -test('throws for rule with out of range condition', async () => { - const error = lint('type(scope): foo', { - 'type-enum': [RuleConfigSeverity.Warning, 'foo'] as any, - 'header-max-length': [RuleConfigSeverity.Warning, 'bar'] as any, +test("throws for rule with out of range condition", async () => { + const error = lint("type(scope): foo", { + "type-enum": [RuleConfigSeverity.Warning, "foo"] as any, + "header-max-length": [RuleConfigSeverity.Warning, "bar"] as any, }); await expect(error).rejects.toThrow('type-enum must be "always" or "never"'); await expect(error).rejects.toThrow( - 'header-max-length must be "always" or "never"' + 'header-max-length must be "always" or "never"', ); }); -test('succeds for issue', async () => { - const report = await lint('somehting #1', { - 'references-empty': [RuleConfigSeverity.Error, 'never'], +test("succeds for issue", async () => { + const report = await lint("somehting #1", { + "references-empty": [RuleConfigSeverity.Error, "never"], }); expect(report.valid).toBe(true); }); -test('fails for issue', async () => { - const report = await lint('somehting #1', { - 'references-empty': [RuleConfigSeverity.Error, 'always'], +test("fails for issue", async () => { + const report = await lint("somehting #1", { + "references-empty": [RuleConfigSeverity.Error, "always"], }); expect(report.valid).toBe(false); }); -test('succeds for custom issue prefix', async () => { +test("succeds for custom issue prefix", async () => { const report = await lint( - 'somehting REF-1', + "somehting REF-1", { - 'references-empty': [RuleConfigSeverity.Error, 'never'], + "references-empty": [RuleConfigSeverity.Error, "never"], }, { parserOpts: { - issuePrefixes: ['REF-'], + issuePrefixes: ["REF-"], }, - } + }, ); expect(report.valid).toBe(true); }); -test('fails for custom issue prefix', async () => { +test("fails for custom issue prefix", async () => { const report = await lint( - 'somehting #1', + "somehting #1", { - 'references-empty': [RuleConfigSeverity.Error, 'never'], + "references-empty": [RuleConfigSeverity.Error, "never"], }, { parserOpts: { - issuePrefixes: ['REF-'], + issuePrefixes: ["REF-"], }, - } + }, ); expect(report.valid).toBe(false); }); -test('fails for custom plugin rule', async () => { +test("fails for custom plugin rule", async () => { const report = await lint( - 'somehting #1', + "somehting #1", { - 'plugin-rule': [RuleConfigSeverity.Error, 'never'], + "plugin-rule": [RuleConfigSeverity.Error, "never"], }, { plugins: { - 'plugin-example': { + "plugin-example": { rules: { - 'plugin-rule': () => [false], + "plugin-rule": () => [false], }, }, }, - } + }, ); expect(report.valid).toBe(false); }); -test('passes for custom plugin rule', async () => { +test("passes for custom plugin rule", async () => { const report = await lint( - 'somehting #1', + "somehting #1", { - 'plugin-rule': [RuleConfigSeverity.Error, 'never'], + "plugin-rule": [RuleConfigSeverity.Error, "never"], }, { plugins: { - 'plugin-example': { + "plugin-example": { rules: { - 'plugin-rule': () => [true], + "plugin-rule": () => [true], }, }, }, - } + }, ); expect(report.valid).toBe(true); }); -test('returns original message only with commit header', async () => { - const message = 'foo: bar'; +test("returns original message only with commit header", async () => { + const message = "foo: bar"; const report = await lint(message); expect(report.input).toBe(message); }); -test('returns original message with commit header and body', async () => { - const message = 'foo: bar/n/nFoo bar bizz buzz.'; +test("returns original message with commit header and body", async () => { + const message = "foo: bar/n/nFoo bar bizz buzz."; const report = await lint(message); expect(report.input).toBe(message); }); -test('returns original message with commit header, body and footer', async () => { - const message = 'foo: bar/n/nFoo bar bizz buzz./n/nCloses #1'; +test("returns original message with commit header, body and footer", async () => { + const message = "foo: bar/n/nFoo bar bizz buzz./n/nCloses #1"; const report = await lint(message); expect(report.input).toBe(message); }); -test('returns original message with commit header, body and footer, parsing comments', async () => { - const expected = 'foo: bar/n/nFoo bar bizz buzz./n/nCloses #1'; +test("returns original message with commit header, body and footer, parsing comments", async () => { + const expected = "foo: bar/n/nFoo bar bizz buzz./n/nCloses #1"; const message = `${expected}\n\n# Some comment to ignore`; const report = await lint( message, { - 'references-empty': [RuleConfigSeverity.Error, 'never'], + "references-empty": [RuleConfigSeverity.Error, "never"], }, { parserOpts: { - commentChar: '#', + commentChar: "#", }, - } + }, ); expect(report.input).toBe(expected); }); -test('passes for async rule', async () => { +test("passes for async rule", async () => { const report = await lint( - 'somehting #1', + "somehting #1", { - 'async-rule': [RuleConfigSeverity.Error, 'never'], + "async-rule": [RuleConfigSeverity.Error, "never"], }, { plugins: { - 'example-plugin': { + "example-plugin": { rules: { - 'async-rule': async () => [true, 'all good'] as const, + "async-rule": async () => [true, "all good"] as const, }, }, }, - } + }, ); expect(report.valid).toBe(true); diff --git a/@commitlint/lint/src/lint.ts b/@commitlint/lint/src/lint.ts index b61326ce49..c64bb829e0 100644 --- a/@commitlint/lint/src/lint.ts +++ b/@commitlint/lint/src/lint.ts @@ -1,7 +1,7 @@ -import util from 'util'; -import isIgnored from '@commitlint/is-ignored'; -import parse from '@commitlint/parse'; -import defaultRules from '@commitlint/rules'; +import util from "node:util"; +import isIgnored from "@commitlint/is-ignored"; +import parse from "@commitlint/parse"; +import defaultRules from "@commitlint/rules"; import type { LintOptions, LintOutcome, @@ -10,24 +10,24 @@ import type { BaseRule, RuleType, QualifiedRules, -} from '@commitlint/types'; -import {RuleConfigSeverity} from '@commitlint/types'; +} from "@commitlint/types"; +import { RuleConfigSeverity } from "@commitlint/types"; -import {buildCommitMessage} from './commit-message.js'; +import { buildCommitMessage } from "./commit-message.js"; export default async function lint( message: string, rawRulesConfig?: QualifiedRules, - rawOpts?: LintOptions + rawOpts?: LintOptions, ): Promise<LintOutcome> { const opts = rawOpts ? rawOpts - : {defaultIgnores: undefined, ignores: undefined}; + : { defaultIgnores: undefined, ignores: undefined }; const rulesConfig = rawRulesConfig || {}; // Found a wildcard match, skip if ( - isIgnored(message, {defaults: opts.defaultIgnores, ignores: opts.ignores}) + isIgnored(message, { defaults: opts.defaultIgnores, ignores: opts.ignores }) ) { return { valid: true, @@ -39,8 +39,8 @@ export default async function lint( // Parse the commit message const parsed = - message === '' - ? {header: null, body: null, footer: null} + message === "" + ? { header: null, body: null, footer: null } : await parse(message, undefined, opts.parserOpts); if ( @@ -58,14 +58,14 @@ export default async function lint( } const allRules: Map<string, BaseRule<never, RuleType>> = new Map( - Object.entries(defaultRules) + Object.entries(defaultRules), ); if (opts.plugins) { Object.values(opts.plugins).forEach((plugin) => { if (plugin.rules) { Object.keys(plugin.rules).forEach((ruleKey) => - allRules.set(ruleKey, plugin.rules[ruleKey]) + allRules.set(ruleKey, plugin.rules[ruleKey]), ); } }); @@ -73,16 +73,16 @@ export default async function lint( // Find invalid rules configs const missing = Object.keys(rulesConfig).filter( - (name) => typeof allRules.get(name) !== 'function' + (name) => typeof allRules.get(name) !== "function", ); if (missing.length > 0) { const names = [...allRules.keys()]; throw new RangeError( [ - `Found rules without implementation: ${missing.join(', ')}.`, - `Supported rules are: ${names.join(', ')}.`, - ].join('\n') + `Found rules without implementation: ${missing.join(", ")}.`, + `Supported rules are: ${names.join(", ")}.`, + ].join("\n"), ); } @@ -91,8 +91,8 @@ export default async function lint( if (!Array.isArray(config)) { return new Error( `config for rule ${name} must be array, received ${util.inspect( - config - )} of type ${typeof config}` + config, + )} of type ${typeof config}`, ); } @@ -104,43 +104,43 @@ export default async function lint( const [, when] = config; - if (typeof level !== 'number' || isNaN(level)) { + if (typeof level !== "number" || isNaN(level)) { return new Error( `level for rule ${name} must be number, received ${util.inspect( - level - )} of type ${typeof level}` + level, + )} of type ${typeof level}`, ); } if (config.length < 2 || config.length > 3) { return new Error( `config for rule ${name} must be 2 or 3 items long, received ${util.inspect( - config - )} of length ${config.length}` + config, + )} of length ${config.length}`, ); } if (level < 0 || level > 2) { return new RangeError( `level for rule ${name} must be between 0 and 2, received ${util.inspect( - level - )}` + level, + )}`, ); } - if (typeof when !== 'string') { + if (typeof when !== "string") { return new Error( `condition for rule ${name} must be string, received ${util.inspect( - when - )} of type ${typeof when}` + when, + )} of type ${typeof when}`, ); } - if (when !== 'never' && when !== 'always') { + if (when !== "never" && when !== "always") { return new Error( `condition for rule ${name} must be "always" or "never", received ${util.inspect( - when - )}` + when, + )}`, ); } @@ -149,7 +149,7 @@ export default async function lint( .filter((item): item is Error => item instanceof Error); if (invalid.length > 0) { - throw new Error(invalid.map((i) => i.message).join('\n')); + throw new Error(invalid.map((i) => i.message).join("\n")); } // Validate against all rules @@ -178,14 +178,14 @@ export default async function lint( }); const results = (await Promise.all(pendingResults)).filter( - (result): result is LintRuleOutcome => result !== null + (result): result is LintRuleOutcome => result !== null, ); const errors = results.filter( - (result) => result.level === RuleConfigSeverity.Error && !result.valid + (result) => result.level === RuleConfigSeverity.Error && !result.valid, ); const warnings = results.filter( - (result) => result.level === RuleConfigSeverity.Warning && !result.valid + (result) => result.level === RuleConfigSeverity.Warning && !result.valid, ); const valid = errors.length === 0; diff --git a/@commitlint/lint/tsconfig.json b/@commitlint/lint/tsconfig.json index d30e6bdbf0..bcd59cb2a3 100644 --- a/@commitlint/lint/tsconfig.json +++ b/@commitlint/lint/tsconfig.json @@ -8,9 +8,9 @@ "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], "references": [ - {"path": "../is-ignored"}, - {"path": "../parse"}, - {"path": "../rules"}, - {"path": "../types"} + { "path": "../is-ignored" }, + { "path": "../parse" }, + { "path": "../rules" }, + { "path": "../types" } ] } diff --git a/@commitlint/load/CHANGELOG.md b/@commitlint/load/CHANGELOG.md index f2557b4438..0e17e68544 100644 --- a/@commitlint/load/CHANGELOG.md +++ b/@commitlint/load/CHANGELOG.md @@ -3,6 +3,41 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + +**Note:** Version bump only for package @commitlint/load + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/load + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/load + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + ## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15) **Note:** Version bump only for package @commitlint/load diff --git a/@commitlint/load/fixtures/basic-config/.commitlintrc.cjs b/@commitlint/load/fixtures/basic-config/.commitlintrc.cjs index 2f37065f43..3c3d034f67 100644 --- a/@commitlint/load/fixtures/basic-config/.commitlintrc.cjs +++ b/@commitlint/load/fixtures/basic-config/.commitlintrc.cjs @@ -1,3 +1,5 @@ +'use strict'; + module.exports = { formatter: '@commitlint/format', rules: { diff --git a/@commitlint/load/fixtures/basic-config/commitlint.config.cjs b/@commitlint/load/fixtures/basic-config/commitlint.config.cjs index 2f37065f43..3c3d034f67 100644 --- a/@commitlint/load/fixtures/basic-config/commitlint.config.cjs +++ b/@commitlint/load/fixtures/basic-config/commitlint.config.cjs @@ -1,3 +1,5 @@ +'use strict'; + module.exports = { formatter: '@commitlint/format', rules: { diff --git a/@commitlint/load/fixtures/extends-config/.commitlintrc.cjs b/@commitlint/load/fixtures/extends-config/.commitlintrc.cjs index c58cb47afc..a864f31563 100644 --- a/@commitlint/load/fixtures/extends-config/.commitlintrc.cjs +++ b/@commitlint/load/fixtures/extends-config/.commitlintrc.cjs @@ -1,3 +1,5 @@ +'use strict'; + module.exports = { extends: ['./first-extended'], rules: { diff --git a/@commitlint/load/fixtures/extends-config/commitlint.config.cjs b/@commitlint/load/fixtures/extends-config/commitlint.config.cjs index c58cb47afc..a864f31563 100644 --- a/@commitlint/load/fixtures/extends-config/commitlint.config.cjs +++ b/@commitlint/load/fixtures/extends-config/commitlint.config.cjs @@ -1,3 +1,5 @@ +'use strict'; + module.exports = { extends: ['./first-extended'], rules: { diff --git a/@commitlint/load/package.json b/@commitlint/load/package.json index 215ac35c3f..583a00ee61 100644 --- a/@commitlint/load/package.json +++ b/@commitlint/load/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/load", "type": "module", - "version": "19.6.1", + "version": "20.1.0", "description": "Load shared commitlint configuration", "main": "lib/load.js", "types": "lib/load.d.ts", @@ -36,7 +36,7 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/test": "^19.5.0", + "@commitlint/test": "^20.0.0", "@types/lodash.isplainobject": "^4.0.8", "@types/lodash.merge": "^4.6.8", "@types/lodash.uniq": "^4.5.8", @@ -45,10 +45,10 @@ "typescript": "^5.2.2" }, "dependencies": { - "@commitlint/config-validator": "^19.5.0", - "@commitlint/execute-rule": "^19.5.0", - "@commitlint/resolve-extends": "^19.5.0", - "@commitlint/types": "^19.5.0", + "@commitlint/config-validator": "^20.0.0", + "@commitlint/execute-rule": "^20.0.0", + "@commitlint/resolve-extends": "^20.1.0", + "@commitlint/types": "^20.0.0", "chalk": "^5.3.0", "cosmiconfig": "^9.0.0", "cosmiconfig-typescript-loader": "^6.1.0", @@ -56,5 +56,5 @@ "lodash.merge": "^4.6.2", "lodash.uniq": "^4.5.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/load/src/load.test.ts b/@commitlint/load/src/load.test.ts index f56850f510..43a02d4bf5 100644 --- a/@commitlint/load/src/load.test.ts +++ b/@commitlint/load/src/load.test.ts @@ -1,23 +1,23 @@ -import {describe, test, expect, vi} from 'vitest'; -import {readFileSync, writeFileSync} from 'fs'; -import path from 'path'; -import {fileURLToPath} from 'url'; +import { describe, test, expect, vi } from "vitest"; +import { readFileSync, writeFileSync } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; -import {RuleConfigSeverity} from '@commitlint/types'; -import {fix, git, npm} from '@commitlint/test'; +import { RuleConfigSeverity } from "@commitlint/types"; +import { fix, git, npm } from "@commitlint/test"; -import load, {resolveFrom} from './load.js'; -import {isDynamicAwaitSupported} from './utils/load-config.js'; +import load, { resolveFrom } from "./load.js"; +import { isDynamicAwaitSupported } from "./utils/load-config.js"; -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); const plugin = vi.fn(); const scopedPlugin = vi.fn(); -vi.mock('commitlint-plugin-example', () => ({ +vi.mock("commitlint-plugin-example", () => ({ default: plugin, })); -vi.mock('@scope/commitlint-plugin-example', () => ({ +vi.mock("@scope/commitlint-plugin-example", () => ({ default: scopedPlugin, })); @@ -25,110 +25,113 @@ const fixBootstrap = (name: string) => fix.bootstrap(name, __dirname); const gitBootstrap = (name: string) => git.bootstrap(name, __dirname); const npmBootstrap = (name: string) => npm.bootstrap(name, __dirname); -test('extends-empty should have no rules', async () => { - const cwd = await gitBootstrap('fixtures/extends-empty'); - const actual = await load({}, {cwd}); +test("extends-empty should have no rules", async () => { + const cwd = await gitBootstrap("fixtures/extends-empty"); + const actual = await load({}, { cwd }); expect(actual.rules).toMatchObject({}); expect(actual.parserPreset).not.toBeDefined(); }); -test('uses seed as configured', async () => { - const cwd = await gitBootstrap('fixtures/extends-empty'); +test("uses seed as configured", async () => { + const cwd = await gitBootstrap("fixtures/extends-empty"); const rules = { - 'body-case': [RuleConfigSeverity.Warning, 'never', 'camel-case'] as any, + "body-case": [RuleConfigSeverity.Warning, "never", "camel-case"] as any, }; - const actual = await load({rules}, {cwd}); + const actual = await load({ rules }, { cwd }); - expect(actual.rules['body-case']).toStrictEqual([ + expect(actual.rules["body-case"]).toStrictEqual([ RuleConfigSeverity.Warning, - 'never', - 'camel-case', + "never", + "camel-case", ]); }); -test('rules should be loaded from local', async () => { +test("rules should be loaded from local", async () => { const actual = await load({ rules: { - direct: [RuleConfigSeverity.Warning, 'never', 'foo'], - func: () => [RuleConfigSeverity.Warning, 'never', 'foo'], - async: async () => [RuleConfigSeverity.Warning, 'never', 'foo'], + direct: [RuleConfigSeverity.Warning, "never", "foo"], + func: () => [RuleConfigSeverity.Warning, "never", "foo"], + async: async () => [RuleConfigSeverity.Warning, "never", "foo"], promise: () => - Promise.resolve([RuleConfigSeverity.Warning, 'never', 'foo']), + Promise.resolve([RuleConfigSeverity.Warning, "never", "foo"]), }, }); - expect(actual.rules['direct']).toStrictEqual([ + expect(actual.rules["direct"]).toStrictEqual([ RuleConfigSeverity.Warning, - 'never', - 'foo', + "never", + "foo", ]); - expect(actual.rules['func']).toStrictEqual([ + expect(actual.rules["func"]).toStrictEqual([ RuleConfigSeverity.Warning, - 'never', - 'foo', + "never", + "foo", ]); - expect(actual.rules['async']).toStrictEqual([ + expect(actual.rules["async"]).toStrictEqual([ RuleConfigSeverity.Warning, - 'never', - 'foo', + "never", + "foo", ]); - expect(actual.rules['promise']).toStrictEqual([ + expect(actual.rules["promise"]).toStrictEqual([ RuleConfigSeverity.Warning, - 'never', - 'foo', + "never", + "foo", ]); }); -test('rules should be loaded from relative config file', async () => { - const file = 'config/commitlint.config.js'; - const cwd = await gitBootstrap('fixtures/specify-config-file'); +test("rules should be loaded from relative config file", async () => { + const file = "config/commitlint.config.js"; + const cwd = await gitBootstrap("fixtures/specify-config-file"); const rules = { - 'body-case': [RuleConfigSeverity.Warning, 'never', 'camel-case'] as any, + "body-case": [RuleConfigSeverity.Warning, "never", "camel-case"] as any, }; - const actual = await load({rules}, {cwd, file}); + const actual = await load({ rules }, { cwd, file }); - expect(actual.rules['body-case']).toStrictEqual([ + expect(actual.rules["body-case"]).toStrictEqual([ RuleConfigSeverity.Warning, - 'never', - 'camel-case', + "never", + "camel-case", ]); }); -test('rules should be loaded from absolute config file', async () => { - const cwd = await gitBootstrap('fixtures/specify-config-file'); - const file = path.resolve(cwd, 'config/commitlint.config.js'); +test("rules should be loaded from absolute config file", async () => { + const cwd = await gitBootstrap("fixtures/specify-config-file"); + const file = path.resolve(cwd, "config/commitlint.config.js"); const rules = { - 'body-case': [RuleConfigSeverity.Warning, 'never', 'camel-case'] as any, + "body-case": [RuleConfigSeverity.Warning, "never", "camel-case"] as any, }; - const actual = await load({rules}, {cwd: process.cwd(), file}); + const actual = await load({ rules }, { cwd: process.cwd(), file }); - expect(actual.rules['body-case']).toStrictEqual([ + expect(actual.rules["body-case"]).toStrictEqual([ RuleConfigSeverity.Warning, - 'never', - 'camel-case', + "never", + "camel-case", ]); }); -test('plugins should be loaded from seed', async () => { - const cwd = await gitBootstrap('fixtures/extends-empty'); - const actual = await load({plugins: ['example', '@scope/example']}, {cwd}); +test("plugins should be loaded from seed", async () => { + const cwd = await gitBootstrap("fixtures/extends-empty"); + const actual = await load( + { plugins: ["example", "@scope/example"] }, + { cwd }, + ); expect(actual.plugins).toMatchObject({ example: plugin, - '@scope/example': scopedPlugin, + "@scope/example": scopedPlugin, }); }); -test('plugins should be loaded from local', async () => { +test("plugins should be loaded from local", async () => { const actual = await load({ plugins: [ { rules: { - test: () => [true, 'asd'], + test: () => [true, "asd"], }, }, ], @@ -141,122 +144,122 @@ test('plugins should be loaded from local', async () => { test: expect.any(Function), }, }, - }) + }), ); }); -test('plugins should be loaded from config', async () => { - const cwd = await gitBootstrap('fixtures/extends-plugins'); - const actual = await load({}, {cwd}); +test("plugins should be loaded from config", async () => { + const cwd = await gitBootstrap("fixtures/extends-plugins"); + const actual = await load({}, { cwd }); expect(actual.plugins).toMatchObject({ example: plugin, - '@scope/example': scopedPlugin, + "@scope/example": scopedPlugin, }); }); -test('plugins should be loaded from shareable config', async () => { - const cwd = await gitBootstrap('fixtures/extends-with-plugins'); - const actual = await load({}, {cwd}); +test("plugins should be loaded from shareable config", async () => { + const cwd = await gitBootstrap("fixtures/extends-with-plugins"); + const actual = await load({}, { cwd }); expect(actual.plugins).toMatchObject({ example: plugin, - '@scope/example': scopedPlugin, + "@scope/example": scopedPlugin, }); }); -test('local plugins should be loaded from shareable configs', async () => { - const cwd = await gitBootstrap('fixtures/extends-with-local-plugins'); - const actual = await load({}, {cwd}); +test("local plugins should be loaded from shareable configs", async () => { + const cwd = await gitBootstrap("fixtures/extends-with-local-plugins"); + const actual = await load({}, { cwd }); expect(actual.plugins).toEqual( expect.objectContaining({ local: { rules: { - 'hello-world-rule': expect.any(Function), - 'is-positive': expect.any(Function), + "hello-world-rule": expect.any(Function), + "is-positive": expect.any(Function), }, }, - }) + }), ); }); -test('uses seed with parserPreset', async () => { - const cwd = await gitBootstrap('fixtures/parser-preset'); - const {parserPreset: actual} = await load( - {parserPreset: './conventional-changelog-custom'}, - {cwd} +test("uses seed with parserPreset", async () => { + const cwd = await gitBootstrap("fixtures/parser-preset"); + const { parserPreset: actual } = await load( + { parserPreset: "./conventional-changelog-custom" }, + { cwd }, ); expect(actual).toBeDefined(); - expect(actual!.name).toBe('./conventional-changelog-custom'); + expect(actual!.name).toBe("./conventional-changelog-custom"); expect(actual!.parserOpts).toMatchObject({ headerPattern: /^(\w*)(?:\((.*)\))?-(.*)$/, }); }); -test('invalid extend should throw', async () => { - const cwd = await gitBootstrap('fixtures/extends-invalid'); +test("invalid extend should throw", async () => { + const cwd = await gitBootstrap("fixtures/extends-invalid"); - await expect(load({}, {cwd})).rejects.toThrow(); + await expect(load({}, { cwd })).rejects.toThrow(); }); -test('empty file should have no rules', async () => { - const cwd = await gitBootstrap('fixtures/empty-object-file'); - const actual = await load({}, {cwd}); +test("empty file should have no rules", async () => { + const cwd = await gitBootstrap("fixtures/empty-object-file"); + const actual = await load({}, { cwd }); expect(actual.rules).toMatchObject({}); }); -test('empty file should extend nothing', async () => { - const cwd = await gitBootstrap('fixtures/empty-file'); - const actual = await load({}, {cwd}); +test("empty file should extend nothing", async () => { + const cwd = await gitBootstrap("fixtures/empty-file"); + const actual = await load({}, { cwd }); expect(actual.extends).toHaveLength(0); }); -test('respects cwd option', async () => { - const cwd = await gitBootstrap('fixtures/recursive-extends/first-extended'); - const actual = await load({}, {cwd}); +test("respects cwd option", async () => { + const cwd = await gitBootstrap("fixtures/recursive-extends/first-extended"); + const actual = await load({}, { cwd }); expect(actual).toMatchObject({ - formatter: '@commitlint/format', - extends: ['./second-extended'], + formatter: "@commitlint/format", + extends: ["./second-extended"], plugins: {}, rules: { - one: [RuleConfigSeverity.Warning, 'always'], - two: [RuleConfigSeverity.Error, 'never'], + one: [RuleConfigSeverity.Warning, "always"], + two: [RuleConfigSeverity.Error, "never"], }, }); }); -describe.each([['basic'], ['extends']])('%s config', (template) => { - const isExtendsTemplate = template === 'extends'; +describe.each([["basic"], ["extends"]])("%s config", (template) => { + const isExtendsTemplate = template === "extends"; const configFiles = [ - 'commitlint.config.cjs', - 'commitlint.config.js', - 'commitlint.config.mjs', - 'package.json', - 'package.yaml', - '.commitlintrc', - '.commitlintrc.cjs', - '.commitlintrc.js', - '.commitlintrc.json', - '.commitlintrc.mjs', - '.commitlintrc.yml', - '.commitlintrc.yaml', + "commitlint.config.cjs", + "commitlint.config.js", + "commitlint.config.mjs", + "package.json", + "package.yaml", + ".commitlintrc", + ".commitlintrc.cjs", + ".commitlintrc.js", + ".commitlintrc.json", + ".commitlintrc.mjs", + ".commitlintrc.yml", + ".commitlintrc.yaml", ]; const configTestCases = [ ...configFiles - .filter((filename) => !filename.endsWith('.mjs')) - .map((filename) => ({filename, isEsm: false})), + .filter((filename) => !filename.endsWith(".mjs")) + .map((filename) => ({ filename, isEsm: false })), ...configFiles .filter((filename) => - ['.mjs', '.js'].some((ext) => filename.endsWith(ext)) + [".mjs", ".js"].some((ext) => filename.endsWith(ext)), ) - .map((filename) => ({filename, isEsm: true})), + .map((filename) => ({ filename, isEsm: true })), ]; const getConfigContents = ({ @@ -266,60 +269,60 @@ describe.each([['basic'], ['extends']])('%s config', (template) => { filename: string; isEsm: boolean; }): string | NodeJS.ArrayBufferView => { - if (filename === 'package.json') { + if (filename === "package.json") { const configPath = path.join( __dirname, - `../fixtures/${template}-config/.commitlintrc.json` + `../fixtures/${template}-config/.commitlintrc.json`, ); const commitlint = JSON.parse( - readFileSync(configPath, {encoding: 'utf-8'}) + readFileSync(configPath, { encoding: "utf-8" }), ); - return JSON.stringify({commitlint}); - } else if (filename === 'package.yaml') { + return JSON.stringify({ commitlint }); + } else if (filename === "package.yaml") { const configPath = path.join( __dirname, - `../fixtures/${template}-config/.commitlintrc.yaml` + `../fixtures/${template}-config/.commitlintrc.yaml`, ); - const yaml = readFileSync(configPath, {encoding: 'utf-8'}); - return `commitlint:\n${yaml.replace(/^/gm, ' ')}`; + const yaml = readFileSync(configPath, { encoding: "utf-8" }); + return `commitlint:\n${yaml.replace(/^/gm, " ")}`; } else { - const filePath = ['..', 'fixtures', `${template}-config`, filename]; + const filePath = ["..", "fixtures", `${template}-config`, filename]; if (isEsm) { - filePath.splice(3, 0, 'esm'); + filePath.splice(3, 0, "esm"); } - const configPath = path.join(__dirname, filePath.join('/')); + const configPath = path.join(__dirname, filePath.join("/")); return readFileSync(configPath); } }; const esmBootstrap = (cwd: string) => { - const packageJsonPath = path.join(cwd, 'package.json'); + const packageJsonPath = path.join(cwd, "package.json"); const packageJSON = JSON.parse( - readFileSync(packageJsonPath, {encoding: 'utf-8'}) + readFileSync(packageJsonPath, { encoding: "utf-8" }), ); writeFileSync( packageJsonPath, JSON.stringify({ ...packageJSON, - type: 'module', - }) + type: "module", + }), ); }; - const templateFolder = [template, isExtendsTemplate ? 'js' : '', 'template'] + const templateFolder = [template, isExtendsTemplate ? "js" : "", "template"] .filter((elem) => elem) - .join('-'); + .join("-"); test.each( configTestCases // Skip ESM tests for the extends suite until resolve-extends supports ESM - .filter(({isEsm}) => template !== 'extends' || !isEsm) + .filter(({ isEsm }) => template !== "extends" || !isEsm) // Skip ESM tests if dynamic await is not supported; Jest will crash with a seg fault error - .filter(({isEsm}) => isDynamicAwaitSupported() || !isEsm) - )('$filename, ESM: $isEsm', async ({filename, isEsm}) => { + .filter(({ isEsm }) => isDynamicAwaitSupported() || !isEsm), + )("$filename, ESM: $isEsm", async ({ filename, isEsm }) => { const cwd = await gitBootstrap(`fixtures/${templateFolder}`); if (isEsm) { @@ -328,253 +331,253 @@ describe.each([['basic'], ['extends']])('%s config', (template) => { writeFileSync( path.join(cwd, filename), - getConfigContents({filename, isEsm}) + getConfigContents({ filename, isEsm }), ); - const actual = await load({}, {cwd}); + const actual = await load({}, { cwd }); expect(actual).toMatchObject({ - formatter: '@commitlint/format', - extends: isExtendsTemplate ? ['./first-extended'] : [], + formatter: "@commitlint/format", + extends: isExtendsTemplate ? ["./first-extended"] : [], plugins: {}, rules: { - zero: [RuleConfigSeverity.Disabled, 'never'], - one: [RuleConfigSeverity.Warning, 'always'], - two: [RuleConfigSeverity.Error, 'never'], + zero: [RuleConfigSeverity.Disabled, "never"], + one: [RuleConfigSeverity.Warning, "always"], + two: [RuleConfigSeverity.Error, "never"], }, }); }); }); -test('recursive extends with ts file', async () => { - const cwd = await gitBootstrap('fixtures/recursive-extends-ts'); - const actual = await load({}, {cwd}); +test("recursive extends with ts file", async () => { + const cwd = await gitBootstrap("fixtures/recursive-extends-ts"); + const actual = await load({}, { cwd }); expect(actual).toMatchObject({ - formatter: '@commitlint/format', - extends: ['./first-extended/index.ts'], + formatter: "@commitlint/format", + extends: ["./first-extended/index.ts"], plugins: {}, rules: { - zero: [RuleConfigSeverity.Disabled, 'never', 'zero'], - one: [RuleConfigSeverity.Warning, 'never', 'one'], - two: [RuleConfigSeverity.Error, 'never', 'two'], + zero: [RuleConfigSeverity.Disabled, "never", "zero"], + one: [RuleConfigSeverity.Warning, "never", "one"], + two: [RuleConfigSeverity.Error, "never", "two"], }, }); }); -test('parser preset overwrites completely instead of merging', async () => { - const cwd = await gitBootstrap('fixtures/parser-preset-override'); - const actual = await load({}, {cwd}); +test("parser preset overwrites completely instead of merging", async () => { + const cwd = await gitBootstrap("fixtures/parser-preset-override"); + const actual = await load({}, { cwd }); expect(actual.parserPreset).toBeDefined(); - expect(actual.parserPreset!.name).toBe('./custom'); + expect(actual.parserPreset!.name).toBe("./custom"); expect(actual.parserPreset!.parserOpts).toMatchObject({ headerPattern: /.*/, }); }); -test('recursive extends with parserPreset', async () => { - const cwd = await gitBootstrap('fixtures/recursive-parser-preset'); - const actual = await load({}, {cwd}); +test("recursive extends with parserPreset", async () => { + const cwd = await gitBootstrap("fixtures/recursive-parser-preset"); + const actual = await load({}, { cwd }); expect(actual.parserPreset).toBeDefined(); - expect(actual.parserPreset!.name).toBe('./conventional-changelog-custom'); + expect(actual.parserPreset!.name).toBe("./conventional-changelog-custom"); expect(actual.parserPreset!.parserOpts).toMatchObject({ headerPattern: /^(\w*)(?:\((.*)\))?-(.*)$/, }); }); -test('ignores unknown keys', async () => { - const cwd = await gitBootstrap('fixtures/trash-file'); - const actual = await load({}, {cwd}); +test("ignores unknown keys", async () => { + const cwd = await gitBootstrap("fixtures/trash-file"); + const actual = await load({}, { cwd }); expect(actual).toMatchObject({ - formatter: '@commitlint/format', + formatter: "@commitlint/format", extends: [], plugins: {}, rules: { - foo: [RuleConfigSeverity.Warning, 'always', 'bar'], - baz: [RuleConfigSeverity.Warning, 'always', 'bar'], + foo: [RuleConfigSeverity.Warning, "always", "bar"], + baz: [RuleConfigSeverity.Warning, "always", "bar"], }, }); }); -test('ignores unknown keys recursively', async () => { - const cwd = await gitBootstrap('fixtures/trash-extend'); - const actual = await load({}, {cwd}); +test("ignores unknown keys recursively", async () => { + const cwd = await gitBootstrap("fixtures/trash-extend"); + const actual = await load({}, { cwd }); expect(actual).toMatchObject({ - formatter: '@commitlint/format', - extends: ['./one'], + formatter: "@commitlint/format", + extends: ["./one"], plugins: {}, rules: { - zero: [RuleConfigSeverity.Disabled, 'always', 'zero'], - one: [RuleConfigSeverity.Warning, 'always', 'one'], + zero: [RuleConfigSeverity.Disabled, "always", "zero"], + one: [RuleConfigSeverity.Warning, "always", "one"], }, }); }); -test('find up from given cwd', async () => { - const outer = await fixBootstrap('fixtures/outer-scope'); - await git.init(path.join(outer, 'inner-scope')); - const cwd = path.join(outer, 'inner-scope', 'child-scope'); - const actual = await load({}, {cwd}); +test("find up from given cwd", async () => { + const outer = await fixBootstrap("fixtures/outer-scope"); + await git.init(path.join(outer, "inner-scope")); + const cwd = path.join(outer, "inner-scope", "child-scope"); + const actual = await load({}, { cwd }); expect(actual).toMatchObject({ - formatter: '@commitlint/format', + formatter: "@commitlint/format", extends: [], plugins: {}, rules: { - child: [RuleConfigSeverity.Error, 'always', true], - inner: [RuleConfigSeverity.Error, 'always', false], - outer: [RuleConfigSeverity.Error, 'always', false], + child: [RuleConfigSeverity.Error, "always", true], + inner: [RuleConfigSeverity.Error, "always", false], + outer: [RuleConfigSeverity.Error, "always", false], }, }); }); -test('find up config from outside current git repo', async () => { - const outer = await fixBootstrap('fixtures/outer-scope'); - const cwd = await git.init(path.join(outer, 'inner-scope')); - const actual = await load({}, {cwd}); +test("find up config from outside current git repo", async () => { + const outer = await fixBootstrap("fixtures/outer-scope"); + const cwd = await git.init(path.join(outer, "inner-scope")); + const actual = await load({}, { cwd }); expect(actual).toMatchObject({ - formatter: '@commitlint/format', + formatter: "@commitlint/format", extends: [], plugins: {}, rules: { - child: [RuleConfigSeverity.Warning, 'never', false], - inner: [RuleConfigSeverity.Warning, 'never', false], - outer: [RuleConfigSeverity.Warning, 'never', true], + child: [RuleConfigSeverity.Warning, "never", false], + inner: [RuleConfigSeverity.Warning, "never", false], + outer: [RuleConfigSeverity.Warning, "never", true], }, }); }); -test('respects formatter option', async () => { - const cwd = await gitBootstrap('fixtures/formatter'); - const actual = await load({}, {cwd}); +test("respects formatter option", async () => { + const cwd = await gitBootstrap("fixtures/formatter"); + const actual = await load({}, { cwd }); expect(actual).toMatchObject({ - formatter: 'commitlint-junit', + formatter: "commitlint-junit", extends: [], plugins: {}, rules: {}, }); }); -test('resolves formatter relative from config directory', async () => { - const cwd = await gitBootstrap('fixtures/formatter-local-module'); - const actual = await load({}, {cwd}); +test("resolves formatter relative from config directory", async () => { + const cwd = await gitBootstrap("fixtures/formatter-local-module"); + const actual = await load({}, { cwd }); expect(actual).toMatchObject({ - formatter: resolveFrom('./formatters/custom.js', cwd), + formatter: resolveFrom("./formatters/custom.js", cwd), extends: [], plugins: {}, rules: {}, }); }); -test('returns formatter name when unable to resolve from config directory', async () => { - const cwd = await gitBootstrap('fixtures/formatter-local-module'); - const actual = await load({formatter: './doesnt/exists.js'}, {cwd}); +test("returns formatter name when unable to resolve from config directory", async () => { + const cwd = await gitBootstrap("fixtures/formatter-local-module"); + const actual = await load({ formatter: "./doesnt/exists.js" }, { cwd }); expect(actual).toMatchObject({ - formatter: './doesnt/exists.js', + formatter: "./doesnt/exists.js", extends: [], plugins: {}, rules: {}, }); }); -test('does not mutate config module reference', async () => { - const file = 'config/commitlint.config.js'; - const cwd = await gitBootstrap('fixtures/specify-config-file'); +test("does not mutate config module reference", async () => { + const file = "config/commitlint.config.js"; + const cwd = await gitBootstrap("fixtures/specify-config-file"); const rules = { - 'body-case': [RuleConfigSeverity.Warning, 'never', 'camel-case'] as any, + "body-case": [RuleConfigSeverity.Warning, "never", "camel-case"] as any, }; const configPath = path.join(cwd, file); - const before = readFileSync(configPath, {encoding: 'utf-8'}); - await load({rules}, {cwd, file}); - const after = readFileSync(configPath, {encoding: 'utf-8'}); + const before = readFileSync(configPath, { encoding: "utf-8" }); + await load({ rules }, { cwd, file }); + const after = readFileSync(configPath, { encoding: "utf-8" }); expect(after).toBe(before); }); -test('resolves parser preset from conventional commits', async () => { - const cwd = await npmBootstrap('fixtures/parser-preset-conventionalcommits'); - const actual = await load({}, {cwd}); +test("resolves parser preset from conventional commits", async () => { + const cwd = await npmBootstrap("fixtures/parser-preset-conventionalcommits"); + const actual = await load({}, { cwd }); expect(actual.parserPreset).toBeDefined(); expect(actual.parserPreset!.name).toBe( - 'conventional-changelog-conventionalcommits' + "conventional-changelog-conventionalcommits", ); - expect(typeof actual.parserPreset!.parserOpts).toBe('object'); + expect(typeof actual.parserPreset!.parserOpts).toBe("object"); expect((actual.parserPreset!.parserOpts as any).headerPattern).toEqual( - /^(\w*)(?:\((.*)\))?!?: (.*)$/ + /^(\w*)(?:\((.*)\))?!?: (.*)$/, ); }); -test('resolves parser preset from conventional angular', async () => { - const cwd = await npmBootstrap('fixtures/parser-preset-angular'); - const actual = await load({}, {cwd}); +test("resolves parser preset from conventional angular", async () => { + const cwd = await npmBootstrap("fixtures/parser-preset-angular"); + const actual = await load({}, { cwd }); expect(actual.parserPreset).toBeDefined(); - expect(actual.parserPreset!.name).toBe('conventional-changelog-angular'); - expect(typeof actual.parserPreset!.parserOpts).toBe('object'); + expect(actual.parserPreset!.name).toBe("conventional-changelog-angular"); + expect(typeof actual.parserPreset!.parserOpts).toBe("object"); expect((actual.parserPreset!.parserOpts as any).headerPattern).toEqual( - /^(\w*)(?:\((.*)\))?: (.*)$/ + /^(\w*)(?:\((.*)\))?: (.*)$/, ); }); -test('recursive resolves parser preset from conventional atom', async () => { +test("recursive resolves parser preset from conventional atom", async () => { const cwd = await gitBootstrap( - 'fixtures/recursive-parser-preset-conventional-atom' + "fixtures/recursive-parser-preset-conventional-atom", ); await npm.installModules( - path.resolve(cwd, 'first-extended', 'second-extended') + path.resolve(cwd, "first-extended", "second-extended"), ); - const actual = await load({}, {cwd}); + const actual = await load({}, { cwd }); expect(actual.parserPreset).toBeDefined(); - expect(actual.parserPreset!.name).toBe('conventional-changelog-atom'); - expect(typeof actual.parserPreset!.parserOpts).toBe('object'); + expect(actual.parserPreset!.name).toBe("conventional-changelog-atom"); + expect(typeof actual.parserPreset!.parserOpts).toBe("object"); expect((actual.parserPreset!.parserOpts as any).headerPattern).toEqual( - /^(:.*?:) (.*)$/ + /^(:.*?:) (.*)$/, ); }); -test('resolves parser preset from conventional commits without factory support', async () => { +test("resolves parser preset from conventional commits without factory support", async () => { const cwd = await npmBootstrap( - 'fixtures/parser-preset-conventional-without-factory' + "fixtures/parser-preset-conventional-without-factory", ); - const actual = await load({}, {cwd}); + const actual = await load({}, { cwd }); expect(actual.parserPreset).toBeDefined(); expect(actual.parserPreset!.name).toBe( - 'conventional-changelog-conventionalcommits' + "conventional-changelog-conventionalcommits", ); - expect(typeof actual.parserPreset!.parserOpts).toBe('object'); + expect(typeof actual.parserPreset!.parserOpts).toBe("object"); expect((actual.parserPreset!.parserOpts as any).headerPattern).toEqual( - /^(\w*)(?:\((.*)\))?!?: (.*)$/ + /^(\w*)(?:\((.*)\))?!?: (.*)$/, ); }); -test('helpUrl should be loaded from the shareable config', async () => { - const cwd = await gitBootstrap('fixtures/help-url'); - const actual = await load({}, {cwd}); +test("helpUrl should be loaded from the shareable config", async () => { + const cwd = await gitBootstrap("fixtures/help-url"); + const actual = await load({}, { cwd }); expect(actual.helpUrl).toStrictEqual( - 'https://github.com/conventional-changelog/commitlint' + "https://github.com/conventional-changelog/commitlint", ); }); -test('default helpUrl should be loaded if not provided in shareable configs', async () => { - const cwd = await gitBootstrap('fixtures/basic'); - const actual = await load({}, {cwd}); +test("default helpUrl should be loaded if not provided in shareable configs", async () => { + const cwd = await gitBootstrap("fixtures/basic"); + const actual = await load({}, { cwd }); expect(actual.helpUrl).toStrictEqual( - 'https://github.com/conventional-changelog/commitlint/#what-is-commitlint' + "https://github.com/conventional-changelog/commitlint/#what-is-commitlint", ); }); diff --git a/@commitlint/load/src/load.ts b/@commitlint/load/src/load.ts index 0d63e74f7d..c20f39f245 100644 --- a/@commitlint/load/src/load.ts +++ b/@commitlint/load/src/load.ts @@ -1,27 +1,27 @@ -import path from 'path'; +import path from "node:path"; -import {validateConfig} from '@commitlint/config-validator'; -import executeRule from '@commitlint/execute-rule'; +import { validateConfig } from "@commitlint/config-validator"; +import executeRule from "@commitlint/execute-rule"; import resolveExtends, { resolveFrom, resolveFromSilent, resolveGlobalSilent, loadParserPreset, -} from '@commitlint/resolve-extends'; +} from "@commitlint/resolve-extends"; import { LoadOptions, PluginRecords, QualifiedConfig, QualifiedRules, UserConfig, -} from '@commitlint/types'; -import isPlainObject from 'lodash.isplainobject'; -import merge from 'lodash.merge'; -import uniq from 'lodash.uniq'; +} from "@commitlint/types"; +import isPlainObject from "lodash.isplainobject"; +import merge from "lodash.merge"; +import uniq from "lodash.uniq"; -import {loadConfig} from './utils/load-config.js'; -import {loadParserOpts} from './utils/load-parser-opts.js'; -import loadPlugin from './utils/load-plugin.js'; +import { loadConfig } from "./utils/load-config.js"; +import { loadParserOpts } from "./utils/load-parser-opts.js"; +import loadPlugin from "./utils/load-plugin.js"; /** * formatter should be kept as is when unable to resolve it from config directory @@ -36,15 +36,15 @@ const resolveFormatter = (formatter: string, parent?: string): string => { export default async function load( seed: UserConfig = {}, - options: LoadOptions = {} + options: LoadOptions = {}, ): Promise<QualifiedConfig> { - const cwd = typeof options.cwd === 'undefined' ? process.cwd() : options.cwd; + const cwd = typeof options.cwd === "undefined" ? process.cwd() : options.cwd; const loaded = await loadConfig(cwd, options.file); const baseDirectory = loaded?.filepath ? path.dirname(loaded.filepath) : cwd; const configFilePath = loaded?.filepath; let config: UserConfig = {}; if (loaded) { - validateConfig(loaded.filepath || '', loaded.config); + validateConfig(loaded.filepath || "", loaded.config); config = loaded.config; } @@ -56,14 +56,14 @@ export default async function load( rules: {}, }, config, - seed + seed, ); // Resolve parserPreset key - if (typeof config.parserPreset === 'string') { + if (typeof config.parserPreset === "string") { const resolvedParserPreset = resolveFrom( config.parserPreset, - configFilePath + configFilePath, ); config.parserPreset = { @@ -74,23 +74,23 @@ export default async function load( // Resolve extends key const extended = await resolveExtends(config, { - prefix: 'commitlint-config', + prefix: "commitlint-config", cwd: baseDirectory, parserPreset: await config.parserPreset, }); - if (!extended.formatter || typeof extended.formatter !== 'string') { - extended.formatter = '@commitlint/format'; + if (!extended.formatter || typeof extended.formatter !== "string") { + extended.formatter = "@commitlint/format"; } let plugins: PluginRecords = {}; if (Array.isArray(extended.plugins)) { for (const plugin of uniq(extended.plugins)) { - if (typeof plugin === 'string') { + if (typeof plugin === "string") { plugins = await loadPlugin( plugins, plugin, - process.env.DEBUG === 'true' + process.env.DEBUG === "true", ); } else { plugins.local = plugin; @@ -100,7 +100,7 @@ export default async function load( const rules = ( await Promise.all( - Object.entries(extended.rules || {}).map((entry) => executeRule(entry)) + Object.entries(extended.rules || {}).map((entry) => executeRule(entry)), ) ).reduce<QualifiedRules>((registry, item) => { // type of `item` can be null, but Object.entries always returns key pair @@ -110,11 +110,11 @@ export default async function load( }, {}); const helpUrl = - typeof extended.helpUrl === 'string' + typeof extended.helpUrl === "string" ? extended.helpUrl - : typeof config.helpUrl === 'string' - ? config.helpUrl - : 'https://github.com/conventional-changelog/commitlint/#what-is-commitlint'; + : typeof config.helpUrl === "string" + ? config.helpUrl + : "https://github.com/conventional-changelog/commitlint/#what-is-commitlint"; const prompt = extended.prompt && isPlainObject(extended.prompt) ? extended.prompt : {}; @@ -122,9 +122,9 @@ export default async function load( return { extends: Array.isArray(extended.extends) ? extended.extends - : typeof extended.extends === 'string' - ? [extended.extends] - : [], + : typeof extended.extends === "string" + ? [extended.extends] + : [], // Resolve config-relative formatter module formatter: resolveFormatter(extended.formatter, configFilePath), // Resolve parser-opts from preset @@ -138,4 +138,4 @@ export default async function load( }; } -export {resolveFrom, resolveFromSilent, resolveGlobalSilent}; +export { resolveFrom, resolveFromSilent, resolveGlobalSilent }; diff --git a/@commitlint/load/src/utils/load-config.ts b/@commitlint/load/src/utils/load-config.ts index 34a8af8039..0db5148ae6 100644 --- a/@commitlint/load/src/utils/load-config.ts +++ b/@commitlint/load/src/utils/load-config.ts @@ -1,13 +1,13 @@ -import {existsSync, readFileSync} from 'fs'; -import path from 'path'; +import { existsSync, readFileSync } from "node:fs"; +import path from "node:path"; import { cosmiconfig, defaultLoadersSync, type Loader, defaultLoaders, -} from 'cosmiconfig'; -import {TypeScriptLoader} from 'cosmiconfig-typescript-loader'; +} from "cosmiconfig"; +import { TypeScriptLoader } from "cosmiconfig-typescript-loader"; export interface LoadConfigResult { config: unknown; @@ -15,12 +15,12 @@ export interface LoadConfigResult { isEmpty?: boolean; } -const moduleName = 'commitlint'; -const searchStrategy = 'global'; +const moduleName = "commitlint"; +const searchStrategy = "global"; export async function loadConfig( cwd: string, - configPath?: string + configPath?: string, ): Promise<LoadConfigResult | null> { let tsLoaderInstance: Loader | undefined; const tsLoader: Loader = (...args) => { @@ -42,8 +42,8 @@ export async function loadConfig( searchPlaces: [ // cosmiconfig overrides default searchPlaces if any new search place is added (For e.g. `*.ts` files), // we need to manually merge default searchPlaces from https://github.com/davidtheclark/cosmiconfig#searchplaces - 'package.json', - 'package.yaml', + "package.json", + "package.yaml", `.${moduleName}rc`, `.${moduleName}rc.json`, `.${moduleName}rc.yaml`, @@ -62,10 +62,10 @@ export async function loadConfig( `${moduleName}.config.cts`, ], loaders: { - '.ts': tsLoader, - '.cts': tsLoader, - '.cjs': loaders['.cjs'], - '.js': loaders['.js'], + ".ts": tsLoader, + ".cts": tsLoader, + ".cjs": loaders[".cjs"], + ".js": loaders[".js"], }, }); @@ -86,8 +86,8 @@ export async function loadConfig( // - Resolution: https://github.com/nodejs/node/pull/48510 (Node v20.8.0) export const isDynamicAwaitSupported = () => { const [major, minor] = process.version - .replace('v', '') - .split('.') + .replace("v", "") + .split(".") .map((val) => parseInt(val)); return major >= 20 && minor >= 8; @@ -95,12 +95,12 @@ export const isDynamicAwaitSupported = () => { // Is the given directory set up to use ESM (ECMAScript Modules)? export const isEsmModule = (cwd: string) => { - const packagePath = path.join(cwd, 'package.json'); + const packagePath = path.join(cwd, "package.json"); if (!existsSync(packagePath)) { return false; } - const packageJSON = readFileSync(packagePath, {encoding: 'utf-8'}); - return JSON.parse(packageJSON)?.type === 'module'; + const packageJSON = readFileSync(packagePath, { encoding: "utf-8" }); + return JSON.parse(packageJSON)?.type === "module"; }; diff --git a/@commitlint/load/src/utils/load-parser-opts.test.ts b/@commitlint/load/src/utils/load-parser-opts.test.ts index b7e7989d74..2575aa7a14 100644 --- a/@commitlint/load/src/utils/load-parser-opts.test.ts +++ b/@commitlint/load/src/utils/load-parser-opts.test.ts @@ -1,7 +1,7 @@ -import {test, expect} from 'vitest'; -import {loadParserOpts} from './load-parser-opts.js'; +import { test, expect } from "vitest"; +import { loadParserOpts } from "./load-parser-opts.js"; -test('handles a plain preset', async () => { +test("handles a plain preset", async () => { const preset = { parserOpts: {}, }; @@ -9,18 +9,18 @@ test('handles a plain preset', async () => { expect(await loadParserOpts(preset)).toEqual(preset); }); -test('handles primitive values', async () => { - expect(await loadParserOpts('')).toEqual(undefined); +test("handles primitive values", async () => { + expect(await loadParserOpts("")).toEqual(undefined); expect(await loadParserOpts(undefined)).toEqual(undefined); }); -test('handles an object without any parserOpts', async () => { +test("handles an object without any parserOpts", async () => { const preset = {}; expect(await loadParserOpts(preset)).toEqual(preset); }); -test('handles nested parserOpts', async () => { - const opts = {a: 4}; +test("handles nested parserOpts", async () => { + const opts = { a: 4 }; // plain nested parserOpts let loaded = await loadParserOpts({ @@ -28,7 +28,7 @@ test('handles nested parserOpts', async () => { parserOpts: opts, }, }); - expect(loaded).toHaveProperty('parserOpts', opts); + expect(loaded).toHaveProperty("parserOpts", opts); // async nested parserOpts loaded = await loadParserOpts({ @@ -36,10 +36,10 @@ test('handles nested parserOpts', async () => { parserOpts: opts, }), }); - expect(loaded).toHaveProperty('parserOpts', opts); + expect(loaded).toHaveProperty("parserOpts", opts); }); -test('runs a sync function which returns the preset', async () => { +test("runs a sync function which returns the preset", async () => { const preset = {}; const fn = () => preset; const opts = await loadParserOpts(fn); @@ -47,7 +47,7 @@ test('runs a sync function which returns the preset', async () => { expect(opts).toEqual(preset); }); -test('runs an async function which returns the preset', async () => { +test("runs an async function which returns the preset", async () => { const preset = {}; const fn = async () => preset; const opts = await loadParserOpts(fn); diff --git a/@commitlint/load/src/utils/load-parser-opts.ts b/@commitlint/load/src/utils/load-parser-opts.ts index 11bcdcb119..34957e10d4 100644 --- a/@commitlint/load/src/utils/load-parser-opts.ts +++ b/@commitlint/load/src/utils/load-parser-opts.ts @@ -1,19 +1,19 @@ -import {ParserPreset} from '@commitlint/types'; +import { ParserPreset } from "@commitlint/types"; type Awaitable<T> = T | PromiseLike<T>; function isObjectLike(obj: unknown): obj is Record<string, unknown> { - return Boolean(obj) && typeof obj === 'object'; // typeof null === 'object' + return Boolean(obj) && typeof obj === "object"; // typeof null === 'object' } function isParserOptsFunction<T extends ParserPreset>( - obj: T + obj: T, ): obj is T & { parserOpts: ( - cb: (_: never, parserOpts: Record<string, unknown>) => unknown + cb: (_: never, parserOpts: Record<string, unknown>) => unknown, ) => Record<string, unknown> | undefined; } { - return typeof obj.parserOpts === 'function'; + return typeof obj.parserOpts === "function"; } export async function loadParserOpts( @@ -21,13 +21,13 @@ export async function loadParserOpts( | string | Awaitable<ParserPreset> | (() => Awaitable<ParserPreset>) - | undefined + | undefined, ): Promise<ParserPreset | undefined> { - if (typeof pendingParser === 'function') { + if (typeof pendingParser === "function") { return loadParserOpts(pendingParser()); } - if (!pendingParser || typeof pendingParser !== 'object') { + if (!pendingParser || typeof pendingParser !== "object") { return undefined; } // Await for the module, loaded with require @@ -39,7 +39,7 @@ export async function loadParserOpts( } // Pull nested parserOpts, might happen if overwritten with a module in main config - if (typeof parser.parserOpts === 'object') { + if (typeof parser.parserOpts === "object") { // Await parser opts if applicable parser.parserOpts = await parser.parserOpts; if ( @@ -54,8 +54,8 @@ export async function loadParserOpts( // Create parser opts from factory if ( isParserOptsFunction(parser) && - typeof parser.name === 'string' && - parser.name.startsWith('conventional-changelog-') + typeof parser.name === "string" && + parser.name.startsWith("conventional-changelog-") ) { return new Promise((resolve) => { const result = parser.parserOpts((_: never, opts) => { diff --git a/@commitlint/load/src/utils/load-plugin.test.ts b/@commitlint/load/src/utils/load-plugin.test.ts index 59ec7a3b13..cfb0193b85 100644 --- a/@commitlint/load/src/utils/load-plugin.test.ts +++ b/@commitlint/load/src/utils/load-plugin.test.ts @@ -1,116 +1,116 @@ -import {test, expect, vi} from 'vitest'; -import {AsyncRule, Plugin, Rule, SyncRule} from '@commitlint/types'; +import { test, expect, vi } from "vitest"; +import { AsyncRule, Plugin, Rule, SyncRule } from "@commitlint/types"; -import loadPlugin from './load-plugin.js'; +import loadPlugin from "./load-plugin.js"; -vi.mock('commitlint-plugin-example', () => ({example: true})); +vi.mock("commitlint-plugin-example", () => ({ example: true })); -vi.mock('@scope/commitlint-plugin-example', () => ({scope: true})); +vi.mock("@scope/commitlint-plugin-example", () => ({ scope: true })); -vi.mock('commitlint-plugin-rule', (): Plugin => { +vi.mock("commitlint-plugin-rule", (): Plugin => { const rule: Rule<number> = (_parsed, when, _value) => { - return [when === 'never']; + return [when === "never"]; }; - return {rules: {rule}}; + return { rules: { rule } }; }); -vi.mock('commitlint-plugin-sync-rule', (): Plugin => { +vi.mock("commitlint-plugin-sync-rule", (): Plugin => { const syncRule: SyncRule<number> = (_parsed, when, _value) => { - return [when === 'never']; + return [when === "never"]; }; - return {rules: {syncRule}}; + return { rules: { syncRule } }; }); -vi.mock('commitlint-plugin-async-rule', (): Plugin => { +vi.mock("commitlint-plugin-async-rule", (): Plugin => { const asyncRule: AsyncRule<number> = (_parsed, when, _value) => { - return new Promise(() => [when === 'never']); + return new Promise(() => [when === "never"]); }; - return {rules: {asyncRule}}; + return { rules: { asyncRule } }; }); -test('should load a plugin when referenced by short name', async () => { - const plugins = await loadPlugin({}, 'example'); - expect(plugins['example']).toBe( +test("should load a plugin when referenced by short name", async () => { + const plugins = await loadPlugin({}, "example"); + expect(plugins["example"]).toBe( // @ts-expect-error -- mocked module - await import('commitlint-plugin-example') + await import("commitlint-plugin-example"), ); }); -test('should load a plugin when referenced by long name', async () => { - const plugins = await loadPlugin({}, 'commitlint-plugin-example'); - expect(plugins['example']).toBe( +test("should load a plugin when referenced by long name", async () => { + const plugins = await loadPlugin({}, "commitlint-plugin-example"); + expect(plugins["example"]).toBe( // @ts-expect-error -- mocked module - await import('commitlint-plugin-example') + await import("commitlint-plugin-example"), ); }); -test('should load a plugin with a rule', async () => { - const plugins = await loadPlugin({}, 'commitlint-plugin-rule'); - expect(plugins['rule']).toBe( +test("should load a plugin with a rule", async () => { + const plugins = await loadPlugin({}, "commitlint-plugin-rule"); + expect(plugins["rule"]).toBe( // @ts-expect-error -- mocked module - await import('commitlint-plugin-rule') + await import("commitlint-plugin-rule"), ); }); -test('should load a plugin with a sync rule', async () => { - const plugins = await loadPlugin({}, 'commitlint-plugin-sync-rule'); - expect(plugins['sync-rule']).toBe( +test("should load a plugin with a sync rule", async () => { + const plugins = await loadPlugin({}, "commitlint-plugin-sync-rule"); + expect(plugins["sync-rule"]).toBe( // @ts-expect-error -- mocked module - await import('commitlint-plugin-sync-rule') + await import("commitlint-plugin-sync-rule"), ); }); -test('should load a plugin with an async rule', async () => { - const plugins = await loadPlugin({}, 'commitlint-plugin-async-rule'); - expect(plugins['async-rule']).toBe( +test("should load a plugin with an async rule", async () => { + const plugins = await loadPlugin({}, "commitlint-plugin-async-rule"); + expect(plugins["async-rule"]).toBe( // @ts-expect-error -- mocked module - await import('commitlint-plugin-async-rule') + await import("commitlint-plugin-async-rule"), ); }); -test('should throw an error when a plugin has whitespace', async () => { - await expect(() => loadPlugin({}, 'whitespace ')).rejects.toThrow( - "Whitespace found in plugin name 'whitespace '" +test("should throw an error when a plugin has whitespace", async () => { + await expect(() => loadPlugin({}, "whitespace ")).rejects.toThrow( + "Whitespace found in plugin name 'whitespace '", ); - await expect(() => loadPlugin({}, 'whitespace\t')).rejects.toThrow( - 'Whitespace found in plugin name' + await expect(() => loadPlugin({}, "whitespace\t")).rejects.toThrow( + "Whitespace found in plugin name", ); - await expect(() => loadPlugin({}, 'whitespace\n')).rejects.toThrow( - 'Whitespace found in plugin name' + await expect(() => loadPlugin({}, "whitespace\n")).rejects.toThrow( + "Whitespace found in plugin name", ); - await expect(() => loadPlugin({}, 'whitespace\r')).rejects.toThrow( - 'Whitespace found in plugin name' + await expect(() => loadPlugin({}, "whitespace\r")).rejects.toThrow( + "Whitespace found in plugin name", ); }); test("should throw an error when a plugin doesn't exist", () => - expect(() => loadPlugin({}, 'nonexistentplugin')).rejects.toThrow( - 'Failed to load plugin' + expect(() => loadPlugin({}, "nonexistentplugin")).rejects.toThrow( + "Failed to load plugin", )); -test('should load a scoped plugin when referenced by short name', async () => { - const plugins = await loadPlugin({}, '@scope/example'); - expect(plugins['@scope/example']).toBe( +test("should load a scoped plugin when referenced by short name", async () => { + const plugins = await loadPlugin({}, "@scope/example"); + expect(plugins["@scope/example"]).toBe( // @ts-expect-error -- mocked module - await import('@scope/commitlint-plugin-example') + await import("@scope/commitlint-plugin-example"), ); }); -test('should load a scoped plugin when referenced by long name', async () => { - const plugins = await loadPlugin({}, '@scope/commitlint-plugin-example'); - expect(plugins['@scope/example']).toBe( +test("should load a scoped plugin when referenced by long name", async () => { + const plugins = await loadPlugin({}, "@scope/commitlint-plugin-example"); + expect(plugins["@scope/example"]).toBe( // @ts-expect-error -- mocked module - await import('@scope/commitlint-plugin-example') + await import("@scope/commitlint-plugin-example"), ); }); /* when referencing a scope plugin and omitting @scope/ */ test("should load a scoped plugin when referenced by short name, but should not get the plugin if '@scope/' is omitted", async () => { - const plugins = await loadPlugin({}, '@scope/example'); - expect(plugins['example']).toBeUndefined(); + const plugins = await loadPlugin({}, "@scope/example"); + expect(plugins["example"]).toBeUndefined(); }); test("should load a scoped plugin when referenced by long name, but should not get the plugin if '@scope/' is omitted", async () => { - const plugins = await loadPlugin({}, '@scope/commitlint-plugin-example'); - expect(plugins['example']).toBeUndefined(); + const plugins = await loadPlugin({}, "@scope/commitlint-plugin-example"); + expect(plugins["example"]).toBeUndefined(); }); diff --git a/@commitlint/load/src/utils/load-plugin.ts b/@commitlint/load/src/utils/load-plugin.ts index f13a6d7269..03e2e68e96 100644 --- a/@commitlint/load/src/utils/load-plugin.ts +++ b/@commitlint/load/src/utils/load-plugin.ts @@ -1,28 +1,28 @@ -import {createRequire} from 'module'; -import path from 'path'; -import {fileURLToPath, pathToFileURL} from 'url'; +import { createRequire } from "node:module"; +import path from "node:path"; +import { fileURLToPath, pathToFileURL } from "node:url"; -import {Plugin, PluginRecords} from '@commitlint/types'; -import chalk from 'chalk'; +import { Plugin, PluginRecords } from "@commitlint/types"; +import chalk from "chalk"; -import {normalizePackageName, getShorthandName} from './plugin-naming.js'; -import {WhitespacePluginError, MissingPluginError} from './plugin-errors.js'; +import { normalizePackageName, getShorthandName } from "./plugin-naming.js"; +import { WhitespacePluginError, MissingPluginError } from "./plugin-errors.js"; const require = createRequire(import.meta.url); -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); const dynamicImport = async <T>(id: string): Promise<T> => { const imported = await import( path.isAbsolute(id) ? pathToFileURL(id).toString() : id ); - return ('default' in imported && imported.default) || imported; + return ("default" in imported && imported.default) || imported; }; export default async function loadPlugin( plugins: PluginRecords, pluginName: string, - debug: boolean = false + debug: boolean = false, ): Promise<PluginRecords> { const longName = normalizePackageName(pluginName); const shortName = getShorthandName(longName); @@ -47,10 +47,10 @@ export default async function loadPlugin( // If the plugin can't be resolved, display the missing plugin error (usually a config or install error) console.error(chalk.red(`Failed to load plugin ${longName}.`)); - const message = error?.message || 'Unknown error occurred'; + const message = error?.message || "Unknown error occurred"; throw new MissingPluginError(pluginName, message, { pluginName: longName, - commitlintPath: path.resolve(__dirname, '../..'), + commitlintPath: path.resolve(__dirname, "../.."), }); } @@ -76,8 +76,8 @@ export default async function loadPlugin( console.log( chalk.blue( - `Loaded plugin ${pluginName} (${loadedPluginAndVersion}) (from ${resolvedPath})` - ) + `Loaded plugin ${pluginName} (${loadedPluginAndVersion}) (from ${resolvedPath})`, + ), ); } diff --git a/@commitlint/load/src/utils/plugin-errors.ts b/@commitlint/load/src/utils/plugin-errors.ts index 4c7b1f0e29..2f1036ec80 100644 --- a/@commitlint/load/src/utils/plugin-errors.ts +++ b/@commitlint/load/src/utils/plugin-errors.ts @@ -1,7 +1,7 @@ export class WhitespacePluginError extends Error { __proto__ = Error; - public messageTemplate: string = 'whitespace-found'; + public messageTemplate: string = "whitespace-found"; public messageData: any = {}; constructor(pluginName?: string, data: any = {}) { @@ -16,10 +16,10 @@ export class WhitespacePluginError extends Error { export class MissingPluginError extends Error { __proto__ = Error; - public messageTemplate: string = 'plugin-missing'; + public messageTemplate: string = "plugin-missing"; public messageData: any; - constructor(pluginName?: string, errorMessage: string = '', data: any = {}) { + constructor(pluginName?: string, errorMessage: string = "", data: any = {}) { super(`Failed to load plugin ${pluginName}: ${errorMessage}`); this.messageData = data; diff --git a/@commitlint/load/src/utils/plugin-naming.ts b/@commitlint/load/src/utils/plugin-naming.ts index da2fd2f8a3..9ec5254eff 100644 --- a/@commitlint/load/src/utils/plugin-naming.ts +++ b/@commitlint/load/src/utils/plugin-naming.ts @@ -1,14 +1,14 @@ -import path from 'path'; +import path from "node:path"; // largely adapted from eslint's plugin system const NAMESPACE_REGEX = /^@.*\//u; // In eslint this is a parameter - we don't need to support the extra options -const prefix = 'commitlint-plugin'; +const prefix = "commitlint-plugin"; // Replace Windows with posix style paths function convertPathToPosix(filepath: string) { const normalizedFilepath = path.normalize(filepath); - const posixFilepath = normalizedFilepath.replace(/\\/gu, '/'); + const posixFilepath = normalizedFilepath.replace(/\\/gu, "/"); return posixFilepath; } @@ -27,34 +27,34 @@ export function normalizePackageName(name: string) { * Normalize to Unix first to avoid errors later on. * https://github.com/eslint/eslint/issues/5644 */ - if (normalizedName.indexOf('\\') > -1) { + if (normalizedName.indexOf("\\") > -1) { normalizedName = convertPathToPosix(normalizedName); } - if (normalizedName.charAt(0) === '@') { + if (normalizedName.charAt(0) === "@") { /** * it's a scoped package * package name is the prefix, or just a username */ const scopedPackageShortcutRegex = new RegExp( `^(@[^/]+)(?:/(?:${prefix})?)?$`, - 'u' + "u", ), - scopedPackageNameRegex = new RegExp(`^${prefix}(?:-|$)`, 'u'); + scopedPackageNameRegex = new RegExp(`^${prefix}(?:-|$)`, "u"); if (scopedPackageShortcutRegex.test(normalizedName)) { normalizedName = normalizedName.replace( scopedPackageShortcutRegex, - `$1/${prefix}` + `$1/${prefix}`, ); - } else if (!scopedPackageNameRegex.test(normalizedName.split('/')[1])) { + } else if (!scopedPackageNameRegex.test(normalizedName.split("/")[1])) { /** * for scoped packages, insert the prefix after the first / unless * the path is already @scope/eslint or @scope/eslint-xxx-yyy */ normalizedName = normalizedName.replace( /^@([^/]+)\/(.*)$/u, - `@$1/${prefix}-$2` + `@$1/${prefix}-$2`, ); } } else if (normalizedName.indexOf(`${prefix}-`) !== 0) { @@ -70,14 +70,14 @@ export function normalizePackageName(name: string) { * @returns {string} The term without prefix. */ export function getShorthandName(fullname: string) { - if (fullname[0] === '@') { - let matchResult = new RegExp(`^(@[^/]+)/${prefix}$`, 'u').exec(fullname); + if (fullname[0] === "@") { + let matchResult = new RegExp(`^(@[^/]+)/${prefix}$`, "u").exec(fullname); if (matchResult) { return matchResult[1]; } - matchResult = new RegExp(`^(@[^/]+)/${prefix}-(.+)$`, 'u').exec(fullname); + matchResult = new RegExp(`^(@[^/]+)/${prefix}-(.+)$`, "u").exec(fullname); if (matchResult) { return `${matchResult[1]}/${matchResult[2]}`; } @@ -96,5 +96,5 @@ export function getShorthandName(fullname: string) { export function getNamespaceFromTerm(term: string) { const match = NAMESPACE_REGEX.exec(term); - return match ? match[0] : ''; + return match ? match[0] : ""; } diff --git a/@commitlint/load/tsconfig.json b/@commitlint/load/tsconfig.json index 1b645658c1..7ce5e84e02 100644 --- a/@commitlint/load/tsconfig.json +++ b/@commitlint/load/tsconfig.json @@ -8,9 +8,9 @@ "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], "references": [ - {"path": "../execute-rule"}, - {"path": "../resolve-extends"}, - {"path": "../config-validator"}, - {"path": "../types"} + { "path": "../execute-rule" }, + { "path": "../resolve-extends" }, + { "path": "../config-validator" }, + { "path": "../types" } ] } diff --git a/@commitlint/message/CHANGELOG.md b/@commitlint/message/CHANGELOG.md index 7242610d44..4616d71675 100644 --- a/@commitlint/message/CHANGELOG.md +++ b/@commitlint/message/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/message + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/message + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/message + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/message diff --git a/@commitlint/message/package.json b/@commitlint/message/package.json index 2c195d2279..3b3309c979 100644 --- a/@commitlint/message/package.json +++ b/@commitlint/message/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/message", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Lint your commit messages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,8 +36,8 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0" + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/message/src/index.test.ts b/@commitlint/message/src/index.test.ts index 1baa149d66..acfcb49273 100644 --- a/@commitlint/message/src/index.test.ts +++ b/@commitlint/message/src/index.test.ts @@ -1,17 +1,17 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import message from './index.js'; +import message from "./index.js"; -test('should return an empty string for empty input', () => { - expect(message()).toBe(''); +test("should return an empty string for empty input", () => { + expect(message()).toBe(""); }); -test('should return an empty string for empty input array', () => { - expect(message([])).toBe(''); +test("should return an empty string for empty input array", () => { + expect(message([])).toBe(""); }); -test('should filter falsy values', () => { - expect(message([null, 'some', undefined, 'message', null])).toBe( - 'some message' +test("should filter falsy values", () => { + expect(message([null, "some", undefined, "message", null])).toBe( + "some message", ); }); diff --git a/@commitlint/message/src/index.ts b/@commitlint/message/src/index.ts index 32b2b00c81..c329f09917 100644 --- a/@commitlint/message/src/index.ts +++ b/@commitlint/message/src/index.ts @@ -1,3 +1,3 @@ export default function message(input: (string | null | undefined)[] = []) { - return input.filter(Boolean).join(' '); + return input.filter(Boolean).join(" "); } diff --git a/@commitlint/parse/CHANGELOG.md b/@commitlint/parse/CHANGELOG.md index dc653b986c..f8c257b73a 100644 --- a/@commitlint/parse/CHANGELOG.md +++ b/@commitlint/parse/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/parse + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/parse + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/parse + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/parse diff --git a/@commitlint/parse/README.md b/@commitlint/parse/README.md index be40697885..8021452469 100644 --- a/@commitlint/parse/README.md +++ b/@commitlint/parse/README.md @@ -11,7 +11,7 @@ npm install --save @commitlint/parse ## Use ```js -const parse = require('@commitlint/parse'); +const parse = require("@commitlint/parse"); ``` ## API diff --git a/@commitlint/parse/package.json b/@commitlint/parse/package.json index fbfaca06d9..ff1639e042 100644 --- a/@commitlint/parse/package.json +++ b/@commitlint/parse/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/parse", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Lint your commit messages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,14 +36,14 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0", + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0", "@types/conventional-commits-parser": "^5.0.0" }, "dependencies": { - "@commitlint/types": "^19.5.0", + "@commitlint/types": "^20.0.0", "conventional-changelog-angular": "^7.0.0", "conventional-commits-parser": "^5.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/parse/src/index.test.ts b/@commitlint/parse/src/index.test.ts index cdf82b2dda..8fb892f37c 100644 --- a/@commitlint/parse/src/index.test.ts +++ b/@commitlint/parse/src/index.test.ts @@ -1,23 +1,23 @@ -import {test, expect} from 'vitest'; -import parse from './index.js'; +import { test, expect } from "vitest"; +import parse from "./index.js"; -test('throws when called without params', async () => { - await expect((parse as any)()).rejects.toThrow('Expected a raw commit'); +test("throws when called without params", async () => { + await expect((parse as any)()).rejects.toThrow("Expected a raw commit"); }); -test('throws when called with empty message', async () => { - await expect(parse('')).rejects.toThrow('Expected a raw commit'); +test("throws when called with empty message", async () => { + await expect(parse("")).rejects.toThrow("Expected a raw commit"); }); -test('returns object with raw message', async () => { - const message = 'type(scope): subject'; +test("returns object with raw message", async () => { + const message = "type(scope): subject"; const actual = await parse(message); - expect(actual).toHaveProperty('raw', message); + expect(actual).toHaveProperty("raw", message); }); -test('calls parser with message and passed options', async () => { - const message = 'message'; +test("calls parser with message and passed options", async () => { + const message = "message"; expect.assertions(1); await parse(message, (m: string): any => { @@ -26,25 +26,25 @@ test('calls parser with message and passed options', async () => { }); }); -test('passes object up from parser function', async () => { - const message = 'message'; +test("passes object up from parser function", async () => { + const message = "message"; const result: any = {}; const actual = await parse(message, () => result); expect(actual).toBe(result); }); -test('returns object with expected keys', async () => { - const message = 'message'; +test("returns object with expected keys", async () => { + const message = "message"; const actual = await parse(message); const expected = { body: null, footer: null, - header: 'message', + header: "message", mentions: [], merge: null, notes: [], - raw: 'message', + raw: "message", references: [], revert: null, scope: null, @@ -55,29 +55,29 @@ test('returns object with expected keys', async () => { expect(actual).toMatchObject(expected); }); -test('uses angular grammar', async () => { - const message = 'type(scope): subject'; +test("uses angular grammar", async () => { + const message = "type(scope): subject"; const actual = await parse(message); const expected = { body: null, footer: null, - header: 'type(scope): subject', + header: "type(scope): subject", mentions: [], merge: null, notes: [], - raw: 'type(scope): subject', + raw: "type(scope): subject", references: [], revert: null, - scope: 'scope', - subject: 'subject', - type: 'type', + scope: "scope", + subject: "subject", + type: "type", }; expect(actual).toMatchObject(expected); }); -test('uses custom opts parser', async () => { - const message = 'type(scope)-subject'; +test("uses custom opts parser", async () => { + const message = "type(scope)-subject"; const changelogOpts = { parserOpts: { headerPattern: /^(\w*)(?:\((.*)\))?-(.*)$/, @@ -87,112 +87,112 @@ test('uses custom opts parser', async () => { const expected = { body: null, footer: null, - header: 'type(scope)-subject', + header: "type(scope)-subject", mentions: [], merge: null, notes: [], - raw: 'type(scope)-subject', + raw: "type(scope)-subject", references: [], revert: null, - scope: 'scope', - subject: 'subject', - type: 'type', + scope: "scope", + subject: "subject", + type: "type", }; expect(actual).toMatchObject(expected); }); -test('does not merge array properties with custom opts', async () => { - const message = 'type: subject'; +test("does not merge array properties with custom opts", async () => { + const message = "type: subject"; const actual = await parse(message, undefined, { headerPattern: /^(.*):\s(.*)$/, - headerCorrespondence: ['type', 'subject'], + headerCorrespondence: ["type", "subject"], }); const expected = { body: null, footer: null, - header: 'type: subject', + header: "type: subject", mentions: [], merge: null, notes: [], - raw: 'type: subject', + raw: "type: subject", references: [], revert: null, - subject: 'subject', - type: 'type', + subject: "subject", + type: "type", }; expect(actual).toMatchObject(expected); }); -test('supports scopes with /', async () => { - const message = 'type(some/scope): subject'; +test("supports scopes with /", async () => { + const message = "type(some/scope): subject"; const actual = await parse(message); - expect(actual.scope).toBe('some/scope'); - expect(actual.subject).toBe('subject'); + expect(actual.scope).toBe("some/scope"); + expect(actual.subject).toBe("subject"); }); -test('supports scopes with / and empty parserOpts', async () => { - const message = 'type(some/scope): subject'; +test("supports scopes with / and empty parserOpts", async () => { + const message = "type(some/scope): subject"; const actual = await parse(message, undefined, {}); - expect(actual.scope).toBe('some/scope'); - expect(actual.subject).toBe('subject'); + expect(actual.scope).toBe("some/scope"); + expect(actual.subject).toBe("subject"); }); -test('ignores comments', async () => { - const message = 'type(some/scope): subject\n# some comment'; +test("ignores comments", async () => { + const message = "type(some/scope): subject\n# some comment"; // @ts-expect-error -- no typings - const changelogOpts = await import('conventional-changelog-angular'); + const changelogOpts = await import("conventional-changelog-angular"); const opts = { ...changelogOpts.parserOpts, - commentChar: '#', + commentChar: "#", }; const actual = await parse(message, undefined, opts); expect(actual.body).toBe(null); expect(actual.footer).toBe(null); - expect(actual.subject).toBe('subject'); + expect(actual.subject).toBe("subject"); }); -test('registers inline #', async () => { +test("registers inline #", async () => { const message = - 'type(some/scope): subject #reference\n# some comment\nthings #reference'; + "type(some/scope): subject #reference\n# some comment\nthings #reference"; // @ts-expect-error -- no typings - const changelogOpts = await import('conventional-changelog-angular'); + const changelogOpts = await import("conventional-changelog-angular"); const opts = { ...changelogOpts.parserOpts, - commentChar: '#', + commentChar: "#", }; const actual = await parse(message, undefined, opts); - expect(actual.subject).toBe('subject #reference'); - expect(actual.body).toBe('things #reference'); + expect(actual.subject).toBe("subject #reference"); + expect(actual.body).toBe("things #reference"); }); -test('keep -side notes- in the body section', async () => { - const header = 'type(some/scope): subject'; +test("keep -side notes- in the body section", async () => { + const header = "type(some/scope): subject"; const body = - 'CI on master branch caught this:\n\n' + - '```\n' + - 'Unhandled Exception:\n' + + "CI on master branch caught this:\n\n" + + "```\n" + + "Unhandled Exception:\n" + "System.AggregateException: One or more errors occurred. (Some problem when connecting to 'api.mycryptoapi.com/eth')\n\n" + - '--- End of stack trace from previous location where exception was thrown ---\n\n' + - 'at GWallet.Backend.FSharpUtil.ReRaise (System.Exception ex) [0x00000] in /Users/runner/work/geewallet/geewallet/src/GWallet.Backend/FSharpUtil.fs:206\n' + - '...\n' + - '```'; + "--- End of stack trace from previous location where exception was thrown ---\n\n" + + "at GWallet.Backend.FSharpUtil.ReRaise (System.Exception ex) [0x00000] in /Users/runner/work/geewallet/geewallet/src/GWallet.Backend/FSharpUtil.fs:206\n" + + "...\n" + + "```"; - const message = header + '\n\n' + body; + const message = header + "\n\n" + body; const actual = await parse(message); expect(actual.body).toBe(body); }); -test('allows separating -side nodes- by setting parserOpts.fieldPattern', async () => { +test("allows separating -side nodes- by setting parserOpts.fieldPattern", async () => { const message = - 'type(scope): subject\n\nbody text\n-authorName-\nrenovate[bot]'; + "type(scope): subject\n\nbody text\n-authorName-\nrenovate[bot]"; const changelogOpts = { parserOpts: { fieldPattern: /^-(.*)-$/, @@ -200,54 +200,54 @@ test('allows separating -side nodes- by setting parserOpts.fieldPattern', async }; const actual = await parse(message, undefined, changelogOpts.parserOpts); - expect(actual.body).toBe('body text'); - expect(actual).toHaveProperty('authorName', 'renovate[bot]'); + expect(actual.body).toBe("body text"); + expect(actual).toHaveProperty("authorName", "renovate[bot]"); }); -test('parses references leading subject', async () => { - const message = '#1 some subject'; +test("parses references leading subject", async () => { + const message = "#1 some subject"; // @ts-expect-error -- no typings - const opts = await import('conventional-changelog-angular'); + const opts = await import("conventional-changelog-angular"); const { references: [actual], } = await parse(message, undefined, opts); - expect(actual.issue).toBe('1'); + expect(actual.issue).toBe("1"); }); -test('parses custom references', async () => { - const message = '#1 some subject PREFIX-2'; - const {references} = await parse(message, undefined, { - issuePrefixes: ['PREFIX-'], +test("parses custom references", async () => { + const message = "#1 some subject PREFIX-2"; + const { references } = await parse(message, undefined, { + issuePrefixes: ["PREFIX-"], }); - expect(references.find((ref) => ref.issue === '1')).toBeFalsy(); - expect(references.find((ref) => ref.issue === '2')).toMatchObject({ + expect(references.find((ref) => ref.issue === "1")).toBeFalsy(); + expect(references.find((ref) => ref.issue === "2")).toMatchObject({ action: null, - issue: '2', + issue: "2", owner: null, - prefix: 'PREFIX-', - raw: '#1 some subject PREFIX-2', + prefix: "PREFIX-", + raw: "#1 some subject PREFIX-2", repository: null, }); }); -test('uses permissive default regex without parser opts', async () => { - const message = 'chore(component,demo): bump'; +test("uses permissive default regex without parser opts", async () => { + const message = "chore(component,demo): bump"; const actual = await parse(message); - expect(actual.scope).toBe('component,demo'); + expect(actual.scope).toBe("component,demo"); }); -test('uses permissive default regex with other parser opts', async () => { - const message = 'chore(component,demo): bump'; - const actual = await parse(message, undefined, {commentChar: '#'}); +test("uses permissive default regex with other parser opts", async () => { + const message = "chore(component,demo): bump"; + const actual = await parse(message, undefined, { commentChar: "#" }); - expect(actual.scope).toBe('component,demo'); + expect(actual.scope).toBe("component,demo"); }); -test('uses restrictive default regex in passed parser opts', async () => { - const message = 'chore(component,demo): bump'; +test("uses restrictive default regex in passed parser opts", async () => { + const message = "chore(component,demo): bump"; const actual = await parse(message, undefined, { headerPattern: /^(\w*)(?:\(([a-z]*)\))?: (.*)$/, }); @@ -256,16 +256,16 @@ test('uses restrictive default regex in passed parser opts', async () => { expect(actual.scope).toBe(null); }); -test('works with chinese scope by default', async () => { - const message = 'fix(面试评价): 测试'; - const actual = await parse(message, undefined, {commentChar: '#'}); +test("works with chinese scope by default", async () => { + const message = "fix(面试评价): 测试"; + const actual = await parse(message, undefined, { commentChar: "#" }); expect(actual.subject).not.toBe(null); expect(actual.scope).not.toBe(null); }); -test('does not work with chinese scopes with incompatible pattern', async () => { - const message = 'fix(面试评价): 测试'; +test("does not work with chinese scopes with incompatible pattern", async () => { + const message = "fix(面试评价): 测试"; const actual = await parse(message, undefined, { headerPattern: /^(\w*)(?:\(([a-z]*)\))?: (.*)$/, }); diff --git a/@commitlint/parse/src/index.ts b/@commitlint/parse/src/index.ts index 7490fc88ec..86173827a7 100644 --- a/@commitlint/parse/src/index.ts +++ b/@commitlint/parse/src/index.ts @@ -1,13 +1,13 @@ -import type {Parser} from '@commitlint/types'; +import type { Parser } from "@commitlint/types"; -import {type Commit, type Options, sync} from 'conventional-commits-parser'; +import { type Commit, type Options, sync } from "conventional-commits-parser"; // @ts-expect-error -- no typings -import defaultChangelogOpts from 'conventional-changelog-angular'; +import defaultChangelogOpts from "conventional-changelog-angular"; export async function parse( message: string, parser: Parser = sync, - parserOpts?: Options + parserOpts?: Options, ): Promise<Commit> { const preset = await defaultChangelogOpts(); const defaultOpts = preset.parserOpts; diff --git a/@commitlint/parse/tsconfig.json b/@commitlint/parse/tsconfig.json index 119e645565..d691164788 100644 --- a/@commitlint/parse/tsconfig.json +++ b/@commitlint/parse/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], - "references": [{"path": "../types"}] + "references": [{ "path": "../types" }] } diff --git a/@commitlint/prompt-cli/CHANGELOG.md b/@commitlint/prompt-cli/CHANGELOG.md index eb95d6fe49..dd443bf1b9 100644 --- a/@commitlint/prompt-cli/CHANGELOG.md +++ b/@commitlint/prompt-cli/CHANGELOG.md @@ -3,6 +3,60 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + +**Note:** Version bump only for package @commitlint/prompt-cli + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/prompt-cli + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + + +### Bug Fixes + +* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299)) + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package @commitlint/prompt-cli + + + + + +# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04) + +**Note:** Version bump only for package @commitlint/prompt-cli + + + + + ## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15) **Note:** Version bump only for package @commitlint/prompt-cli diff --git a/@commitlint/prompt-cli/cli.js b/@commitlint/prompt-cli/cli.js index 155819526e..7ab4aa8181 100755 --- a/@commitlint/prompt-cli/cli.js +++ b/@commitlint/prompt-cli/cli.js @@ -1,7 +1,7 @@ #!/usr/bin/env node -import {prompter} from '@commitlint/prompt'; -import inquirer from 'inquirer'; -import {x} from 'tinyexec'; +import { prompter } from "@commitlint/prompt"; +import inquirer from "inquirer"; +import { x } from "tinyexec"; main().catch((err) => { setTimeout(() => { @@ -14,7 +14,7 @@ function main() { .then((empty) => { if (empty) { console.log( - `Nothing to commit. Stage your changes via "git add" execute "commit" again` + `Nothing to commit. Stage your changes via "git add" execute "commit" again`, ); process.exit(1); } @@ -23,11 +23,11 @@ function main() { } function isStageEmpty() { - return x('git', ['diff', '--cached']).then((r) => r.stdout === ''); + return x("git", ["diff", "--cached"]).then((r) => r.stdout === ""); } function commit(message) { - const result = x('git', ['commit', '-m', message]); + const result = x("git", ["commit", "-m", message]); result.process.stdout.pipe(process.stdout); result.process.stderr.pipe(process.stderr); } diff --git a/@commitlint/prompt-cli/cli.test.js b/@commitlint/prompt-cli/cli.test.js index 0dc4085f87..d1bfc50283 100644 --- a/@commitlint/prompt-cli/cli.test.js +++ b/@commitlint/prompt-cli/cli.test.js @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import {createRequire} from 'module'; -import {git} from '@commitlint/test'; -import {x} from 'tinyexec'; +import { test, expect } from "vitest"; +import { createRequire } from "node:module"; +import { git } from "@commitlint/test"; +import { x } from "tinyexec"; const require = createRequire(import.meta.url); -const bin = require.resolve('./cli.js'); +const bin = require.resolve("./cli.js"); const cli = (args, options) => { - return (input = '') => { + return (input = "") => { const result = x(bin, args, { nodeOptions: { cwd: options.cwd, @@ -23,9 +23,9 @@ const cli = (args, options) => { }; }; -test('should print warning if stage is empty', async () => { +test("should print warning if stage is empty", async () => { const cwd = await git.bootstrap(); - const actual = await cli([], {cwd})('foo: bar'); - expect(actual.stdout).toContain('Nothing to commit.'); - expect(actual.stderr).toBe(''); + const actual = await cli([], { cwd })("foo: bar"); + expect(actual.stdout).toContain("Nothing to commit."); + expect(actual.stderr).toBe(""); }, 10000); diff --git a/@commitlint/prompt-cli/package.json b/@commitlint/prompt-cli/package.json index b8499b487b..830198ec30 100644 --- a/@commitlint/prompt-cli/package.json +++ b/@commitlint/prompt-cli/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/prompt-cli", "type": "module", - "version": "19.6.1", + "version": "20.1.0", "description": "commit prompt using commitlint.config.js", "main": "cli.js", "files": [ @@ -34,13 +34,13 @@ "node": ">=v18" }, "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0" + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0" }, "dependencies": { - "@commitlint/prompt": "^19.6.1", + "@commitlint/prompt": "^20.1.0", "inquirer": "^9.2.15", - "tinyexec": "^0.3.0" + "tinyexec": "^1.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/prompt/CHANGELOG.md b/@commitlint/prompt/CHANGELOG.md index c39a743fec..f3804b12ac 100644 --- a/@commitlint/prompt/CHANGELOG.md +++ b/@commitlint/prompt/CHANGELOG.md @@ -3,6 +3,57 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + +**Note:** Version bump only for package @commitlint/prompt + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/prompt + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/prompt + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package @commitlint/prompt + + + + + +# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04) + +**Note:** Version bump only for package @commitlint/prompt + + + + + ## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15) **Note:** Version bump only for package @commitlint/prompt diff --git a/@commitlint/prompt/package.json b/@commitlint/prompt/package.json index c02d5ff523..3d57dc6c3e 100644 --- a/@commitlint/prompt/package.json +++ b/@commitlint/prompt/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/prompt", "type": "module", - "version": "19.6.1", + "version": "20.1.0", "description": "commitizen prompt using commitlint.config.js", "main": "./lib/index.js", "files": [ @@ -38,18 +38,18 @@ "node": ">=v18" }, "devDependencies": { - "@commitlint/config-angular": "^19.6.0", + "@commitlint/config-angular": "^20.0.0", "@commitlint/types": "^14.0.0", - "@commitlint/utils": "^19.5.0", + "@commitlint/utils": "^20.0.0", "@types/inquirer": "^9.0.7", "commitizen": "^4.2.4" }, "dependencies": { - "@commitlint/ensure": "^19.5.0", - "@commitlint/load": "^19.6.1", - "@commitlint/types": "^19.5.0", + "@commitlint/ensure": "^20.0.0", + "@commitlint/load": "^20.1.0", + "@commitlint/types": "^20.0.0", "chalk": "^5.3.0", "inquirer": "^9.2.15" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/prompt/src/index.ts b/@commitlint/prompt/src/index.ts index 22f3145c88..2985ec0fc6 100644 --- a/@commitlint/prompt/src/index.ts +++ b/@commitlint/prompt/src/index.ts @@ -1,6 +1,6 @@ -import inquirer from 'inquirer'; +import inquirer from "inquirer"; -import {input} from './input.js'; +import { input } from "./input.js"; type Commit = (input: string) => void; diff --git a/@commitlint/prompt/src/input.test.ts b/@commitlint/prompt/src/input.test.ts index 7b9cb5dfe6..20d3e9572a 100644 --- a/@commitlint/prompt/src/input.test.ts +++ b/@commitlint/prompt/src/input.test.ts @@ -1,17 +1,17 @@ /// <reference path="./inquirer/inquirer.d.ts" /> -import {expect, test, vi} from 'vitest'; +import { expect, test, vi } from "vitest"; // @ts-expect-error -- no typings -import config from '@commitlint/config-angular'; -import chalk from 'chalk'; +import config from "@commitlint/config-angular"; +import chalk from "chalk"; import { Answers, DistinctQuestion, InputCustomOptions, PromptModule, -} from 'inquirer'; +} from "inquirer"; -import {input} from './input.js'; +import { input } from "./input.js"; const testConfig = { parserPreset: config.parserPreset, @@ -20,86 +20,86 @@ const testConfig = { }, }; -vi.mock('@commitlint/load', () => ({ +vi.mock("@commitlint/load", () => ({ default: () => testConfig, })); -test('should work with all fields filled', async () => { +test("should work with all fields filled", async () => { const prompt = stub({ - 'input-custom': { - type: 'fix', - scope: 'test', - subject: 'subject', - body: 'body', - footer: 'footer', + "input-custom": { + type: "fix", + scope: "test", + subject: "subject", + body: "body", + footer: "footer", }, }); const message = await input(prompt); - expect(message).toEqual('fix(test): subject\n' + '\nbody\n' + '\nfooter'); + expect(message).toEqual("fix(test): subject\n" + "\nbody\n" + "\nfooter"); }); -test('should not add leading blank line to body and footer if rules are disabled', async () => { - testConfig.rules['body-leading-blank'] = ['1', 'never']; - testConfig.rules['footer-leading-blank'] = ['1', 'never']; +test("should not add leading blank line to body and footer if rules are disabled", async () => { + testConfig.rules["body-leading-blank"] = ["1", "never"]; + testConfig.rules["footer-leading-blank"] = ["1", "never"]; const prompt = stub({ - 'input-custom': { - type: 'fix', - scope: 'test', - subject: 'subject', - body: 'body', - footer: 'footer', + "input-custom": { + type: "fix", + scope: "test", + subject: "subject", + body: "body", + footer: "footer", }, }); const message = await input(prompt); - expect(message).toEqual('fix(test): subject\n' + 'body\n' + 'footer'); + expect(message).toEqual("fix(test): subject\n" + "body\n" + "footer"); // reset config mock - testConfig.rules['body-leading-blank'] = config.rules['body-leading-blank']; - testConfig.rules['footer-leading-blank'] = - config.rules['footer-leading-blank']; + testConfig.rules["body-leading-blank"] = config.rules["body-leading-blank"]; + testConfig.rules["footer-leading-blank"] = + config.rules["footer-leading-blank"]; }); -test('should work without scope', async () => { +test("should work without scope", async () => { const prompt = stub({ - 'input-custom': { - type: 'fix', - scope: '', - subject: 'subject', - body: 'body', - footer: 'footer', + "input-custom": { + type: "fix", + scope: "", + subject: "subject", + body: "body", + footer: "footer", }, }); const message = await input(prompt); - expect(message).toEqual('fix: subject\n' + '\nbody\n' + '\nfooter'); + expect(message).toEqual("fix: subject\n" + "\nbody\n" + "\nfooter"); }); -test('should fail without type', async () => { - const spy = vi.spyOn(console, 'error'); +test("should fail without type", async () => { + const spy = vi.spyOn(console, "error"); const prompt = stub({ - 'input-custom': { - type: '', - scope: '', - subject: '', - body: '', - footer: '', + "input-custom": { + type: "", + scope: "", + subject: "", + body: "", + footer: "", }, }); const message = await input(prompt); - expect(message).toEqual(''); + expect(message).toEqual(""); expect(console.error).toHaveBeenCalledTimes(1); expect(console.error).toHaveBeenLastCalledWith( - new Error(`⚠ ${chalk.bold('type')} may not be empty.`) + new Error(`⚠ ${chalk.bold("type")} may not be empty.`), ); spy.mockRestore(); }); function stub(config: Record<string, Record<string, unknown>>): PromptModule { const prompt = async ( - questions: DistinctQuestion | DistinctQuestion[] + questions: DistinctQuestion | DistinctQuestion[], ): Promise<any> => { const result: Answers = {}; const resolvedConfig = Array.isArray(questions) ? questions : [questions]; for (const promptConfig of resolvedConfig) { - const configType = promptConfig.type || 'input'; + const configType = promptConfig.type || "input"; const questions = config[configType]; if (!questions) { throw new Error(`Unexpected config type: ${configType}`); diff --git a/@commitlint/prompt/src/input.ts b/@commitlint/prompt/src/input.ts index d0bbfe90e2..d2db897fe2 100644 --- a/@commitlint/prompt/src/input.ts +++ b/@commitlint/prompt/src/input.ts @@ -1,12 +1,12 @@ -import load from '@commitlint/load'; -import type {DistinctQuestion, PromptModule} from 'inquirer'; +import load from "@commitlint/load"; +import type { DistinctQuestion, PromptModule } from "inquirer"; -import format from './library/format.js'; -import getPrompt from './library/get-prompt.js'; -import settings from './settings.js'; -import type {InputSetting, Result} from './library/types.js'; -import {getHasName, getMaxLength, getRules} from './library/utils.js'; -import InputCustomPrompt from './inquirer/InputCustomPrompt.js'; +import format from "./library/format.js"; +import getPrompt from "./library/get-prompt.js"; +import settings from "./settings.js"; +import type { InputSetting, Result } from "./library/types.js"; +import { getHasName, getMaxLength, getRules } from "./library/utils.js"; +import InputCustomPrompt from "./inquirer/InputCustomPrompt.js"; /** * Get user input by interactive prompt based on @@ -15,18 +15,18 @@ import InputCustomPrompt from './inquirer/InputCustomPrompt.js'; * @return commit message */ export async function input(prompter: PromptModule): Promise<string> { - const {rules} = await load(); - const parts = ['type', 'scope', 'subject', 'body', 'footer'] as const; - const headerParts = ['type', 'scope', 'subject']; + const { rules } = await load(); + const parts = ["type", "scope", "subject", "body", "footer"] as const; + const headerParts = ["type", "scope", "subject"]; - const headerLengthRule = getRules('header', rules).find( - getHasName('max-length') + const headerLengthRule = getRules("header", rules).find( + getHasName("max-length"), ); const maxLength = getMaxLength(headerLengthRule); try { const questions: DistinctQuestion<Result>[] = []; - prompter.registerPrompt('input-custom', InputCustomPrompt); + prompter.registerPrompt("input-custom", InputCustomPrompt); for (const input of parts) { const inputSetting: InputSetting = settings[input]; @@ -46,6 +46,6 @@ export async function input(prompter: PromptModule): Promise<string> { return format(results); } catch (err) { console.error(err); - return ''; + return ""; } } diff --git a/@commitlint/prompt/src/inquirer/InputCustomPrompt.ts b/@commitlint/prompt/src/inquirer/InputCustomPrompt.ts index 6e7824dcdd..2cc7ce8400 100644 --- a/@commitlint/prompt/src/inquirer/InputCustomPrompt.ts +++ b/@commitlint/prompt/src/inquirer/InputCustomPrompt.ts @@ -1,11 +1,11 @@ /// <reference path="./inquirer.d.ts" /> -import chalk from 'chalk'; +import chalk from "chalk"; -import inquirer, {type Answers, type InputCustomOptions} from 'inquirer'; -import InputPrompt from 'inquirer/lib/prompts/input.js'; -import observe from 'inquirer/lib/utils/events.js'; -import type {Interface as ReadlineInterface, Key} from 'readline'; -import type {Subscription} from 'rxjs'; +import inquirer, { type Answers, type InputCustomOptions } from "inquirer"; +import InputPrompt from "inquirer/lib/prompts/input.js"; +import observe from "inquirer/lib/utils/events.js"; +import type { Interface as ReadlineInterface, Key } from "node:readline"; +import type { Subscription } from "rxjs"; import SuccessfulPromptStateData = inquirer.prompts.SuccessfulPromptStateData; @@ -15,7 +15,7 @@ interface KeyDescriptor { } export default class InputCustomPrompt< - TQuestion extends InputCustomOptions = InputCustomOptions + TQuestion extends InputCustomOptions = InputCustomOptions, > extends InputPrompt<TQuestion> { private lineSubscription: Subscription; private readonly tabCompletion: string[]; @@ -23,7 +23,7 @@ export default class InputCustomPrompt< constructor( question: TQuestion, readLine: ReadlineInterface, - answers: Answers + answers: Answers, ) { super(question, readLine, answers); @@ -32,12 +32,12 @@ export default class InputCustomPrompt< } if (!this.opt.maxLength) { - this.throwParamError('maxLength'); + this.throwParamError("maxLength"); } const events = observe(this.rl); this.lineSubscription = events.keypress.subscribe( - this.onKeyPress2.bind(this) + this.onKeyPress2.bind(this), ); this.tabCompletion = (this.opt.tabCompletion || []) .map((item) => item.value) @@ -56,13 +56,13 @@ export default class InputCustomPrompt< * @see https://nodejs.org/api/readline.html#readline_rl_line */ updateLine(line: string): void { - this.rl.write(null as any, {ctrl: true, name: 'b'}); - this.rl.write(null as any, {ctrl: true, name: 'd'}); + this.rl.write(null as any, { ctrl: true, name: "b" }); + this.rl.write(null as any, { ctrl: true, name: "d" }); this.rl.write(line.substr(this.rl.line.length)); } onKeyPress2(e: KeyDescriptor): void { - if (e.key.name === 'tab' && this.tabCompletion.length > 0) { + if (e.key.name === "tab" && this.tabCompletion.length > 0) { let line = this.rl.line.trim(); if (line.length > 0) { for (const item of this.tabCompletion) { @@ -84,7 +84,7 @@ export default class InputCustomPrompt< } render(error?: string): void { - const answered = this.status === 'answered'; + const answered = this.status === "answered"; let message = this.getQuestion(); const length = this.measureInput(this.rl.line); @@ -95,10 +95,10 @@ export default class InputCustomPrompt< message += this.opt.transformer(this.rl.line, this.answers, {}); } - let bottomContent = ''; + let bottomContent = ""; if (error) { - bottomContent = chalk.red('>> ') + error; + bottomContent = chalk.red(">> ") + error; } else if (!answered) { const maxLength = this.opt.maxLength(this.answers); if (maxLength < Infinity) { @@ -107,8 +107,8 @@ export default class InputCustomPrompt< lengthRemaining <= 5 ? chalk.red : lengthRemaining <= 10 - ? chalk.yellow - : chalk.grey; + ? chalk.yellow + : chalk.grey; bottomContent = color(`${lengthRemaining} characters left`); } } diff --git a/@commitlint/prompt/src/inquirer/inquirer.d.ts b/@commitlint/prompt/src/inquirer/inquirer.d.ts index 98af94d2a7..1d8df10d5f 100644 --- a/@commitlint/prompt/src/inquirer/inquirer.d.ts +++ b/@commitlint/prompt/src/inquirer/inquirer.d.ts @@ -1,6 +1,6 @@ -import {Answers, InputQuestionOptions} from 'inquirer'; +import { Answers, InputQuestionOptions } from "inquirer"; -declare module 'inquirer' { +declare module "inquirer" { interface InputCustomCompletionOption { value: string; description?: string; @@ -11,7 +11,7 @@ declare module 'inquirer' { /** * @inheritdoc */ - type?: 'input-custom'; + type?: "input-custom"; log?(answers?: T): string; tabCompletion?: InputCustomCompletionOption[]; maxLength(answers?: T): number; @@ -19,6 +19,6 @@ declare module 'inquirer' { } interface QuestionMap<T extends Answers = Answers> { - 'input-custom': InputCustomOptions<T>; + "input-custom": InputCustomOptions<T>; } } diff --git a/@commitlint/prompt/src/library/format.test.ts b/@commitlint/prompt/src/library/format.test.ts index bd8e17d83b..e2a69d7516 100644 --- a/@commitlint/prompt/src/library/format.test.ts +++ b/@commitlint/prompt/src/library/format.test.ts @@ -1,56 +1,56 @@ -import {test, expect} from 'vitest'; -import type {Result} from './types.js'; -import format from './format.js'; +import { test, expect } from "vitest"; +import type { Result } from "./types.js"; +import format from "./format.js"; -test('should return empty string', () => { +test("should return empty string", () => { const result: Result = {}; - expect(format(result)).toBe(' '); + expect(format(result)).toBe(" "); }); -test('should omit scope', () => { +test("should omit scope", () => { const result: Result = { - type: 'fix', - subject: 'test', + type: "fix", + subject: "test", }; - expect(format(result)).toBe('fix: test'); + expect(format(result)).toBe("fix: test"); }); -test('should include scope', () => { +test("should include scope", () => { const result: Result = { - type: 'fix', - scope: 'prompt', - subject: 'test', + type: "fix", + scope: "prompt", + subject: "test", }; - expect(format(result)).toBe('fix(prompt): test'); + expect(format(result)).toBe("fix(prompt): test"); }); -test('should include body', () => { +test("should include body", () => { const result: Result = { - type: 'fix', - scope: 'prompt', - subject: 'test', - body: 'some body', + type: "fix", + scope: "prompt", + subject: "test", + body: "some body", }; - expect(format(result)).toBe('fix(prompt): test\nsome body'); + expect(format(result)).toBe("fix(prompt): test\nsome body"); }); -test('should include footer', () => { +test("should include footer", () => { const result: Result = { - type: 'fix', - scope: 'prompt', - subject: 'test', - footer: 'some footer', + type: "fix", + scope: "prompt", + subject: "test", + footer: "some footer", }; - expect(format(result)).toBe('fix(prompt): test\nsome footer'); + expect(format(result)).toBe("fix(prompt): test\nsome footer"); }); -test('should include body and footer', () => { +test("should include body and footer", () => { const result: Result = { - type: 'fix', - scope: 'prompt', - subject: 'test', - body: 'some body', - footer: 'some footer', + type: "fix", + scope: "prompt", + subject: "test", + body: "some body", + footer: "some footer", }; - expect(format(result)).toBe('fix(prompt): test\nsome body\nsome footer'); + expect(format(result)).toBe("fix(prompt): test\nsome body\nsome footer"); }); diff --git a/@commitlint/prompt/src/library/format.ts b/@commitlint/prompt/src/library/format.ts index e80b57166a..414af8920f 100644 --- a/@commitlint/prompt/src/library/format.ts +++ b/@commitlint/prompt/src/library/format.ts @@ -1,6 +1,6 @@ -import chalk from 'chalk'; +import chalk from "chalk"; -import type {Result, ResultPart} from './types.js'; +import type { Result, ResultPart } from "./types.js"; /** * Get formatted commit message @@ -22,18 +22,18 @@ export default function format(input: Result, debug = false): string { registry[name as ResultPart] = value === undefined ? chalk.grey(`<${name}>`) : chalk.bold(value); return registry; - }, {}) + }, {}) : defaultInput; // Return formatted string - const {type, scope, subject, body, footer} = results; + const { type, scope, subject, body, footer } = results; return [ - `${type || ''}${scope ? `(${scope})` : ''}${type || scope ? ':' : ''} ${ - subject || '' + `${type || ""}${scope ? `(${scope})` : ""}${type || scope ? ":" : ""} ${ + subject || "" }`, body, footer, ] .filter(Boolean) - .join('\n'); + .join("\n"); } diff --git a/@commitlint/prompt/src/library/get-forced-case-fn.test.ts b/@commitlint/prompt/src/library/get-forced-case-fn.test.ts index 932f1e7bdb..c96caa562a 100644 --- a/@commitlint/prompt/src/library/get-forced-case-fn.test.ts +++ b/@commitlint/prompt/src/library/get-forced-case-fn.test.ts @@ -1,118 +1,118 @@ -import {test, expect} from 'vitest'; -import {RuleConfigSeverity} from '@commitlint/types'; +import { test, expect } from "vitest"; +import { RuleConfigSeverity } from "@commitlint/types"; -import getForcedCaseFn from './get-forced-case-fn.js'; +import getForcedCaseFn from "./get-forced-case-fn.js"; -test('should not apply', () => { - let rule = getForcedCaseFn(['name', [RuleConfigSeverity.Disabled]]); - expect(rule('test')).toBe('test'); - expect(rule('test-foo')).toBe('test-foo'); - expect(rule('testFoo')).toBe('testFoo'); - expect(rule('TEST_FOO')).toBe('TEST_FOO'); +test("should not apply", () => { + let rule = getForcedCaseFn(["name", [RuleConfigSeverity.Disabled]]); + expect(rule("test")).toBe("test"); + expect(rule("test-foo")).toBe("test-foo"); + expect(rule("testFoo")).toBe("testFoo"); + expect(rule("TEST_FOO")).toBe("TEST_FOO"); rule = getForcedCaseFn(); - expect(rule('test')).toBe('test'); - expect(rule('test-foo')).toBe('test-foo'); - expect(rule('testFoo')).toBe('testFoo'); - expect(rule('TEST_FOO')).toBe('TEST_FOO'); + expect(rule("test")).toBe("test"); + expect(rule("test-foo")).toBe("test-foo"); + expect(rule("testFoo")).toBe("testFoo"); + expect(rule("TEST_FOO")).toBe("TEST_FOO"); - rule = getForcedCaseFn(['name', [RuleConfigSeverity.Warning, 'never']]); - expect(rule('test')).toBe('test'); - expect(rule('test-foo')).toBe('test-foo'); - expect(rule('testFoo')).toBe('testFoo'); - expect(rule('TEST_FOO')).toBe('TEST_FOO'); + rule = getForcedCaseFn(["name", [RuleConfigSeverity.Warning, "never"]]); + expect(rule("test")).toBe("test"); + expect(rule("test-foo")).toBe("test-foo"); + expect(rule("testFoo")).toBe("testFoo"); + expect(rule("TEST_FOO")).toBe("TEST_FOO"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', ['camel-case', 'lowercase']], + "name", + [RuleConfigSeverity.Warning, "always", ["camel-case", "lowercase"]], ]); - expect(rule('test')).toBe('test'); - expect(rule('test-foo')).toBe('test-foo'); - expect(rule('testFoo')).toBe('testFoo'); - expect(rule('TEST_FOO')).toBe('TEST_FOO'); + expect(rule("test")).toBe("test"); + expect(rule("test-foo")).toBe("test-foo"); + expect(rule("testFoo")).toBe("testFoo"); + expect(rule("TEST_FOO")).toBe("TEST_FOO"); }); -test('should throw error on invalid casing', () => { - let rule = getForcedCaseFn(['name', [RuleConfigSeverity.Warning, 'always']]); - expect(() => rule('test')).toThrow('Unknown target case "undefined"'); +test("should throw error on invalid casing", () => { + let rule = getForcedCaseFn(["name", [RuleConfigSeverity.Warning, "always"]]); + expect(() => rule("test")).toThrow('Unknown target case "undefined"'); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'foo'], + "name", + [RuleConfigSeverity.Warning, "always", "foo"], ]); - expect(() => rule('test')).toThrow('Unknown target case "foo"'); + expect(() => rule("test")).toThrow('Unknown target case "foo"'); }); -test('should convert text correctly', () => { +test("should convert text correctly", () => { let rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'camel-case'], + "name", + [RuleConfigSeverity.Warning, "always", "camel-case"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('testFooBarBazBaz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("testFooBarBazBaz"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'kebab-case'], + "name", + [RuleConfigSeverity.Warning, "always", "kebab-case"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('test-foo-bar-baz-baz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("test-foo-bar-baz-baz"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'snake-case'], + "name", + [RuleConfigSeverity.Warning, "always", "snake-case"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('test_foo_bar_baz_baz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("test_foo_bar_baz_baz"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'pascal-case'], + "name", + [RuleConfigSeverity.Warning, "always", "pascal-case"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('TestFooBarBazBaz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("TestFooBarBazBaz"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'start-case'], + "name", + [RuleConfigSeverity.Warning, "always", "start-case"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('TEST FOO Bar Baz Baz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("TEST FOO Bar Baz Baz"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'upper-case'], + "name", + [RuleConfigSeverity.Warning, "always", "upper-case"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('TEST_FOOBAR-BAZ BAZ'); + expect(rule("TEST_FOOBar-baz baz")).toBe("TEST_FOOBAR-BAZ BAZ"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'uppercase'], + "name", + [RuleConfigSeverity.Warning, "always", "uppercase"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('TEST_FOOBAR-BAZ BAZ'); + expect(rule("TEST_FOOBar-baz baz")).toBe("TEST_FOOBAR-BAZ BAZ"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'sentence-case'], + "name", + [RuleConfigSeverity.Warning, "always", "sentence-case"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('TEST_FOOBar-baz baz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("TEST_FOOBar-baz baz"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'sentencecase'], + "name", + [RuleConfigSeverity.Warning, "always", "sentencecase"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('TEST_FOOBar-baz baz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("TEST_FOOBar-baz baz"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'lower-case'], + "name", + [RuleConfigSeverity.Warning, "always", "lower-case"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('test_foobar-baz baz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("test_foobar-baz baz"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'lowercase'], + "name", + [RuleConfigSeverity.Warning, "always", "lowercase"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('test_foobar-baz baz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("test_foobar-baz baz"); rule = getForcedCaseFn([ - 'name', - [RuleConfigSeverity.Warning, 'always', 'lowerCase'], + "name", + [RuleConfigSeverity.Warning, "always", "lowerCase"], ]); - expect(rule('TEST_FOOBar-baz baz')).toBe('test_foobar-baz baz'); + expect(rule("TEST_FOOBar-baz baz")).toBe("test_foobar-baz baz"); }); diff --git a/@commitlint/prompt/src/library/get-forced-case-fn.ts b/@commitlint/prompt/src/library/get-forced-case-fn.ts index 90f2c92b6c..11b91fb178 100644 --- a/@commitlint/prompt/src/library/get-forced-case-fn.ts +++ b/@commitlint/prompt/src/library/get-forced-case-fn.ts @@ -1,8 +1,8 @@ -import {toCase} from '@commitlint/ensure'; -import type {TargetCaseType} from '@commitlint/types'; +import { toCase } from "@commitlint/ensure"; +import type { TargetCaseType } from "@commitlint/types"; -import type {RuleEntry} from './types.js'; -import {ruleIsActive, ruleIsNotApplicable} from './utils.js'; +import type { RuleEntry } from "./types.js"; +import { ruleIsActive, ruleIsNotApplicable } from "./utils.js"; /** * Get forced case for rule @@ -10,7 +10,7 @@ import {ruleIsActive, ruleIsNotApplicable} from './utils.js'; * @return transform function applying the enforced case */ export default function getForcedCaseFn( - rule?: RuleEntry + rule?: RuleEntry, ): (input: string) => string { const noop = (input: string) => input; diff --git a/@commitlint/prompt/src/library/get-forced-leading-fn.ts b/@commitlint/prompt/src/library/get-forced-leading-fn.ts index 652ba5709b..7a750ee201 100644 --- a/@commitlint/prompt/src/library/get-forced-leading-fn.ts +++ b/@commitlint/prompt/src/library/get-forced-leading-fn.ts @@ -1,5 +1,5 @@ -import type {RuleEntry} from './types.js'; -import {ruleIsActive, ruleIsNotApplicable} from './utils.js'; +import type { RuleEntry } from "./types.js"; +import { ruleIsActive, ruleIsNotApplicable } from "./utils.js"; /** * Get forced leading for rule @@ -7,19 +7,19 @@ import {ruleIsActive, ruleIsNotApplicable} from './utils.js'; * @return transform function applying the leading */ export default function getForcedLeadingFn( - rule?: RuleEntry + rule?: RuleEntry, ): (input: string) => string { if (!rule || !ruleIsActive(rule)) { return (input: string): string => input; } const remove = (input: string): string => { - const fragments = input.split('\n'); - return fragments[0] === '' ? fragments.slice(1).join('\n') : input; + const fragments = input.split("\n"); + return fragments[0] === "" ? fragments.slice(1).join("\n") : input; }; const lead = (input: string): string => { - const fragments = input.split('\n'); - return fragments[0] === '' ? input : ['', ...fragments].join('\n'); + const fragments = input.split("\n"); + return fragments[0] === "" ? input : ["", ...fragments].join("\n"); }; return !ruleIsNotApplicable(rule) ? lead : remove; diff --git a/@commitlint/prompt/src/library/get-prompt.ts b/@commitlint/prompt/src/library/get-prompt.ts index 4e57f035c9..924549c007 100644 --- a/@commitlint/prompt/src/library/get-prompt.ts +++ b/@commitlint/prompt/src/library/get-prompt.ts @@ -1,12 +1,12 @@ -import chalk from 'chalk'; -import type {InputCustomOptions} from 'inquirer'; +import chalk from "chalk"; +import type { InputCustomOptions } from "inquirer"; -import type {InputSetting, RuleEntry, Result, ResultPart} from './types.js'; +import type { InputSetting, RuleEntry, Result, ResultPart } from "./types.js"; -import format from './format.js'; -import getForcedCaseFn from './get-forced-case-fn.js'; -import getForcedLeadingFn from './get-forced-leading-fn.js'; -import meta from './meta.js'; +import format from "./format.js"; +import getForcedCaseFn from "./get-forced-case-fn.js"; +import getForcedLeadingFn from "./get-forced-leading-fn.js"; +import meta from "./meta.js"; import { enumRuleIsActive, getHasName, @@ -14,9 +14,9 @@ import { ruleIsActive, ruleIsApplicable, ruleIsNotApplicable, -} from './utils.js'; +} from "./utils.js"; -const EOL = '\n'; +const EOL = "\n"; /** * Get a cli prompt based on rule configuration @@ -28,9 +28,9 @@ const EOL = '\n'; export default function getPrompt( type: ResultPart, rules: RuleEntry[] = [], - settings: InputSetting = {} + settings: InputSetting = {}, ): InputCustomOptions<Result> | null { - const emptyRule = rules.filter(getHasName('empty')).find(ruleIsActive); + const emptyRule = rules.filter(getHasName("empty")).find(ruleIsActive); const mustBeEmpty = emptyRule ? ruleIsApplicable(emptyRule) : false; @@ -40,24 +40,24 @@ export default function getPrompt( const required = emptyRule ? ruleIsNotApplicable(emptyRule) : false; - const forceCaseFn = getForcedCaseFn(rules.find(getHasName('case'))); + const forceCaseFn = getForcedCaseFn(rules.find(getHasName("case"))); const forceLeadingBlankFn = getForcedLeadingFn( - rules.find(getHasName('leading-blank')) + rules.find(getHasName("leading-blank")), ); - const maxLengthRule = rules.find(getHasName('max-length')); + const maxLengthRule = rules.find(getHasName("max-length")); const inputMaxLength = getMaxLength(maxLengthRule); - const enumRule = rules.filter(getHasName('enum')).find(enumRuleIsActive); + const enumRule = rules.filter(getHasName("enum")).find(enumRuleIsActive); const tabCompletion = enumRule ? enumRule[1][2].map((enumerable) => { const enumSettings = (settings.enumerables || {})[enumerable] || {}; return { value: forceLeadingBlankFn(forceCaseFn(enumerable)), - description: enumSettings.description || '', + description: enumSettings.description || "", }; - }) + }) : []; const maxLength = (res: Result) => { @@ -74,12 +74,12 @@ export default function getPrompt( }; return { - type: 'input-custom', + type: "input-custom", name: type, message: `${type}:`, validate(input, answers) { if (input.length > maxLength(answers || {})) { - return 'Input contains too many characters!'; + return "Input contains too many characters!"; } if (required && input.trim().length === 0) { // Show help if enum is defined and input may not be empty @@ -92,19 +92,19 @@ export default function getPrompt( tabValues.length > 0 && !tabValues.includes(input) ) { - return `⚠ ${chalk.bold(type)} must be one of ${tabValues.join(', ')}.`; + return `⚠ ${chalk.bold(type)} must be one of ${tabValues.join(", ")}.`; } return true; }, tabCompletion, log(answers?: Result) { let prefix = - `${chalk.white('Please enter a')} ${chalk.bold(type)}: ${meta({ + `${chalk.white("Please enter a")} ${chalk.bold(type)}: ${meta({ optional: !required, required: required, - 'tab-completion': typeof enumRule !== 'undefined', - header: typeof settings.header !== 'undefined', - 'multi-line': settings.multiline, + "tab-completion": typeof enumRule !== "undefined", + header: typeof settings.header !== "undefined", + "multi-line": settings.multiline, })}` + EOL; if (settings.description) { diff --git a/@commitlint/prompt/src/library/meta.ts b/@commitlint/prompt/src/library/meta.ts index 61c9a412eb..b361364a07 100644 --- a/@commitlint/prompt/src/library/meta.ts +++ b/@commitlint/prompt/src/library/meta.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import chalk from "chalk"; /** * Get formatted meta hints for configuration @@ -11,8 +11,8 @@ export default function meta(settings: Record<string, unknown>): string { .filter((item) => item[1]) .map((item) => { const [name, value] = item; - return typeof value === 'boolean' ? `[${name}]` : `[${name}=${value}]`; + return typeof value === "boolean" ? `[${name}]` : `[${name}=${value}]`; }) - .join(' ') + .join(" "), ); } diff --git a/@commitlint/prompt/src/library/types.ts b/@commitlint/prompt/src/library/types.ts index be8582ad28..65b8bc3ad9 100644 --- a/@commitlint/prompt/src/library/types.ts +++ b/@commitlint/prompt/src/library/types.ts @@ -1,4 +1,7 @@ -import type {RuleConfigCondition, RuleConfigSeverity} from '@commitlint/types'; +import type { + RuleConfigCondition, + RuleConfigSeverity, +} from "@commitlint/types"; export type RuleEntry = | [string, Readonly<[RuleConfigSeverity.Disabled]>] @@ -19,6 +22,6 @@ export type InputSetting = { }; }; -export type ResultPart = 'type' | 'scope' | 'subject' | 'body' | 'footer'; +export type ResultPart = "type" | "scope" | "subject" | "body" | "footer"; export type Result = Partial<Record<ResultPart, string | undefined>>; diff --git a/@commitlint/prompt/src/library/utils.test.ts b/@commitlint/prompt/src/library/utils.test.ts index 2893800ea3..96f1ae6d6f 100644 --- a/@commitlint/prompt/src/library/utils.test.ts +++ b/@commitlint/prompt/src/library/utils.test.ts @@ -1,9 +1,9 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; import { RuleConfigQuality, RuleConfigSeverity, RulesConfig, -} from '@commitlint/types'; +} from "@commitlint/types"; import { enumRuleIsActive, @@ -13,118 +13,118 @@ import { getRulePrefix, getRules, ruleIsActive, -} from './utils.js'; +} from "./utils.js"; -test('getRulePrefix', () => { - expect(getRulePrefix('body-leading-blank')).toEqual('body'); - expect(getRulePrefix('body-max-line-length')).toEqual('body'); - expect(getRulePrefix('footer-leading-blank')).toEqual('footer'); - expect(getRulePrefix('footer-max-line-length')).toEqual('footer'); - expect(getRulePrefix('header-max-length')).toEqual('header'); - expect(getRulePrefix('scope-case')).toEqual('scope'); - expect(getRulePrefix('scope-enum')).toEqual('scope'); - expect(getRulePrefix('subject-case')).toEqual('subject'); - expect(getRulePrefix('subject-empty')).toEqual('subject'); - expect(getRulePrefix('subject-full-stop')).toEqual('subject'); - expect(getRulePrefix('type-case')).toEqual('type'); - expect(getRulePrefix('type-empty')).toEqual('type'); - expect(getRulePrefix('type-enum')).toEqual('type'); +test("getRulePrefix", () => { + expect(getRulePrefix("body-leading-blank")).toEqual("body"); + expect(getRulePrefix("body-max-line-length")).toEqual("body"); + expect(getRulePrefix("footer-leading-blank")).toEqual("footer"); + expect(getRulePrefix("footer-max-line-length")).toEqual("footer"); + expect(getRulePrefix("header-max-length")).toEqual("header"); + expect(getRulePrefix("scope-case")).toEqual("scope"); + expect(getRulePrefix("scope-enum")).toEqual("scope"); + expect(getRulePrefix("subject-case")).toEqual("subject"); + expect(getRulePrefix("subject-empty")).toEqual("subject"); + expect(getRulePrefix("subject-full-stop")).toEqual("subject"); + expect(getRulePrefix("type-case")).toEqual("type"); + expect(getRulePrefix("type-empty")).toEqual("type"); + expect(getRulePrefix("type-enum")).toEqual("type"); }); -test('getRuleName', () => { - expect(getRuleName('body-leading-blank')).toEqual('leading-blank'); - expect(getRuleName('body-max-line-length')).toEqual('max-line-length'); - expect(getRuleName('footer-leading-blank')).toEqual('leading-blank'); - expect(getRuleName('footer-max-line-length')).toEqual('max-line-length'); - expect(getRuleName('header-max-length')).toEqual('max-length'); - expect(getRuleName('scope-case')).toEqual('case'); - expect(getRuleName('scope-enum')).toEqual('enum'); - expect(getRuleName('subject-case')).toEqual('case'); - expect(getRuleName('subject-empty')).toEqual('empty'); - expect(getRuleName('subject-full-stop')).toEqual('full-stop'); - expect(getRuleName('type-case')).toEqual('case'); - expect(getRuleName('type-empty')).toEqual('empty'); - expect(getRuleName('type-enum')).toEqual('enum'); +test("getRuleName", () => { + expect(getRuleName("body-leading-blank")).toEqual("leading-blank"); + expect(getRuleName("body-max-line-length")).toEqual("max-line-length"); + expect(getRuleName("footer-leading-blank")).toEqual("leading-blank"); + expect(getRuleName("footer-max-line-length")).toEqual("max-line-length"); + expect(getRuleName("header-max-length")).toEqual("max-length"); + expect(getRuleName("scope-case")).toEqual("case"); + expect(getRuleName("scope-enum")).toEqual("enum"); + expect(getRuleName("subject-case")).toEqual("case"); + expect(getRuleName("subject-empty")).toEqual("empty"); + expect(getRuleName("subject-full-stop")).toEqual("full-stop"); + expect(getRuleName("type-case")).toEqual("case"); + expect(getRuleName("type-empty")).toEqual("empty"); + expect(getRuleName("type-enum")).toEqual("enum"); }); -test('ruleIsActive', () => { - expect(ruleIsActive(['', [RuleConfigSeverity.Error, 'always', 100]])).toBe( - true +test("ruleIsActive", () => { + expect(ruleIsActive(["", [RuleConfigSeverity.Error, "always", 100]])).toBe( + true, ); - expect(ruleIsActive(['', [RuleConfigSeverity.Warning, 'never', 100]])).toBe( - true + expect(ruleIsActive(["", [RuleConfigSeverity.Warning, "never", 100]])).toBe( + true, ); - expect(ruleIsActive(['', [RuleConfigSeverity.Disabled, 'always', 100]])).toBe( - false + expect(ruleIsActive(["", [RuleConfigSeverity.Disabled, "always", 100]])).toBe( + false, ); - expect(ruleIsActive(['', [RuleConfigSeverity.Error]] as any)).toBe(true); + expect(ruleIsActive(["", [RuleConfigSeverity.Error]] as any)).toBe(true); }); -test('getMaxLength', () => { - expect(getMaxLength(['', [RuleConfigSeverity.Error, 'always', 100]])).toBe( - 100 +test("getMaxLength", () => { + expect(getMaxLength(["", [RuleConfigSeverity.Error, "always", 100]])).toBe( + 100, ); - expect(getMaxLength(['', [RuleConfigSeverity.Warning, 'never', 100]])).toBe( - Infinity + expect(getMaxLength(["", [RuleConfigSeverity.Warning, "never", 100]])).toBe( + Infinity, ); - expect(getMaxLength(['', [RuleConfigSeverity.Disabled, 'always', 100]])).toBe( - Infinity + expect(getMaxLength(["", [RuleConfigSeverity.Disabled, "always", 100]])).toBe( + Infinity, ); - expect(getMaxLength(['', [RuleConfigSeverity.Error, 100]] as any)).toBe( - Infinity + expect(getMaxLength(["", [RuleConfigSeverity.Error, 100]] as any)).toBe( + Infinity, ); const rules: any = { - 'body-max-line-length': [RuleConfigSeverity.Error, 'always', 100], - 'header-max-length': [RuleConfigSeverity.Error, 'always', 100], - 'test-max-length': [RuleConfigSeverity.Disabled, 'always', 100], + "body-max-line-length": [RuleConfigSeverity.Error, "always", 100], + "header-max-length": [RuleConfigSeverity.Error, "always", 100], + "test-max-length": [RuleConfigSeverity.Disabled, "always", 100], }; - let lengthRule = getRules('header', rules).find(getHasName('max-length')); + let lengthRule = getRules("header", rules).find(getHasName("max-length")); expect(getMaxLength(lengthRule)).toBe(100); - lengthRule = getRules('body', rules).find(getHasName('max-length')); + lengthRule = getRules("body", rules).find(getHasName("max-length")); expect(getMaxLength(lengthRule)).toBe(Infinity); - lengthRule = getRules('test', rules).find(getHasName('max-length')); + lengthRule = getRules("test", rules).find(getHasName("max-length")); expect(getMaxLength(lengthRule)).toBe(Infinity); }); -test('check enum rule filters', () => { +test("check enum rule filters", () => { const rules: Partial<RulesConfig<RuleConfigQuality.Qualified>> = { - 'enum-string': [RuleConfigSeverity.Warning, 'always', ['1', '2', '3']], - 'type-enum': [RuleConfigSeverity.Error, 'always', ['build', 'chore', 'ci']], - 'scope-enum': [RuleConfigSeverity.Error, 'never', ['cli', 'core', 'lint']], - 'bar-enum': [RuleConfigSeverity.Disabled, 'always', ['foo', 'bar', 'baz']], + "enum-string": [RuleConfigSeverity.Warning, "always", ["1", "2", "3"]], + "type-enum": [RuleConfigSeverity.Error, "always", ["build", "chore", "ci"]], + "scope-enum": [RuleConfigSeverity.Error, "never", ["cli", "core", "lint"]], + "bar-enum": [RuleConfigSeverity.Disabled, "always", ["foo", "bar", "baz"]], }; - let enumRule = getRules('type', rules) - .filter(getHasName('enum')) + let enumRule = getRules("type", rules) + .filter(getHasName("enum")) .find(enumRuleIsActive); expect(enumRule).toEqual([ - 'type-enum', - [RuleConfigSeverity.Error, 'always', ['build', 'chore', 'ci']], + "type-enum", + [RuleConfigSeverity.Error, "always", ["build", "chore", "ci"]], ]); - enumRule = getRules('string', rules) - .filter(getHasName('enum')) + enumRule = getRules("string", rules) + .filter(getHasName("enum")) .find(enumRuleIsActive); expect(enumRule).toEqual(undefined); - enumRule = getRules('enum', rules) - .filter(getHasName('string')) + enumRule = getRules("enum", rules) + .filter(getHasName("string")) .find(enumRuleIsActive); expect(enumRule).toEqual([ - 'enum-string', - [RuleConfigSeverity.Warning, 'always', ['1', '2', '3']], + "enum-string", + [RuleConfigSeverity.Warning, "always", ["1", "2", "3"]], ]); - enumRule = getRules('bar', rules) - .filter(getHasName('enum')) + enumRule = getRules("bar", rules) + .filter(getHasName("enum")) .find(enumRuleIsActive); expect(enumRule).toEqual(undefined); - enumRule = getRules('scope', rules) - .filter(getHasName('enum')) + enumRule = getRules("scope", rules) + .filter(getHasName("enum")) .find(enumRuleIsActive); expect(enumRule).toEqual(undefined); }); diff --git a/@commitlint/prompt/src/library/utils.ts b/@commitlint/prompt/src/library/utils.ts index eaa6245a24..aaca4e2004 100644 --- a/@commitlint/prompt/src/library/utils.ts +++ b/@commitlint/prompt/src/library/utils.ts @@ -1,7 +1,7 @@ -import {RuleConfigSeverity} from '@commitlint/types'; -import type {QualifiedRules} from '@commitlint/types'; +import { RuleConfigSeverity } from "@commitlint/types"; +import type { QualifiedRules } from "@commitlint/types"; -import type {RuleEntry} from './types.js'; +import type { RuleEntry } from "./types.js"; /** * Get name for a given rule id @@ -9,8 +9,8 @@ import type {RuleEntry} from './types.js'; * @return name of the rule */ export function getRuleName(id: string): string { - const fragments = id.split('-'); - return fragments.length > 1 ? fragments.slice(1).join('-') : fragments[0]; + const fragments = id.split("-"); + return fragments.length > 1 ? fragments.slice(1).join("-") : fragments[0]; } /** @@ -19,7 +19,7 @@ export function getRuleName(id: string): string { * @return prefix of the rule */ export function getRulePrefix(id: string): string | null { - const fragments = id.split('-'); + const fragments = id.split("-"); return fragments.length > 1 ? fragments[0] : null; } @@ -28,7 +28,7 @@ export function getRulePrefix(id: string): string | null { */ export function getHasName(name: string) { return <T extends RuleEntry>( - rule: RuleEntry + rule: RuleEntry, ): rule is Exclude<T, [string, undefined]> => getRuleName(rule[0]) === name; } @@ -38,7 +38,7 @@ export function getHasName(name: string) { * @return if the rule definition is active */ export function ruleIsActive<T extends RuleEntry>( - rule: T + rule: T, ): rule is Exclude<T, [string, Readonly<[RuleConfigSeverity.Disabled]>]> { const [, value] = rule; if (value && Array.isArray(value)) { @@ -53,13 +53,13 @@ export function ruleIsActive<T extends RuleEntry>( * @return if the rule definition is applicable */ export function ruleIsApplicable( - rule: RuleEntry + rule: RuleEntry, ): rule is - | [string, Readonly<[RuleConfigSeverity, 'always']>] - | [string, Readonly<[RuleConfigSeverity, 'always', unknown]>] { + | [string, Readonly<[RuleConfigSeverity, "always"]>] + | [string, Readonly<[RuleConfigSeverity, "always", unknown]>] { const [, value] = rule; if (value && Array.isArray(value)) { - return value[1] === 'always'; + return value[1] === "always"; } return false; } @@ -70,24 +70,24 @@ export function ruleIsApplicable( * @return if the rule definition is applicable */ export function ruleIsNotApplicable( - rule: RuleEntry + rule: RuleEntry, ): rule is - | [string, Readonly<[RuleConfigSeverity, 'never']>] - | [string, Readonly<[RuleConfigSeverity, 'never', unknown]>] { + | [string, Readonly<[RuleConfigSeverity, "never"]>] + | [string, Readonly<[RuleConfigSeverity, "never", unknown]>] { const [, value] = rule; if (value && Array.isArray(value)) { - return value[1] === 'never'; + return value[1] === "never"; } return false; } export function enumRuleIsActive( - rule: RuleEntry + rule: RuleEntry, ): rule is [ string, Readonly< - [RuleConfigSeverity.Warning | RuleConfigSeverity.Error, 'always', string[]] - > + [RuleConfigSeverity.Warning | RuleConfigSeverity.Error, "always", string[]] + >, ] { return ( ruleIsActive(rule) && @@ -105,7 +105,7 @@ export function enumRuleIsActive( */ export function getRules(prefix: string, rules: QualifiedRules): RuleEntry[] { return Object.entries(rules).filter( - (rule): rule is RuleEntry => getRulePrefix(rule[0]) === prefix + (rule): rule is RuleEntry => getRulePrefix(rule[0]) === prefix, ); } @@ -114,7 +114,7 @@ export function getMaxLength(rule?: RuleEntry): number { rule && ruleIsActive(rule) && ruleIsApplicable(rule) && - typeof rule[1][2] === 'number' + typeof rule[1][2] === "number" ) { return rule[1][2]; } diff --git a/@commitlint/prompt/src/settings.ts b/@commitlint/prompt/src/settings.ts index 8c80f14247..a85a9a5394 100644 --- a/@commitlint/prompt/src/settings.ts +++ b/@commitlint/prompt/src/settings.ts @@ -1,56 +1,56 @@ export default { type: { - description: '<type> holds information about the goal of a change.', + description: "<type> holds information about the goal of a change.", enumerables: { feat: { - description: 'Adds a new feature.', + description: "Adds a new feature.", }, fix: { - description: 'Solves a bug.', + description: "Solves a bug.", }, chore: { description: "Other changes that don't modify src or test files", }, docs: { - description: 'Adds or alters documentation.', + description: "Adds or alters documentation.", }, style: { - description: 'Improves formatting, white-space.', + description: "Improves formatting, white-space.", }, refactor: { description: - 'Rewrites code without feature, performance or bug changes.', + "Rewrites code without feature, performance or bug changes.", }, perf: { - description: 'Improves performance.', + description: "Improves performance.", }, test: { - description: 'Adds or modifies tests.', + description: "Adds or modifies tests.", }, build: { - description: 'Affects the build system or external dependencies.', + description: "Affects the build system or external dependencies.", }, ci: { - description: 'Changes CI configuration files and scripts.', + description: "Changes CI configuration files and scripts.", }, revert: { - description: 'Reverts a previous commit.', + description: "Reverts a previous commit.", }, }, }, scope: { - description: '<scope> marks which sub-component of the project is affected', + description: "<scope> marks which sub-component of the project is affected", }, subject: { - description: '<subject> is a short, high-level description of the change', + description: "<subject> is a short, high-level description of the change", }, body: { - description: '<body> holds additional information about the change', + description: "<body> holds additional information about the change", multiline: true, }, footer: { description: - '<footer> holds further meta data, such as breaking changes and issue ids', + "<footer> holds further meta data, such as breaking changes and issue ids", multiline: true, }, }; diff --git a/@commitlint/prompt/tsconfig.json b/@commitlint/prompt/tsconfig.json index 76dd5e38cb..52e48f310a 100644 --- a/@commitlint/prompt/tsconfig.json +++ b/@commitlint/prompt/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], - "references": [{"path": "../types"}, {"path": "../load"}] + "references": [{ "path": "../types" }, { "path": "../load" }] } diff --git a/@commitlint/read/CHANGELOG.md b/@commitlint/read/CHANGELOG.md index b4c2a8b069..60f0f234b0 100644 --- a/@commitlint/read/CHANGELOG.md +++ b/@commitlint/read/CHANGELOG.md @@ -3,6 +3,36 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/read + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + + +### Bug Fixes + +* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299)) + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/read diff --git a/@commitlint/read/package.json b/@commitlint/read/package.json index 1010c62517..56294132a1 100644 --- a/@commitlint/read/package.json +++ b/@commitlint/read/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/read", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Read commit messages from a specified range or last edit", "main": "lib/read.js", "types": "lib/read.d.ts", @@ -36,17 +36,17 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0", + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0", "@types/git-raw-commits": "^2.0.3", "@types/minimist": "^1.2.4" }, "dependencies": { - "@commitlint/top-level": "^19.5.0", - "@commitlint/types": "^19.5.0", + "@commitlint/top-level": "^20.0.0", + "@commitlint/types": "^20.0.0", "git-raw-commits": "^4.0.0", "minimist": "^1.2.8", - "tinyexec": "^0.3.0" + "tinyexec": "^1.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/read/src/get-edit-commit.ts b/@commitlint/read/src/get-edit-commit.ts index 9dc4739e17..7754ecb802 100644 --- a/@commitlint/read/src/get-edit-commit.ts +++ b/@commitlint/read/src/get-edit-commit.ts @@ -1,21 +1,21 @@ -import toplevel from '@commitlint/top-level'; -import fs from 'fs/promises'; +import toplevel from "@commitlint/top-level"; +import fs from "fs/promises"; -import {getEditFilePath} from './get-edit-file-path.js'; +import { getEditFilePath } from "./get-edit-file-path.js"; // Get recently edited commit message export async function getEditCommit( cwd?: string, - edit?: boolean | string + edit?: boolean | string, ): Promise<string[]> { const top = await toplevel(cwd); - if (typeof top !== 'string') { + if (typeof top !== "string") { throw new TypeError(`Could not find git root from ${cwd}`); } const editFilePath = await getEditFilePath(top, edit); const editFile: Buffer = await fs.readFile(editFilePath); - return [`${editFile.toString('utf-8')}\n`]; + return [`${editFile.toString("utf-8")}\n`]; } diff --git a/@commitlint/read/src/get-edit-file-path.ts b/@commitlint/read/src/get-edit-file-path.ts index 4260b34f5f..b323dce1e2 100644 --- a/@commitlint/read/src/get-edit-file-path.ts +++ b/@commitlint/read/src/get-edit-file-path.ts @@ -1,26 +1,26 @@ -import path from 'path'; -import {Stats} from 'fs'; -import fs from 'fs/promises'; +import path from "node:path"; +import { Stats } from "node:fs"; +import fs from "fs/promises"; // Get path to recently edited commit message file export async function getEditFilePath( top: string, - edit?: boolean | string + edit?: boolean | string, ): Promise<string> { - if (typeof edit === 'string') { + if (typeof edit === "string") { return path.resolve(top, edit); } - const dotgitPath = path.join(top, '.git'); + const dotgitPath = path.join(top, ".git"); const dotgitStats: Stats = await fs.lstat(dotgitPath); if (dotgitStats.isDirectory()) { - return path.join(top, '.git/COMMIT_EDITMSG'); + return path.join(top, ".git/COMMIT_EDITMSG"); } const gitFile: string = await fs.readFile(dotgitPath, { - encoding: 'utf-8', + encoding: "utf-8", }); - const relativeGitPath = gitFile.replace('gitdir: ', '').replace('\n', ''); - return path.resolve(top, relativeGitPath, 'COMMIT_EDITMSG'); + const relativeGitPath = gitFile.replace("gitdir: ", "").replace("\n", ""); + return path.resolve(top, relativeGitPath, "COMMIT_EDITMSG"); } diff --git a/@commitlint/read/src/get-history-commits.ts b/@commitlint/read/src/get-history-commits.ts index 0abb3f4879..ad9fc0a705 100644 --- a/@commitlint/read/src/get-history-commits.ts +++ b/@commitlint/read/src/get-history-commits.ts @@ -1,11 +1,11 @@ -import gitRawCommits from 'git-raw-commits'; +import gitRawCommits from "git-raw-commits"; -import {streamToPromise} from './stream-to-promise.js'; +import { streamToPromise } from "./stream-to-promise.js"; // Get commit messages from history export async function getHistoryCommits( options: gitRawCommits.GitOptions, - opts: {cwd?: string} = {} + opts: { cwd?: string } = {}, ): Promise<string[]> { - return streamToPromise(gitRawCommits(options, {cwd: opts.cwd})); + return streamToPromise(gitRawCommits(options, { cwd: opts.cwd })); } diff --git a/@commitlint/read/src/read.test.ts b/@commitlint/read/src/read.test.ts index 9d7fa9a12e..c1903b1609 100644 --- a/@commitlint/read/src/read.test.ts +++ b/@commitlint/read/src/read.test.ts @@ -1,152 +1,152 @@ -import {test, expect} from 'vitest'; -import fs from 'fs/promises'; -import path from 'path'; -import {git} from '@commitlint/test'; -import {x} from 'tinyexec'; +import { test, expect } from "vitest"; +import fs from "fs/promises"; +import path from "node:path"; +import { git } from "@commitlint/test"; +import { x } from "tinyexec"; -import read from './read.js'; +import read from "./read.js"; -test('get edit commit message specified by the `edit` flag', async () => { +test("get edit commit message specified by the `edit` flag", async () => { const cwd: string = await git.bootstrap(); - await fs.writeFile(path.join(cwd, 'commit-msg-file'), 'foo'); + await fs.writeFile(path.join(cwd, "commit-msg-file"), "foo"); - const expected = ['foo\n']; - const actual = await read({edit: 'commit-msg-file', cwd}); + const expected = ["foo\n"]; + const actual = await read({ edit: "commit-msg-file", cwd }); expect(actual).toEqual(expected); }); -test('get edit commit message from git root', async () => { +test("get edit commit message from git root", async () => { const cwd: string = await git.bootstrap(); - await fs.writeFile(path.join(cwd, 'alpha.txt'), 'alpha'); - await x('git', ['add', '.'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', 'alpha'], {nodeOptions: {cwd}}); - const expected = ['alpha\n\n']; - const actual = await read({edit: true, cwd}); + await fs.writeFile(path.join(cwd, "alpha.txt"), "alpha"); + await x("git", ["add", "."], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", "alpha"], { nodeOptions: { cwd } }); + const expected = ["alpha\n\n"]; + const actual = await read({ edit: true, cwd }); expect(actual).toEqual(expected); }); -test('get history commit messages', async () => { +test("get history commit messages", async () => { const cwd: string = await git.bootstrap(); - await fs.writeFile(path.join(cwd, 'alpha.txt'), 'alpha'); - await x('git', ['add', 'alpha.txt'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', 'alpha'], {nodeOptions: {cwd}}); - await x('git', ['rm', 'alpha.txt'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', 'remove alpha'], {nodeOptions: {cwd}}); - - const expected = ['remove alpha\n\n', 'alpha\n\n']; - const actual = await read({cwd}); + await fs.writeFile(path.join(cwd, "alpha.txt"), "alpha"); + await x("git", ["add", "alpha.txt"], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", "alpha"], { nodeOptions: { cwd } }); + await x("git", ["rm", "alpha.txt"], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", "remove alpha"], { nodeOptions: { cwd } }); + + const expected = ["remove alpha\n\n", "alpha\n\n"]; + const actual = await read({ cwd }); expect(actual).toEqual(expected); }); -test('get edit commit message from git subdirectory', async () => { +test("get edit commit message from git subdirectory", async () => { const cwd: string = await git.bootstrap(); - await fs.mkdir(path.join(cwd, 'beta')); - await fs.writeFile(path.join(cwd, 'beta/beta.txt'), 'beta'); + await fs.mkdir(path.join(cwd, "beta")); + await fs.writeFile(path.join(cwd, "beta/beta.txt"), "beta"); - await x('git', ['add', '.'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', 'beta'], {nodeOptions: {cwd}}); + await x("git", ["add", "."], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", "beta"], { nodeOptions: { cwd } }); - const expected = ['beta\n\n']; - const actual = await read({edit: true, cwd}); + const expected = ["beta\n\n"]; + const actual = await read({ edit: true, cwd }); expect(actual).toEqual(expected); }); -test('get edit commit message while skipping first commit', async () => { +test("get edit commit message while skipping first commit", async () => { const cwd: string = await git.bootstrap(); - await fs.mkdir(path.join(cwd, 'beta')); - await fs.writeFile(path.join(cwd, 'beta/beta.txt'), 'beta'); - - await fs.writeFile(path.join(cwd, 'alpha.txt'), 'alpha'); - await x('git', ['add', 'alpha.txt'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', 'alpha'], {nodeOptions: {cwd}}); - await fs.writeFile(path.join(cwd, 'beta.txt'), 'beta'); - await x('git', ['add', 'beta.txt'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', 'beta'], {nodeOptions: {cwd}}); - await fs.writeFile(path.join(cwd, 'gamma.txt'), 'gamma'); - await x('git', ['add', 'gamma.txt'], {nodeOptions: {cwd}}); - await x('git', ['commit', '-m', 'gamma'], {nodeOptions: {cwd}}); - - const expected = ['beta\n\n']; - const actual = await read({from: 'HEAD~2', cwd, gitLogArgs: '--skip 1'}); + await fs.mkdir(path.join(cwd, "beta")); + await fs.writeFile(path.join(cwd, "beta/beta.txt"), "beta"); + + await fs.writeFile(path.join(cwd, "alpha.txt"), "alpha"); + await x("git", ["add", "alpha.txt"], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", "alpha"], { nodeOptions: { cwd } }); + await fs.writeFile(path.join(cwd, "beta.txt"), "beta"); + await x("git", ["add", "beta.txt"], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", "beta"], { nodeOptions: { cwd } }); + await fs.writeFile(path.join(cwd, "gamma.txt"), "gamma"); + await x("git", ["add", "gamma.txt"], { nodeOptions: { cwd } }); + await x("git", ["commit", "-m", "gamma"], { nodeOptions: { cwd } }); + + const expected = ["beta\n\n"]; + const actual = await read({ from: "HEAD~2", cwd, gitLogArgs: "--skip 1" }); expect(actual).toEqual(expected); }); -test('should only read the last commit', async () => { +test("should only read the last commit", async () => { const cwd: string = await git.bootstrap(); - await x('git', ['commit', '--allow-empty', '-m', 'commit Z'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "commit Z"], { + nodeOptions: { cwd }, }); - await x('git', ['commit', '--allow-empty', '-m', 'commit Y'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "commit Y"], { + nodeOptions: { cwd }, }); - await x('git', ['commit', '--allow-empty', '-m', 'commit X'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "commit X"], { + nodeOptions: { cwd }, }); - const result = await read({cwd, last: true}); + const result = await read({ cwd, last: true }); - expect(result).toEqual(['commit X']); + expect(result).toEqual(["commit X"]); }); -test('should read commits from the last annotated tag', async () => { +test("should read commits from the last annotated tag", async () => { const cwd: string = await git.bootstrap(); - await x('git', ['commit', '--allow-empty', '-m', 'chore: release v1.0.0'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "chore: release v1.0.0"], { + nodeOptions: { cwd }, }); - await x('git', ['tag', 'v1.0.0', '--annotate', '-m', 'v1.0.0'], { - nodeOptions: {cwd}, + await x("git", ["tag", "v1.0.0", "--annotate", "-m", "v1.0.0"], { + nodeOptions: { cwd }, }); - await x('git', ['commit', '--allow-empty', '-m', 'commit 1'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "commit 1"], { + nodeOptions: { cwd }, }); - await x('git', ['commit', '--allow-empty', '-m', 'commit 2'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "commit 2"], { + nodeOptions: { cwd }, }); - const result = await read({cwd, fromLastTag: true}); + const result = await read({ cwd, fromLastTag: true }); - expect(result).toEqual(['commit 2\n\n', 'commit 1\n\n']); + expect(result).toEqual(["commit 2\n\n", "commit 1\n\n"]); }); -test('should read commits from the last lightweight tag', async () => { +test("should read commits from the last lightweight tag", async () => { const cwd: string = await git.bootstrap(); await x( - 'git', - ['commit', '--allow-empty', '-m', 'chore: release v9.9.9-alpha.1'], - {nodeOptions: {cwd}} + "git", + ["commit", "--allow-empty", "-m", "chore: release v9.9.9-alpha.1"], + { nodeOptions: { cwd } }, ); - await x('git', ['tag', 'v9.9.9-alpha.1'], {nodeOptions: {cwd}}); - await x('git', ['commit', '--allow-empty', '-m', 'commit A'], { - nodeOptions: {cwd}, + await x("git", ["tag", "v9.9.9-alpha.1"], { nodeOptions: { cwd } }); + await x("git", ["commit", "--allow-empty", "-m", "commit A"], { + nodeOptions: { cwd }, }); - await x('git', ['commit', '--allow-empty', '-m', 'commit B'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "commit B"], { + nodeOptions: { cwd }, }); - const result = await read({cwd, fromLastTag: true}); + const result = await read({ cwd, fromLastTag: true }); - expect(result).toEqual(['commit B\n\n', 'commit A\n\n']); + expect(result).toEqual(["commit B\n\n", "commit A\n\n"]); }); -test('should not read any commits when there are no tags', async () => { +test("should not read any commits when there are no tags", async () => { const cwd: string = await git.bootstrap(); - await x('git', ['commit', '--allow-empty', '-m', 'commit 7'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "commit 7"], { + nodeOptions: { cwd }, }); - await x('git', ['commit', '--allow-empty', '-m', 'commit 8'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "commit 8"], { + nodeOptions: { cwd }, }); - await x('git', ['commit', '--allow-empty', '-m', 'commit 9'], { - nodeOptions: {cwd}, + await x("git", ["commit", "--allow-empty", "-m", "commit 9"], { + nodeOptions: { cwd }, }); - const result = await read({cwd, fromLastTag: true}); + const result = await read({ cwd, fromLastTag: true }); expect(result).toHaveLength(0); }); diff --git a/@commitlint/read/src/read.ts b/@commitlint/read/src/read.ts index 0e5c422720..ae991a52d1 100644 --- a/@commitlint/read/src/read.ts +++ b/@commitlint/read/src/read.ts @@ -1,10 +1,10 @@ -import minimist from 'minimist'; -import type {GitOptions} from 'git-raw-commits'; +import minimist from "minimist"; +import type { GitOptions } from "git-raw-commits"; -import {getHistoryCommits} from './get-history-commits.js'; -import {getEditCommit} from './get-edit-commit.js'; +import { getHistoryCommits } from "./get-history-commits.js"; +import { getEditCommit } from "./get-edit-commit.js"; -import {x} from 'tinyexec'; +import { x } from "tinyexec"; interface GetCommitMessageOptions { cwd?: string; @@ -18,9 +18,9 @@ interface GetCommitMessageOptions { // Get commit messages export default async function getCommitMessages( - settings: GetCommitMessageOptions + settings: GetCommitMessageOptions, ): Promise<string[]> { - const {cwd, fromLastTag, to, last, edit, gitLogArgs} = settings; + const { cwd, fromLastTag, to, last, edit, gitLogArgs } = settings; let from = settings.from; if (edit) { @@ -29,9 +29,9 @@ export default async function getCommitMessages( if (last) { const gitCommandResult = await x( - 'git', - ['log', '-1', '--pretty=format:%B'], - {nodeOptions: {cwd}} + "git", + ["log", "-1", "--pretty=format:%B"], + { nodeOptions: { cwd } }, ); let output = gitCommandResult.stdout.trim(); // strip output of extra quotation marks ("") @@ -42,16 +42,16 @@ export default async function getCommitMessages( if (!from && fromLastTag) { const output = await x( - 'git', + "git", [ - 'describe', - '--abbrev=40', - '--always', - '--first-parent', - '--long', - '--tags', + "describe", + "--abbrev=40", + "--always", + "--first-parent", + "--long", + "--tags", ], - {nodeOptions: {cwd}} + { nodeOptions: { cwd } }, ); const stdout = output.stdout.trim(); @@ -63,20 +63,20 @@ export default async function getCommitMessages( // Description will be in the format: <tag>-<count>-g<hash> // Example: v3.2.0-11-g9057371a52adaae5180d93fe4d0bb808d874b9fb // Minus zero based (1), dash (1), "g" prefix (1), hash (40) = -43 - const tagSlice = stdout.lastIndexOf('-', stdout.length - 43); + const tagSlice = stdout.lastIndexOf("-", stdout.length - 43); from = stdout.slice(0, tagSlice); } } - let gitOptions: GitOptions = {from, to}; + let gitOptions: GitOptions = { from, to }; if (gitLogArgs) { gitOptions = { - ...minimist(gitLogArgs.split(' ')), + ...minimist(gitLogArgs.split(" ")), from, to, }; } - return getHistoryCommits(gitOptions, {cwd}); + return getHistoryCommits(gitOptions, { cwd }); } diff --git a/@commitlint/read/src/stream-to-promise.ts b/@commitlint/read/src/stream-to-promise.ts index afa8c63446..149fb05049 100644 --- a/@commitlint/read/src/stream-to-promise.ts +++ b/@commitlint/read/src/stream-to-promise.ts @@ -1,11 +1,11 @@ -import {Readable} from 'stream'; +import { Readable } from "node:stream"; export function streamToPromise(stream: Readable): Promise<string[]> { const data: string[] = []; return new Promise((resolve, reject) => stream - .on('data', (chunk) => data.push(chunk.toString('utf-8'))) - .on('error', reject) - .on('end', () => resolve(data)) + .on("data", (chunk) => data.push(chunk.toString("utf-8"))) + .on("error", reject) + .on("end", () => resolve(data)), ); } diff --git a/@commitlint/read/tsconfig.json b/@commitlint/read/tsconfig.json index f54e2e29b1..6edb67bd92 100644 --- a/@commitlint/read/tsconfig.json +++ b/@commitlint/read/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], - "references": [{"path": "../top-level"}] + "references": [{ "path": "../top-level" }] } diff --git a/@commitlint/resolve-extends/CHANGELOG.md b/@commitlint/resolve-extends/CHANGELOG.md index a21c42b05e..70308b3a70 100644 --- a/@commitlint/resolve-extends/CHANGELOG.md +++ b/@commitlint/resolve-extends/CHANGELOG.md @@ -3,6 +3,44 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + + +### Bug Fixes + +* **resolve-extends:** add import attribute for JSON config files ([#4551](https://github.com/conventional-changelog/commitlint/issues/4551)) ([82936c9](https://github.com/conventional-changelog/commitlint/commit/82936c90a2845b4f5721eef3c71d6183416d5b78)) + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/resolve-extends + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/resolve-extends + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/resolve-extends diff --git a/@commitlint/resolve-extends/package.json b/@commitlint/resolve-extends/package.json index c6003d6543..87bd312318 100644 --- a/@commitlint/resolve-extends/package.json +++ b/@commitlint/resolve-extends/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/resolve-extends", "type": "module", - "version": "19.5.0", + "version": "20.1.0", "description": "Lint your commit messages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,16 +36,16 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/utils": "^19.5.0", + "@commitlint/utils": "^20.0.0", "@types/lodash.mergewith": "^4.6.8" }, "dependencies": { - "@commitlint/config-validator": "^19.5.0", - "@commitlint/types": "^19.5.0", + "@commitlint/config-validator": "^20.0.0", + "@commitlint/types": "^20.0.0", "global-directory": "^4.0.1", "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/resolve-extends/src/index.test.ts b/@commitlint/resolve-extends/src/index.test.ts index b088476e00..0e2306c48b 100644 --- a/@commitlint/resolve-extends/src/index.test.ts +++ b/@commitlint/resolve-extends/src/index.test.ts @@ -1,64 +1,64 @@ -import {test, expect, vi} from 'vitest'; -import {createRequire} from 'module'; -import {RuleConfigSeverity, UserConfig} from '@commitlint/types'; +import { test, expect, vi } from "vitest"; +import { createRequire } from "node:module"; +import { RuleConfigSeverity, UserConfig } from "@commitlint/types"; -import resolveExtends, {ResolveExtendsContext} from './index.js'; +import resolveExtends, { ResolveExtendsContext } from "./index.js"; const require = createRequire(import.meta.url); const id = (id: unknown) => id; -test('returns empty object when called without params', async () => { +test("returns empty object when called without params", async () => { const actual = await resolveExtends(); expect(actual).toEqual({}); }); -test('returns an equivalent object as passed in', async () => { - const expected = {foo: 'bar'}; +test("returns an equivalent object as passed in", async () => { + const expected = { foo: "bar" }; const actual = await resolveExtends(expected); expect(actual).toEqual(expected); }); -test('falls back to global install', async () => { - const resolveGlobal = vi.fn(() => '@commitlint/foo-bar'); +test("falls back to global install", async () => { + const resolveGlobal = vi.fn(() => "@commitlint/foo-bar"); const dynamicImport = vi.fn(() => ({})); - const ctx = {resolveGlobal, dynamicImport} as ResolveExtendsContext; + const ctx = { resolveGlobal, dynamicImport } as ResolveExtendsContext; - resolveExtends({extends: ['@commitlint/foo-bar']}, ctx); - expect(ctx.resolveGlobal).toHaveBeenCalledWith('@commitlint/foo-bar'); + resolveExtends({ extends: ["@commitlint/foo-bar"] }, ctx); + expect(ctx.resolveGlobal).toHaveBeenCalledWith("@commitlint/foo-bar"); }); -test('fails for missing extends', async () => { +test("fails for missing extends", async () => { await expect(() => - resolveExtends({extends: ['@commitlint/foo-bar']}) + resolveExtends({ extends: ["@commitlint/foo-bar"] }), ).rejects.toThrow(/Cannot find module "@commitlint\/foo-bar" from/); }); -test('resolves extends for single config', async () => { - const input = {extends: 'extender-name'}; +test("resolves extends for single config", async () => { + const input = { extends: "extender-name" }; const ctx = { resolve: id, dynamicImport: vi.fn(() => ({})), } as ResolveExtendsContext; await resolveExtends(input, ctx); - expect(ctx.dynamicImport).toHaveBeenCalledWith('extender-name'); + expect(ctx.dynamicImport).toHaveBeenCalledWith("extender-name"); }); -test('uses empty prefix by default', async () => { - const input = {extends: ['extender-name']}; +test("uses empty prefix by default", async () => { + const input = { extends: ["extender-name"] }; const ctx = { resolve: id, dynamicImport: vi.fn(() => ({})), } as ResolveExtendsContext; await resolveExtends(input, ctx); - expect(ctx.dynamicImport).toHaveBeenCalledWith('extender-name'); + expect(ctx.dynamicImport).toHaveBeenCalledWith("extender-name"); }); -test('uses prefix as configured', async () => { - const input = {extends: ['extender-name']}; +test("uses prefix as configured", async () => { + const input = { extends: ["extender-name"] }; const ctx = { resolve: id, dynamicImport: vi.fn(() => ({})), @@ -66,14 +66,14 @@ test('uses prefix as configured', async () => { await resolveExtends(input, { ...ctx, - prefix: 'prefix', + prefix: "prefix", }); - expect(ctx.dynamicImport).toHaveBeenCalledWith('prefix-extender-name'); + expect(ctx.dynamicImport).toHaveBeenCalledWith("prefix-extender-name"); }); -test('ignores prefix for scoped extends', async () => { - const input = {extends: ['@scope/extender-name']}; +test("ignores prefix for scoped extends", async () => { + const input = { extends: ["@scope/extender-name"] }; const ctx = { resolve: id, dynamicImport: vi.fn(() => ({})), @@ -81,14 +81,14 @@ test('ignores prefix for scoped extends', async () => { await resolveExtends(input, { ...ctx, - prefix: 'prefix', + prefix: "prefix", }); - expect(ctx.dynamicImport).toHaveBeenCalledWith('@scope/extender-name'); + expect(ctx.dynamicImport).toHaveBeenCalledWith("@scope/extender-name"); }); -test('adds prefix as suffix for scopes only', async () => { - const input = {extends: ['@scope']}; +test("adds prefix as suffix for scopes only", async () => { + const input = { extends: ["@scope"] }; const ctx = { resolve: id, dynamicImport: vi.fn(() => ({})), @@ -96,14 +96,14 @@ test('adds prefix as suffix for scopes only', async () => { await resolveExtends(input, { ...ctx, - prefix: 'prefix', + prefix: "prefix", }); - expect(ctx.dynamicImport).toHaveBeenCalledWith('@scope/prefix'); + expect(ctx.dynamicImport).toHaveBeenCalledWith("@scope/prefix"); }); -test('ignores prefix for relative extends', async () => { - const input = {extends: ['./extender']}; +test("ignores prefix for relative extends", async () => { + const input = { extends: ["./extender"] }; const ctx = { resolve: id, dynamicImport: vi.fn(() => ({})), @@ -111,15 +111,15 @@ test('ignores prefix for relative extends', async () => { await resolveExtends(input, { ...ctx, - prefix: 'prefix', + prefix: "prefix", }); - expect(ctx.dynamicImport).toHaveBeenCalledWith('./extender'); + expect(ctx.dynamicImport).toHaveBeenCalledWith("./extender"); }); -test('ignores prefix for absolute extends', async () => { - const absolutePath = require.resolve('@commitlint/config-angular'); - const input = {extends: [absolutePath]}; +test("ignores prefix for absolute extends", async () => { + const absolutePath = require.resolve("@commitlint/config-angular"); + const input = { extends: [absolutePath] }; const ctx = { resolve: id, dynamicImport: vi.fn(() => ({})), @@ -127,15 +127,15 @@ test('ignores prefix for absolute extends', async () => { await resolveExtends(input, { ...ctx, - prefix: 'prefix', + prefix: "prefix", }); expect(ctx.dynamicImport).toHaveBeenCalledWith(absolutePath); }); -test('propagates return value of require function', async () => { - const input = {extends: ['extender-name']}; - const propagated = {foo: 'bar'}; +test("propagates return value of require function", async () => { + const input = { extends: ["extender-name"] }; + const propagated = { foo: "bar" }; const ctx = { resolve: id, dynamicImport: vi.fn(() => propagated), @@ -145,15 +145,15 @@ test('propagates return value of require function', async () => { expect(actual).toEqual(expect.objectContaining(propagated)); }); -test('resolves extends recursively', async () => { - const input = {extends: ['extender-name']}; +test("resolves extends recursively", async () => { + const input = { extends: ["extender-name"] }; const dynamicImport = (id: string) => { switch (id) { - case 'extender-name': - return {extends: ['recursive-extender-name']}; - case 'recursive-extender-name': - return {foo: 'bar'}; + case "extender-name": + return { extends: ["recursive-extender-name"] }; + case "recursive-extender-name": + return { foo: "bar" }; default: return {}; } @@ -165,19 +165,19 @@ test('resolves extends recursively', async () => { } as ResolveExtendsContext; await resolveExtends(input, ctx); - expect(ctx.dynamicImport).toHaveBeenCalledWith('extender-name'); - expect(ctx.dynamicImport).toHaveBeenCalledWith('recursive-extender-name'); + expect(ctx.dynamicImport).toHaveBeenCalledWith("extender-name"); + expect(ctx.dynamicImport).toHaveBeenCalledWith("recursive-extender-name"); }); -test('uses prefix key recursively', async () => { - const input = {extends: ['extender-name']}; +test("uses prefix key recursively", async () => { + const input = { extends: ["extender-name"] }; const dynamicImport = (id: string) => { switch (id) { - case 'prefix-extender-name': - return {extends: ['recursive-extender-name']}; - case 'prefix-recursive-extender-name': - return {foo: 'bar'}; + case "prefix-extender-name": + return { extends: ["recursive-extender-name"] }; + case "prefix-recursive-extender-name": + return { foo: "bar" }; default: return {}; } @@ -190,24 +190,24 @@ test('uses prefix key recursively', async () => { await resolveExtends(input, { ...ctx, - prefix: 'prefix', + prefix: "prefix", }); - expect(ctx.dynamicImport).toHaveBeenCalledWith('prefix-extender-name'); + expect(ctx.dynamicImport).toHaveBeenCalledWith("prefix-extender-name"); expect(ctx.dynamicImport).toHaveBeenCalledWith( - 'prefix-recursive-extender-name' + "prefix-recursive-extender-name", ); }); -test('propagates contents recursively', async () => { - const input = {extends: ['extender-name']}; +test("propagates contents recursively", async () => { + const input = { extends: ["extender-name"] }; const dynamicImport = (id: string) => { switch (id) { - case 'extender-name': - return {extends: ['recursive-extender-name'], foo: 'bar'}; - case 'recursive-extender-name': - return {baz: 'bar'}; + case "extender-name": + return { extends: ["recursive-extender-name"], foo: "bar" }; + case "recursive-extender-name": + return { baz: "bar" }; default: return {}; } @@ -221,26 +221,26 @@ test('propagates contents recursively', async () => { const actual = await resolveExtends(input, ctx); const expected = { - extends: ['extender-name'], - foo: 'bar', - baz: 'bar', + extends: ["extender-name"], + foo: "bar", + baz: "bar", }; expect(actual).toEqual(expected); }); -test('propagates contents recursively with overlap', async () => { - const input: UserConfig = {extends: ['extender-name']}; +test("propagates contents recursively with overlap", async () => { + const input: UserConfig = { extends: ["extender-name"] }; const dynamicImport = (id: string): UserConfig => { switch (id) { - case 'extender-name': + case "extender-name": return { - extends: ['recursive-extender-name'], - rules: {rule: [RuleConfigSeverity.Warning, 'always']}, + extends: ["recursive-extender-name"], + rules: { rule: [RuleConfigSeverity.Warning, "always"] }, }; - case 'recursive-extender-name': - return {rules: {rule: [RuleConfigSeverity.Error, 'never', 'four']}}; + case "recursive-extender-name": + return { rules: { rule: [RuleConfigSeverity.Error, "never", "four"] } }; default: return {}; } @@ -254,27 +254,27 @@ test('propagates contents recursively with overlap', async () => { const actual = await resolveExtends(input, ctx); const expected: UserConfig = { - extends: ['extender-name'], + extends: ["extender-name"], rules: { - rule: [RuleConfigSeverity.Warning, 'always'], + rule: [RuleConfigSeverity.Warning, "always"], }, }; expect(actual).toEqual(expected); }); -test('extends rules from left to right with overlap', async () => { - const input: UserConfig = {extends: ['left', 'right']}; +test("extends rules from left to right with overlap", async () => { + const input: UserConfig = { extends: ["left", "right"] }; const dynamicImport = (id: string): UserConfig => { switch (id) { - case 'left': - return {rules: {a: [RuleConfigSeverity.Disabled, 'never', true]}}; - case 'right': + case "left": + return { rules: { a: [RuleConfigSeverity.Disabled, "never", true] } }; + case "right": return { rules: { - a: [RuleConfigSeverity.Disabled, 'never', false], - b: [RuleConfigSeverity.Disabled, 'never', true], + a: [RuleConfigSeverity.Disabled, "never", false], + b: [RuleConfigSeverity.Disabled, "never", true], }, }; default: @@ -290,32 +290,32 @@ test('extends rules from left to right with overlap', async () => { const actual = await resolveExtends(input, ctx); const expected: UserConfig = { - extends: ['left', 'right'], + extends: ["left", "right"], rules: { - a: [RuleConfigSeverity.Disabled, 'never', false], - b: [RuleConfigSeverity.Disabled, 'never', true], + a: [RuleConfigSeverity.Disabled, "never", false], + b: [RuleConfigSeverity.Disabled, "never", true], }, }; expect(actual).toEqual(expected); }); -test('extending contents should take precedence', async () => { - const input = {extends: ['extender-name'], zero: 'root'}; +test("extending contents should take precedence", async () => { + const input = { extends: ["extender-name"], zero: "root" }; const dynamicImport = (id: string) => { switch (id) { - case 'extender-name': - return {extends: ['recursive-extender-name'], zero: id, one: id}; - case 'recursive-extender-name': + case "extender-name": + return { extends: ["recursive-extender-name"], zero: id, one: id }; + case "recursive-extender-name": return { - extends: ['second-recursive-extender-name'], + extends: ["second-recursive-extender-name"], zero: id, one: id, two: id, }; - case 'second-recursive-extender-name': - return {zero: id, one: id, two: id, three: id}; + case "second-recursive-extender-name": + return { zero: id, one: id, two: id, three: id }; default: return {}; } @@ -329,30 +329,30 @@ test('extending contents should take precedence', async () => { const actual = await resolveExtends(input, ctx); const expected = { - extends: ['extender-name'], - zero: 'root', - one: 'extender-name', - two: 'recursive-extender-name', - three: 'second-recursive-extender-name', + extends: ["extender-name"], + zero: "root", + one: "extender-name", + two: "recursive-extender-name", + three: "second-recursive-extender-name", }; expect(actual).toEqual(expected); }); -test('should fall back to conventional-changelog-lint-config prefix', async () => { - const input = {extends: ['extender-name']}; +test("should fall back to conventional-changelog-lint-config prefix", async () => { + const input = { extends: ["extender-name"] }; const resolve = (id: string) => { - if (id === 'conventional-changelog-lint-config-extender-name') { - return 'conventional-changelog-lint-config-extender-name'; + if (id === "conventional-changelog-lint-config-extender-name") { + return "conventional-changelog-lint-config-extender-name"; } throw new Error(`Could not find module "*${id}"`); }; const dynamicImport = (id: string) => { switch (id) { - case 'conventional-changelog-lint-config-extender-name': - return {rules: {fallback: true}}; + case "conventional-changelog-lint-config-extender-name": + return { rules: { fallback: true } }; default: return {}; } @@ -365,31 +365,31 @@ test('should fall back to conventional-changelog-lint-config prefix', async () = const actual = await resolveExtends(input, { ...ctx, - prefix: 'prefix', + prefix: "prefix", }); expect(actual).toEqual({ - extends: ['extender-name'], + extends: ["extender-name"], rules: { fallback: true, }, }); }); -test('plugins should be merged correctly', async () => { - const input = {extends: ['extender-name'], zero: 'root'}; +test("plugins should be merged correctly", async () => { + const input = { extends: ["extender-name"], zero: "root" }; const dynamicImport = (id: string) => { switch (id) { - case 'extender-name': - return {extends: ['recursive-extender-name'], plugins: ['test']}; - case 'recursive-extender-name': + case "extender-name": + return { extends: ["recursive-extender-name"], plugins: ["test"] }; + case "recursive-extender-name": return { - extends: ['second-recursive-extender-name'], - plugins: ['test2'], + extends: ["second-recursive-extender-name"], + plugins: ["test2"], }; - case 'second-recursive-extender-name': - return {plugins: ['test3']}; + case "second-recursive-extender-name": + return { plugins: ["test3"] }; default: return {}; } @@ -403,34 +403,34 @@ test('plugins should be merged correctly', async () => { const actual = await resolveExtends(input, ctx); const expected = { - extends: ['extender-name'], - plugins: ['test3', 'test2', 'test'], - zero: 'root', + extends: ["extender-name"], + plugins: ["test3", "test2", "test"], + zero: "root", }; expect(actual).toEqual(expected); }); -test('rules should be merged correctly', async () => { +test("rules should be merged correctly", async () => { const input: UserConfig = { - extends: ['extender-name'], - rules: {test1: [RuleConfigSeverity.Warning, 'never', 'base']}, + extends: ["extender-name"], + rules: { test1: [RuleConfigSeverity.Warning, "never", "base"] }, }; const dynamicImport = (id: string): UserConfig => { switch (id) { - case 'extender-name': + case "extender-name": return { - extends: ['recursive-extender-name'], - rules: {test2: [RuleConfigSeverity.Error, 'never', id]}, + extends: ["recursive-extender-name"], + rules: { test2: [RuleConfigSeverity.Error, "never", id] }, }; - case 'recursive-extender-name': + case "recursive-extender-name": return { - extends: ['second-recursive-extender-name'], - rules: {test1: [RuleConfigSeverity.Disabled, 'never', id]}, + extends: ["second-recursive-extender-name"], + rules: { test1: [RuleConfigSeverity.Disabled, "never", id] }, }; - case 'second-recursive-extender-name': - return {rules: {test2: [RuleConfigSeverity.Warning, 'never', id]}}; + case "second-recursive-extender-name": + return { rules: { test2: [RuleConfigSeverity.Warning, "never", id] } }; default: return {}; } @@ -444,10 +444,10 @@ test('rules should be merged correctly', async () => { const actual = await resolveExtends(input, ctx); const expected: UserConfig = { - extends: ['extender-name'], + extends: ["extender-name"], rules: { - test1: [RuleConfigSeverity.Warning, 'never', 'base'], - test2: [RuleConfigSeverity.Error, 'never', 'extender-name'], + test1: [RuleConfigSeverity.Warning, "never", "base"], + test2: [RuleConfigSeverity.Error, "never", "extender-name"], }, }; @@ -455,23 +455,23 @@ test('rules should be merged correctly', async () => { }); // https://github.com/conventional-changelog/commitlint/issues/327 -test('parserPreset should resolve correctly in extended configuration', async () => { - const input = {extends: ['extender-name'], zero: 'root'}; +test("parserPreset should resolve correctly in extended configuration", async () => { + const input = { extends: ["extender-name"], zero: "root" }; const dynamicImport = (id: string) => { switch (id) { - case 'extender-name': + case "extender-name": return { - extends: ['recursive-extender-name'], + extends: ["recursive-extender-name"], parserPreset: { parserOpts: { - issuePrefixes: ['#', '!', '&', 'no-references'], + issuePrefixes: ["#", "!", "&", "no-references"], referenceActions: null, }, }, }; - case 'recursive-extender-name': - return {parserPreset: {parserOpts: {issuePrefixes: ['#', '!']}}}; + case "recursive-extender-name": + return { parserPreset: { parserOpts: { issuePrefixes: ["#", "!"] } } }; default: return {}; } @@ -485,35 +485,35 @@ test('parserPreset should resolve correctly in extended configuration', async () const actual = await resolveExtends(input, ctx); const expected = { - extends: ['extender-name'], + extends: ["extender-name"], parserPreset: { parserOpts: { - issuePrefixes: ['#', '!', '&', 'no-references'], + issuePrefixes: ["#", "!", "&", "no-references"], referenceActions: null, }, }, - zero: 'root', + zero: "root", }; expect(actual).toEqual(expected); }); -test('parserPreset should be merged correctly', async () => { - const input = {extends: ['extender-name'], zero: 'root'}; +test("parserPreset should be merged correctly", async () => { + const input = { extends: ["extender-name"], zero: "root" }; const dynamicImport = (id: string) => { switch (id) { - case 'extender-name': + case "extender-name": return { - extends: ['recursive-extender-name'], + extends: ["recursive-extender-name"], parserPreset: { parserOpts: { referenceActions: null, }, }, }; - case 'recursive-extender-name': - return {parserPreset: {parserOpts: {issuePrefixes: ['#', '!']}}}; + case "recursive-extender-name": + return { parserPreset: { parserOpts: { issuePrefixes: ["#", "!"] } } }; default: return {}; } @@ -527,39 +527,39 @@ test('parserPreset should be merged correctly', async () => { const actual = await resolveExtends(input, ctx); const expected = { - extends: ['extender-name'], + extends: ["extender-name"], parserPreset: { parserOpts: { - issuePrefixes: ['#', '!'], + issuePrefixes: ["#", "!"], referenceActions: null, }, }, - zero: 'root', + zero: "root", }; expect(actual).toEqual(expected); }); -test('should correctly merge nested configs', async () => { - const input = {extends: ['extender-1']}; +test("should correctly merge nested configs", async () => { + const input = { extends: ["extender-1"] }; const dynamicImport = (id: string) => { switch (id) { - case 'extender-1': - return {extends: ['extender-3', 'extender-2']}; - case 'extender-2': - return {extends: ['extender-4']}; - case 'extender-3': - return {rules: {test: [RuleConfigSeverity.Warning, 'never', 3]}}; - case 'extender-4': + case "extender-1": + return { extends: ["extender-3", "extender-2"] }; + case "extender-2": + return { extends: ["extender-4"] }; + case "extender-3": + return { rules: { test: [RuleConfigSeverity.Warning, "never", 3] } }; + case "extender-4": return { - extends: ['extender-5', 'extender-6'], - rules: {test: [RuleConfigSeverity.Warning, 'never', 4]}, + extends: ["extender-5", "extender-6"], + rules: { test: [RuleConfigSeverity.Warning, "never", 4] }, }; - case 'extender-5': - return {rules: {test: [RuleConfigSeverity.Warning, 'never', 5]}}; - case 'extender-6': - return {rules: {test: [RuleConfigSeverity.Warning, 'never', 6]}}; + case "extender-5": + return { rules: { test: [RuleConfigSeverity.Warning, "never", 5] } }; + case "extender-6": + return { rules: { test: [RuleConfigSeverity.Warning, "never", 6] } }; default: return {}; } @@ -573,9 +573,9 @@ test('should correctly merge nested configs', async () => { const actual = await resolveExtends(input, ctx); const expected = { - extends: ['extender-1'], + extends: ["extender-1"], rules: { - test: [RuleConfigSeverity.Warning, 'never', 4], + test: [RuleConfigSeverity.Warning, "never", 4], }, }; diff --git a/@commitlint/resolve-extends/src/index.ts b/@commitlint/resolve-extends/src/index.ts index a8519ffa6d..b44bd3956a 100644 --- a/@commitlint/resolve-extends/src/index.ts +++ b/@commitlint/resolve-extends/src/index.ts @@ -1,32 +1,38 @@ -import fs from 'fs'; -import path from 'path'; -import {pathToFileURL, fileURLToPath} from 'url'; - -import globalDirectory from 'global-directory'; -import {moduleResolve} from 'import-meta-resolve'; -import mergeWith from 'lodash.mergewith'; -import resolveFrom_ from 'resolve-from'; -import {validateConfig} from '@commitlint/config-validator'; -import type {ParserPreset, UserConfig} from '@commitlint/types'; +import { createRequire } from "node:module"; +import fs from "node:fs"; +import path from "node:path"; +import { pathToFileURL, fileURLToPath } from "node:url"; + +import globalDirectory from "global-directory"; +import { moduleResolve } from "import-meta-resolve"; +import mergeWith from "lodash.mergewith"; +import resolveFrom_ from "resolve-from"; +import { validateConfig } from "@commitlint/config-validator"; +import type { ParserPreset, UserConfig } from "@commitlint/types"; const dynamicImport = async <T>(id: string): Promise<T> => { + if (id.endsWith(".json")) { + const require = createRequire(import.meta.url); + return require(id); + } + const imported = await import( path.isAbsolute(id) ? pathToFileURL(id).toString() : id ); - return ('default' in imported && imported.default) || imported; + return ("default" in imported && imported.default) || imported; }; const pathSuffixes = [ - '', - '.js', - '.json', + "", + ".js", + ".json", `${path.sep}index.js`, `${path.sep}index.json`, ]; -const specifierSuffixes = ['', '.js', '.json', '/index.js', '/index.json']; +const specifierSuffixes = ["", ".js", ".json", "/index.js", "/index.json"]; -const conditions = new Set(['import', 'node']); +const conditions = new Set(["import", "node"]); /** * @see moduleResolve @@ -46,9 +52,9 @@ export const resolveFrom = (lookup: string, parent?: string): string => { const base = pathToFileURL( parent ? fs.statSync(parent).isDirectory() - ? path.join(parent, 'noop.js') + ? path.join(parent, "noop.js") : parent - : import.meta.url + : import.meta.url, ); for (const suffix of specifierSuffixes) { @@ -78,14 +84,14 @@ export const resolveFrom = (lookup: string, parent?: string): string => { * @returns path and parserOpts function retrieved from `resolvedParserPreset` */ export const loadParserPreset = async ( - resolvedParserPreset: string -): Promise<Pick<ParserPreset, 'path' | 'parserOpts'>> => { + resolvedParserPreset: string, +): Promise<Pick<ParserPreset, "path" | "parserOpts">> => { const finalParserOpts = await dynamicImport(resolvedParserPreset); const relativeParserPath = path.relative(process.cwd(), resolvedParserPreset); return { - path: `./${relativeParserPath}`.split(path.sep).join('/'), + path: `./${relativeParserPath}`.split(path.sep).join("/"), parserOpts: finalParserOpts, }; }; @@ -94,22 +100,22 @@ export interface ResolveExtendsContext { cwd?: string; parserPreset?: string | ParserPreset; prefix?: string; - resolve?(id: string, ctx?: {prefix?: string; cwd?: string}): string; + resolve?(id: string, ctx?: { prefix?: string; cwd?: string }): string; resolveGlobal?: (id: string) => string; dynamicImport?<T>(id: string): T | Promise<T>; } export default async function resolveExtends( config: UserConfig = {}, - context: ResolveExtendsContext = {} + context: ResolveExtendsContext = {}, ): Promise<UserConfig> { - const {extends: e} = config; + const { extends: e } = config; const extended = await loadExtends(config, context); extended.push(config); return extended.reduce( - (r, {extends: _, ...c}) => + (r, { extends: _, ...c }) => mergeWith(r, c, (objValue, srcValue, key) => { - if (key === 'plugins') { + if (key === "plugins") { if (Array.isArray(objValue)) { return objValue.concat(srcValue); } @@ -117,15 +123,15 @@ export default async function resolveExtends( return srcValue; } }), - e ? {extends: e} : {} + e ? { extends: e } : {}, ); } async function loadExtends( config: UserConfig = {}, - context: ResolveExtendsContext = {} + context: ResolveExtendsContext = {}, ): Promise<UserConfig[]> { - const {extends: e} = config; + const { extends: e } = config; const ext = e ? (Array.isArray(e) ? e : [e]) : []; return await ext.reduce(async (configs, raw) => { @@ -135,13 +141,13 @@ async function loadExtends( parserPreset?: string; }>(resolved); const cwd = path.dirname(resolved); - const ctx = {...context, cwd}; + const ctx = { ...context, cwd }; // Resolve parser preset if none was present before if ( !context.parserPreset && - typeof c === 'object' && - typeof c.parserPreset === 'string' + typeof c === "object" && + typeof c.parserPreset === "string" ) { const resolvedParserPreset = resolveFrom(c.parserPreset, cwd); @@ -160,22 +166,22 @@ async function loadExtends( }, Promise.resolve<UserConfig[]>([])); } -function getId(raw: string = '', prefix: string = ''): string { +function getId(raw: string = "", prefix: string = ""): string { const first = raw.charAt(0); - const scoped = first === '@'; - const relative = first === '.'; + const scoped = first === "@"; + const relative = first === "."; const absolute = path.isAbsolute(raw); if (scoped) { - return raw.includes('/') ? raw : [raw, prefix].filter(String).join('/'); + return raw.includes("/") ? raw : [raw, prefix].filter(String).join("/"); } - return relative || absolute ? raw : [prefix, raw].filter(String).join('-'); + return relative || absolute ? raw : [prefix, raw].filter(String).join("-"); } function resolveConfig( raw: string, - context: ResolveExtendsContext = {} + context: ResolveExtendsContext = {}, ): string { const resolve = context.resolve || resolveId; const id = getId(raw, context.prefix); @@ -184,10 +190,10 @@ function resolveConfig( try { resolved = resolve(id, context); } catch (err) { - const legacy = getId(raw, 'conventional-changelog-lint-config'); + const legacy = getId(raw, "conventional-changelog-lint-config"); resolved = resolve(legacy, context); console.warn( - `Resolving ${raw} to legacy config ${legacy}. To silence this warning raise an issue at 'npm repo ${legacy}' to rename to ${id}.` + `Resolving ${raw} to legacy config ${legacy}. To silence this warning raise an issue at 'npm repo ${legacy}' to rename to ${id}.`, ); } @@ -196,29 +202,29 @@ function resolveConfig( function resolveId( specifier: string, - context: ResolveExtendsContext = {} + context: ResolveExtendsContext = {}, ): string { const cwd = context.cwd || process.cwd(); const localPath = resolveFromSilent(specifier, cwd); - if (typeof localPath === 'string') { + if (typeof localPath === "string") { return localPath; } const resolveGlobal = context.resolveGlobal || resolveGlobalSilent; const globalPath = resolveGlobal(specifier); - if (typeof globalPath === 'string') { + if (typeof globalPath === "string") { return globalPath; } const err = new Error(`Cannot find module "${specifier}" from "${cwd}"`); - throw Object.assign(err, {code: 'MODULE_NOT_FOUND'}); + throw Object.assign(err, { code: "MODULE_NOT_FOUND" }); } export function resolveFromSilent( specifier: string, - parent: string + parent: string, ): string | void { try { return resolveFrom(specifier, parent); diff --git a/@commitlint/resolve-extends/tsconfig.json b/@commitlint/resolve-extends/tsconfig.json index d424776e00..ebcddb79e9 100644 --- a/@commitlint/resolve-extends/tsconfig.json +++ b/@commitlint/resolve-extends/tsconfig.json @@ -8,5 +8,5 @@ }, "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], - "references": [{"path": "../types"}, {"path": "../config-validator"}] + "references": [{ "path": "../types" }, { "path": "../config-validator" }] } diff --git a/@commitlint/rules/CHANGELOG.md b/@commitlint/rules/CHANGELOG.md index 3e9379d64b..00e337a210 100644 --- a/@commitlint/rules/CHANGELOG.md +++ b/@commitlint/rules/CHANGELOG.md @@ -3,6 +3,43 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + + +* feat(rules)!: make body-max-line-length ignore lines with URLs (#4486) ([2f37a88](https://github.com/conventional-changelog/commitlint/commit/2f37a886be4b07bcd8e1126cc6a13256e7b6cc37)), closes [#4486](https://github.com/conventional-changelog/commitlint/issues/4486) + + +### BREAKING CHANGES + +* when lines contain URLs exceeding the maximum +line length `body-max-line-length` will be ignored + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + + +### Performance Improvements + +* **rules:** optimize header-trim ([#4363](https://github.com/conventional-changelog/commitlint/issues/4363)) ([b7e404b](https://github.com/conventional-changelog/commitlint/commit/b7e404bc036dbd3cbdffa38e85c833d10e52d68b)) + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19) diff --git a/@commitlint/rules/package.json b/@commitlint/rules/package.json index d280ba60b2..f2d15086ce 100644 --- a/@commitlint/rules/package.json +++ b/@commitlint/rules/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/rules", "type": "module", - "version": "19.6.0", + "version": "20.0.0", "description": "Lint your commit messages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,17 +36,17 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/parse": "^19.5.0", - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0", + "@commitlint/parse": "^20.0.0", + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0", "conventional-changelog-angular": "^7.0.0", "glob": "^10.3.10" }, "dependencies": { - "@commitlint/ensure": "^19.5.0", - "@commitlint/message": "^19.5.0", - "@commitlint/to-lines": "^19.5.0", - "@commitlint/types": "^19.5.0" + "@commitlint/ensure": "^20.0.0", + "@commitlint/message": "^20.0.0", + "@commitlint/to-lines": "^20.0.0", + "@commitlint/types": "^20.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/rules/src/body-case.test.ts b/@commitlint/rules/src/body-case.test.ts index 4bff32d233..9ff7b5dc23 100644 --- a/@commitlint/rules/src/body-case.test.ts +++ b/@commitlint/rules/src/body-case.test.ts @@ -1,12 +1,12 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {bodyCase} from './body-case.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { bodyCase } from "./body-case.js"; const messages = { - empty: 'test: subject', - lowercase: 'test: subject\nbody', - mixedcase: 'test: subject\nBody', - uppercase: 'test: subject\nBODY', + empty: "test: subject", + lowercase: "test: subject\nbody", + mixedcase: "test: subject\nBody", + uppercase: "test: subject\nBODY", }; const parsed = { @@ -17,73 +17,73 @@ const parsed = { }; test('with empty body should succeed for "never lowercase"', async () => { - const [actual] = bodyCase(await parsed.empty, 'never', 'lowercase'); + const [actual] = bodyCase(await parsed.empty, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty body should succeed for "always lowercase"', async () => { - const [actual] = bodyCase(await parsed.empty, 'always', 'lowercase'); + const [actual] = bodyCase(await parsed.empty, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty body should succeed for "never uppercase"', async () => { - const [actual] = bodyCase(await parsed.empty, 'never', 'uppercase'); + const [actual] = bodyCase(await parsed.empty, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty body should succeed for "always uppercase"', async () => { - const [actual] = bodyCase(await parsed.empty, 'always', 'uppercase'); + const [actual] = bodyCase(await parsed.empty, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with lowercase body should fail for "never lowercase"', async () => { - const [actual] = bodyCase(await parsed.lowercase, 'never', 'lowercase'); + const [actual] = bodyCase(await parsed.lowercase, "never", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with lowercase body should succeed for "always lowercase"', async () => { - const [actual] = bodyCase(await parsed.lowercase, 'always', 'lowercase'); + const [actual] = bodyCase(await parsed.lowercase, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase body should succeed for "never lowercase"', async () => { - const [actual] = bodyCase(await parsed.mixedcase, 'never', 'lowercase'); + const [actual] = bodyCase(await parsed.mixedcase, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase body should fail for "always lowercase"', async () => { - const [actual] = bodyCase(await parsed.mixedcase, 'always', 'lowercase'); + const [actual] = bodyCase(await parsed.mixedcase, "always", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase body should succeed for "never uppercase"', async () => { - const [actual] = bodyCase(await parsed.mixedcase, 'never', 'uppercase'); + const [actual] = bodyCase(await parsed.mixedcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase body should fail for "always uppercase"', async () => { - const [actual] = bodyCase(await parsed.mixedcase, 'always', 'uppercase'); + const [actual] = bodyCase(await parsed.mixedcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with uppercase body should fail for "never uppercase"', async () => { - const [actual] = bodyCase(await parsed.uppercase, 'never', 'uppercase'); + const [actual] = bodyCase(await parsed.uppercase, "never", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with lowercase body should succeed for "always uppercase"', async () => { - const [actual] = bodyCase(await parsed.uppercase, 'always', 'uppercase'); + const [actual] = bodyCase(await parsed.uppercase, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/body-case.ts b/@commitlint/rules/src/body-case.ts index 6c0291c22d..3870fb6238 100644 --- a/@commitlint/rules/src/body-case.ts +++ b/@commitlint/rules/src/body-case.ts @@ -1,24 +1,24 @@ -import {case as ensureCase} from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {TargetCaseType, SyncRule} from '@commitlint/types'; +import { case as ensureCase } from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { TargetCaseType, SyncRule } from "@commitlint/types"; -const negated = (when?: string) => when === 'never'; +const negated = (when?: string) => when === "never"; export const bodyCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( parsed, - when = 'always', - value = [] + when = "always", + value = [], ) => { - const {body} = parsed; + const { body } = parsed; if (!body) { return [true]; } const checks = (Array.isArray(value) ? value : [value]).map((check) => { - if (typeof check === 'string') { + if (typeof check === "string") { return { - when: 'always', + when: "always", case: check, }; } @@ -30,7 +30,7 @@ export const bodyCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( return negated(check.when) ? !r : r; }); - const list = checks.map((c) => c.case).join(', '); + const list = checks.map((c) => c.case).join(", "); return [ negated(when) ? !result : result, diff --git a/@commitlint/rules/src/body-empty.test.ts b/@commitlint/rules/src/body-empty.test.ts index 1150957207..fb1f82cbe9 100644 --- a/@commitlint/rules/src/body-empty.test.ts +++ b/@commitlint/rules/src/body-empty.test.ts @@ -1,10 +1,10 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {bodyEmpty} from './body-empty.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { bodyEmpty } from "./body-empty.js"; const messages = { - empty: 'test: subject', - filled: 'test: subject\nbody', + empty: "test: subject", + filled: "test: subject\nbody", }; const parsed = { @@ -12,38 +12,38 @@ const parsed = { filled: parse(messages.filled), }; -test('with empty body should succeed for empty keyword', async () => { +test("with empty body should succeed for empty keyword", async () => { const [actual] = bodyEmpty(await parsed.empty); const expected = true; expect(actual).toEqual(expected); }); test('with empty body should fail for "never"', async () => { - const [actual] = bodyEmpty(await parsed.empty, 'never'); + const [actual] = bodyEmpty(await parsed.empty, "never"); const expected = false; expect(actual).toEqual(expected); }); test('with empty body should succeed for "always"', async () => { - const [actual] = bodyEmpty(await parsed.empty, 'always'); + const [actual] = bodyEmpty(await parsed.empty, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('with body should fail for empty keyword', async () => { +test("with body should fail for empty keyword", async () => { const [actual] = bodyEmpty(await parsed.filled); const expected = false; expect(actual).toEqual(expected); }); test('with body should succeed for "never"', async () => { - const [actual] = bodyEmpty(await parsed.filled, 'never'); + const [actual] = bodyEmpty(await parsed.filled, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with body should fail for "always"', async () => { - const [actual] = bodyEmpty(await parsed.filled, 'always'); + const [actual] = bodyEmpty(await parsed.filled, "always"); const expected = false; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/body-empty.ts b/@commitlint/rules/src/body-empty.ts index 76ddc72ae6..520f251acb 100644 --- a/@commitlint/rules/src/body-empty.ts +++ b/@commitlint/rules/src/body-empty.ts @@ -1,13 +1,13 @@ -import * as ensure from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import * as ensure from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; -export const bodyEmpty: SyncRule = (parsed, when = 'always') => { - const negated = when === 'never'; - const notEmpty = ensure.notEmpty(parsed.body || ''); +export const bodyEmpty: SyncRule = (parsed, when = "always") => { + const negated = when === "never"; + const notEmpty = ensure.notEmpty(parsed.body || ""); return [ negated ? notEmpty : !notEmpty, - message(['body', negated ? 'may not' : 'must', 'be empty']), + message(["body", negated ? "may not" : "must", "be empty"]), ]; }; diff --git a/@commitlint/rules/src/body-full-stop.test.ts b/@commitlint/rules/src/body-full-stop.test.ts index d84d3629d1..0c08f7b8c1 100644 --- a/@commitlint/rules/src/body-full-stop.test.ts +++ b/@commitlint/rules/src/body-full-stop.test.ts @@ -1,9 +1,9 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {bodyFullStop} from './body-full-stop.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { bodyFullStop } from "./body-full-stop.js"; const messages = { - empty: 'test:\n', + empty: "test:\n", with: `test: subject\n\nbody.`, without: `test: subject\n\nbody`, }; @@ -15,37 +15,37 @@ const parsed = { }; test('empty against "always" should succeed', async () => { - const [actual] = bodyFullStop(await parsed.empty, 'always', '.'); + const [actual] = bodyFullStop(await parsed.empty, "always", "."); const expected = true; expect(actual).toEqual(expected); }); test('empty against "never ." should succeed', async () => { - const [actual] = bodyFullStop(await parsed.empty, 'never', '.'); + const [actual] = bodyFullStop(await parsed.empty, "never", "."); const expected = true; expect(actual).toEqual(expected); }); test('with against "always ." should succeed', async () => { - const [actual] = bodyFullStop(await parsed.with, 'always', '.'); + const [actual] = bodyFullStop(await parsed.with, "always", "."); const expected = true; expect(actual).toEqual(expected); }); test('with against "never ." should fail', async () => { - const [actual] = bodyFullStop(await parsed.with, 'never', '.'); + const [actual] = bodyFullStop(await parsed.with, "never", "."); const expected = false; expect(actual).toEqual(expected); }); test('without against "always ." should fail', async () => { - const [actual] = bodyFullStop(await parsed.without, 'always', '.'); + const [actual] = bodyFullStop(await parsed.without, "always", "."); const expected = false; expect(actual).toEqual(expected); }); test('without against "never ." should succeed', async () => { - const [actual] = bodyFullStop(await parsed.without, 'never', '.'); + const [actual] = bodyFullStop(await parsed.without, "never", "."); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/body-full-stop.ts b/@commitlint/rules/src/body-full-stop.ts index 61d79ec7c8..845b0f5790 100644 --- a/@commitlint/rules/src/body-full-stop.ts +++ b/@commitlint/rules/src/body-full-stop.ts @@ -1,10 +1,10 @@ -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; export const bodyFullStop: SyncRule<string> = ( parsed, - when = 'always', - value = '.' + when = "always", + value = ".", ) => { const input = parsed.body; @@ -12,11 +12,11 @@ export const bodyFullStop: SyncRule<string> = ( return [true]; } - const negated = when === 'never'; + const negated = when === "never"; const hasStop = input[input.length - 1] === value; return [ negated ? !hasStop : hasStop, - message(['body', negated ? 'may not' : 'must', 'end with full stop']), + message(["body", negated ? "may not" : "must", "end with full stop"]), ]; }; diff --git a/@commitlint/rules/src/body-leading-blank.test.ts b/@commitlint/rules/src/body-leading-blank.test.ts index 9c63a34d23..a30e243afa 100644 --- a/@commitlint/rules/src/body-leading-blank.test.ts +++ b/@commitlint/rules/src/body-leading-blank.test.ts @@ -1,11 +1,11 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {bodyLeadingBlank} from './body-leading-blank.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { bodyLeadingBlank } from "./body-leading-blank.js"; const messages = { - simple: 'test: subject', - without: 'test: subject\nbody', - with: 'test: subject\n\nbody', + simple: "test: subject", + without: "test: subject\nbody", + with: "test: subject\n\nbody", }; const parsed = { @@ -14,56 +14,56 @@ const parsed = { with: parse(messages.with), }; -test('with simple message should succeed for empty keyword', async () => { +test("with simple message should succeed for empty keyword", async () => { const [actual] = bodyLeadingBlank(await parsed.simple); const expected = true; expect(actual).toEqual(expected); }); test('with simple message should succeed for "never"', async () => { - const [actual] = bodyLeadingBlank(await parsed.simple, 'never'); + const [actual] = bodyLeadingBlank(await parsed.simple, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with simple message should succeed for "always"', async () => { - const [actual] = bodyLeadingBlank(await parsed.simple, 'always'); + const [actual] = bodyLeadingBlank(await parsed.simple, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('without blank line before body should fail for empty keyword', async () => { +test("without blank line before body should fail for empty keyword", async () => { const [actual] = bodyLeadingBlank(await parsed.without); const expected = false; expect(actual).toEqual(expected); }); test('without blank line before body should succeed for "never"', async () => { - const [actual] = bodyLeadingBlank(await parsed.without, 'never'); + const [actual] = bodyLeadingBlank(await parsed.without, "never"); const expected = true; expect(actual).toEqual(expected); }); test('without blank line before body should fail for "always"', async () => { - const [actual] = bodyLeadingBlank(await parsed.without, 'always'); + const [actual] = bodyLeadingBlank(await parsed.without, "always"); const expected = false; expect(actual).toEqual(expected); }); -test('with blank line before body should succeed for empty keyword', async () => { +test("with blank line before body should succeed for empty keyword", async () => { const [actual] = bodyLeadingBlank(await parsed.with); const expected = true; expect(actual).toEqual(expected); }); test('with blank line before body should fail for "never"', async () => { - const [actual] = bodyLeadingBlank(await parsed.with, 'never'); + const [actual] = bodyLeadingBlank(await parsed.with, "never"); const expected = false; expect(actual).toEqual(expected); }); test('with blank line before body should succeed for "always"', async () => { - const [actual] = bodyLeadingBlank(await parsed.with, 'always'); + const [actual] = bodyLeadingBlank(await parsed.with, "always"); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/body-leading-blank.ts b/@commitlint/rules/src/body-leading-blank.ts index 36a4ce7d5e..ae55973341 100644 --- a/@commitlint/rules/src/body-leading-blank.ts +++ b/@commitlint/rules/src/body-leading-blank.ts @@ -1,6 +1,6 @@ -import toLines from '@commitlint/to-lines'; -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import toLines from "@commitlint/to-lines"; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; export const bodyLeadingBlank: SyncRule = (parsed, when) => { // Flunk if no body is found @@ -8,14 +8,14 @@ export const bodyLeadingBlank: SyncRule = (parsed, when) => { return [true]; } - const negated = when === 'never'; + const negated = when === "never"; const [leading] = toLines(parsed.raw).slice(1); // Check if the first line of body is empty - const succeeds = leading === ''; + const succeeds = leading === ""; return [ negated ? !succeeds : succeeds, - message(['body', negated ? 'may not' : 'must', 'have leading blank line']), + message(["body", negated ? "may not" : "must", "have leading blank line"]), ]; }; diff --git a/@commitlint/rules/src/body-max-length.test.ts b/@commitlint/rules/src/body-max-length.test.ts index fb22498d64..0b85c58b0f 100644 --- a/@commitlint/rules/src/body-max-length.test.ts +++ b/@commitlint/rules/src/body-max-length.test.ts @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {bodyMaxLength} from './body-max-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { bodyMaxLength } from "./body-max-length.js"; -const short = 'a'; -const long = 'ab'; +const short = "a"; +const long = "ab"; const value = short.length; const messages = { - empty: 'test: subject', + empty: "test: subject", short: `test: subject\n${short}`, long: `test: subject\n${long}`, }; @@ -19,19 +19,19 @@ const parsed = { long: parse(messages.long), }; -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = bodyMaxLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should succeed', async () => { +test("with short should succeed", async () => { const [actual] = bodyMaxLength(await parsed.short, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with long should fail', async () => { +test("with long should fail", async () => { const [actual] = bodyMaxLength(await parsed.long, undefined, value); const expected = false; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/body-max-length.ts b/@commitlint/rules/src/body-max-length.ts index 9121129056..2b0ca2f1b2 100644 --- a/@commitlint/rules/src/body-max-length.ts +++ b/@commitlint/rules/src/body-max-length.ts @@ -1,10 +1,10 @@ -import {maxLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { maxLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const bodyMaxLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.body; diff --git a/@commitlint/rules/src/body-max-line-length.test.ts b/@commitlint/rules/src/body-max-line-length.test.ts index d2a4628415..7a599b30a3 100644 --- a/@commitlint/rules/src/body-max-line-length.test.ts +++ b/@commitlint/rules/src/body-max-line-length.test.ts @@ -1,52 +1,98 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {bodyMaxLineLength} from './body-max-line-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import type { Commit } from "conventional-commits-parser"; +import { bodyMaxLineLength } from "./body-max-line-length.js"; -const short = 'a'; -const long = 'ab'; +const short = "a"; +const long = "ab"; +const url = "https://example.com/URL/with/a/very/long/path"; const value = short.length; const messages = { - empty: 'test: subject', + empty: "test: subject", short: `test: subject\n${short}`, long: `test: subject\n${long}`, shortMultipleLines: `test:subject\n${short}\n${short}\n${short}`, longMultipleLines: `test:subject\n${short}\n${long}\n${short}`, -}; + urlStandalone: `test:subject\n${short}\n${url}\n${short}`, + urlMarkdownLinkInline: `test:subject + +This is a [link](${url}).`, + urlMarkdownLinkInList: `test:subject + +Link in a list: + +- ${url}`, + urlMarkdownLinkInFooter: `test:subject -const parsed = { - empty: parse(messages.empty), - short: parse(messages.short), - long: parse(messages.long), +Finally, [link][] via footer. + +[link]: ${url}`, }; -test('with empty should succeed', async () => { +const parsed = Object.entries(messages).reduce( + (_parsed, [key, message]) => + Object.assign(_parsed, { + [key]: parse(message), + }), + {} as Record<keyof typeof messages, Promise<Commit>>, +); + +test("with empty should succeed", async () => { const [actual] = bodyMaxLineLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should succeed', async () => { +test("with short should succeed", async () => { const [actual] = bodyMaxLineLength(await parsed.short, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with long should fail', async () => { +test("with long should fail", async () => { const [actual] = bodyMaxLineLength(await parsed.long, undefined, value); const expected = false; expect(actual).toEqual(expected); }); -test('with short with multiple lines should succeed', async () => { - const [actual] = bodyMaxLineLength(await parsed.short, undefined, value); +test("with short with multiple lines should succeed", async () => { + const [actual] = bodyMaxLineLength( + await parsed.shortMultipleLines, + undefined, + value, + ); const expected = true; expect(actual).toEqual(expected); }); -test('with long with multiple lines should fail', async () => { - const [actual] = bodyMaxLineLength(await parsed.long, undefined, value); +test("with long with multiple lines should fail", async () => { + const [actual] = bodyMaxLineLength( + await parsed.longMultipleLines, + undefined, + value, + ); const expected = false; expect(actual).toEqual(expected); }); + +test("with multiple lines and standalone URL should succeed", async () => { + const [actual] = bodyMaxLineLength( + await parsed.urlStandalone, + undefined, + value, + ); + const expected = true; + expect(actual).toEqual(expected); +}); + +test("with multiple lines and URL in inline Markdown link should succeed", async () => { + const [actual] = bodyMaxLineLength( + await parsed.urlMarkdownLinkInline, + undefined, + 30, + ); + const expected = true; + expect(actual).toEqual(expected); +}); diff --git a/@commitlint/rules/src/body-max-line-length.ts b/@commitlint/rules/src/body-max-line-length.ts index 5e937ef7e9..5049b09eec 100644 --- a/@commitlint/rules/src/body-max-line-length.ts +++ b/@commitlint/rules/src/body-max-line-length.ts @@ -1,10 +1,10 @@ -import {maxLineLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { maxLineLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const bodyMaxLineLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.body; diff --git a/@commitlint/rules/src/body-min-length.test.ts b/@commitlint/rules/src/body-min-length.test.ts index 33d8e57475..bc9413c14e 100644 --- a/@commitlint/rules/src/body-min-length.test.ts +++ b/@commitlint/rules/src/body-min-length.test.ts @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {bodyMinLength} from './body-min-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { bodyMinLength } from "./body-min-length.js"; -const short = 'a'; -const long = 'ab'; +const short = "a"; +const long = "ab"; const value = long.length; const messages = { - simple: 'test: subject', + simple: "test: subject", short: `test: subject\n${short}`, long: `test: subject\n${long}`, }; @@ -19,19 +19,19 @@ const parsed = { long: parse(messages.long), }; -test('with simple should succeed', async () => { +test("with simple should succeed", async () => { const [actual] = bodyMinLength(await parsed.simple, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should fail', async () => { +test("with short should fail", async () => { const [actual] = bodyMinLength(await parsed.short, undefined, value); const expected = false; expect(actual).toEqual(expected); }); -test('with long should succeed', async () => { +test("with long should succeed", async () => { const [actual] = bodyMinLength(await parsed.long, undefined, value); const expected = true; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/body-min-length.ts b/@commitlint/rules/src/body-min-length.ts index f769e1a4a9..958e39af0c 100644 --- a/@commitlint/rules/src/body-min-length.ts +++ b/@commitlint/rules/src/body-min-length.ts @@ -1,10 +1,10 @@ -import {minLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { minLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const bodyMinLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { if (!parsed.body) { return [true]; diff --git a/@commitlint/rules/src/breaking-change-exclamation-mark.test.ts b/@commitlint/rules/src/breaking-change-exclamation-mark.test.ts new file mode 100644 index 0000000000..7d7b9c5377 --- /dev/null +++ b/@commitlint/rules/src/breaking-change-exclamation-mark.test.ts @@ -0,0 +1,85 @@ +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { breakingChangeExclamationMark } from "./breaking-change-exclamation-mark.js"; + +const noHeader = "commit message"; +const plainHeader = "type: subject"; +const breakingHeader = "type!: subject"; +const noFooter = ""; +const plainFooter = "Some-Other-Trailer: content"; +const breakingFooter = "BREAKING CHANGE: reason"; + +// These are equivalence partitions. +const messages = { + noHeaderNoFooter: `${noHeader}\n\n${noFooter}`, + noHeaderPlainFooter: `${noHeader}\n\n${plainFooter}`, + noHeaderBreakingFooter: `${noHeader}\n\n${breakingFooter}`, + plainHeaderPlainFooter: `${plainHeader}\n\n${plainFooter}`, + plainHeaderBreakingFooter: `${plainHeader}\n\n${breakingFooter}`, + breakingHeaderPlainFooter: `${breakingHeader}\n\n${plainFooter}`, + breakingHeaderBreakingFooter: `${breakingHeader}\n\n${breakingFooter}`, +}; + +const parsed = { + noHeaderNoFooter: parse(messages.noHeaderNoFooter), + noHeaderPlainFooter: parse(messages.noHeaderPlainFooter), + noHeaderBreakingFooter: parse(messages.noHeaderBreakingFooter), + plainHeaderPlainFooter: parse(messages.plainHeaderPlainFooter), + plainHeaderBreakingFooter: parse(messages.plainHeaderBreakingFooter), + breakingHeaderPlainFooter: parse(messages.breakingHeaderPlainFooter), + breakingHeaderBreakingFooter: parse(messages.breakingHeaderBreakingFooter), +}; + +test("with noHeaderNoFooter should succeed", async () => { + const [actual] = breakingChangeExclamationMark(await parsed.noHeaderNoFooter); + const expected = true; + expect(actual).toEqual(expected); +}); + +test("with noHeaderPlainFooter should succeed", async () => { + const [actual] = breakingChangeExclamationMark( + await parsed.noHeaderPlainFooter, + ); + const expected = true; + expect(actual).toEqual(expected); +}); + +test("with noHeaderBreakingFooter should fail", async () => { + const [actual] = breakingChangeExclamationMark( + await parsed.noHeaderBreakingFooter, + ); + const expected = false; + expect(actual).toEqual(expected); +}); + +test("with plainHeaderPlainFooter should succeed", async () => { + const [actual] = breakingChangeExclamationMark( + await parsed.plainHeaderPlainFooter, + ); + const expected = true; + expect(actual).toEqual(expected); +}); + +test("with plainHeaderBreakingFooter should fail", async () => { + const [actual] = breakingChangeExclamationMark( + await parsed.plainHeaderBreakingFooter, + ); + const expected = false; + expect(actual).toEqual(expected); +}); + +test("with breakingHeaderPlainFooter should fail", async () => { + const [actual] = breakingChangeExclamationMark( + await parsed.breakingHeaderPlainFooter, + ); + const expected = false; + expect(actual).toEqual(expected); +}); + +test("with breakingHeaderBreakingFooter should succeed", async () => { + const [actual] = breakingChangeExclamationMark( + await parsed.breakingHeaderBreakingFooter, + ); + const expected = true; + expect(actual).toEqual(expected); +}); diff --git a/@commitlint/rules/src/breaking-change-exclamation-mark.ts b/@commitlint/rules/src/breaking-change-exclamation-mark.ts new file mode 100644 index 0000000000..131d5fac3b --- /dev/null +++ b/@commitlint/rules/src/breaking-change-exclamation-mark.ts @@ -0,0 +1,36 @@ +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; + +export const breakingChangeExclamationMark: SyncRule = ( + parsed, + when = "always", +) => { + const header = parsed.header; + const footer = parsed.footer; + + // It is the correct behavior to return true only when both the header and footer are empty, + // but still run the usual checks if one or neither are empty. + // The reasoning is that if one is empty and the other contains a breaking change marker, + // then the check fails as it is not possible for the empty one to indicate a breaking change. + if (!header && !footer) { + return [true]; + } + + const hasExclamationMark = + !!header && /^(\w*)(?:\((.*)\))?!: (.*)$/.test(header); + const hasBreakingChange = !!footer && /^BREAKING[ -]CHANGE:/m.test(footer); + + const negated = when === "never"; + const check = hasExclamationMark === hasBreakingChange; + + return [ + negated ? !check : check, + message([ + "breaking changes", + negated ? "must not" : "must", + "have both an exclamation mark in the header", + "and BREAKING CHANGE in the footer", + "to identify a breaking change", + ]), + ]; +}; diff --git a/@commitlint/rules/src/footer-empty.test.ts b/@commitlint/rules/src/footer-empty.test.ts index bfe001c7b2..da98f6541b 100644 --- a/@commitlint/rules/src/footer-empty.test.ts +++ b/@commitlint/rules/src/footer-empty.test.ts @@ -1,11 +1,11 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {footerEmpty} from './footer-empty.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { footerEmpty } from "./footer-empty.js"; const messages = { - simple: 'test: subject', - empty: 'test: subject\nbody', - filled: 'test: subject\nBREAKING CHANGE: something important', + simple: "test: subject", + empty: "test: subject\nbody", + filled: "test: subject\nBREAKING CHANGE: something important", }; const parsed = { @@ -14,56 +14,56 @@ const parsed = { filled: parse(messages.filled), }; -test('with simple message should succeed for empty keyword', async () => { +test("with simple message should succeed for empty keyword", async () => { const [actual] = footerEmpty(await parsed.simple); const expected = true; expect(actual).toEqual(expected); }); test('with simple message should fail for "never"', async () => { - const [actual] = footerEmpty(await parsed.simple, 'never'); + const [actual] = footerEmpty(await parsed.simple, "never"); const expected = false; expect(actual).toEqual(expected); }); test('with simple message should succeed for "always"', async () => { - const [actual] = footerEmpty(await parsed.simple, 'always'); + const [actual] = footerEmpty(await parsed.simple, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('with empty footer should succeed for empty keyword', async () => { +test("with empty footer should succeed for empty keyword", async () => { const [actual] = footerEmpty(await parsed.empty); const expected = true; expect(actual).toEqual(expected); }); test('with empty footer should fail for "never"', async () => { - const [actual] = footerEmpty(await parsed.empty, 'never'); + const [actual] = footerEmpty(await parsed.empty, "never"); const expected = false; expect(actual).toEqual(expected); }); test('with empty footer should succeed for "always"', async () => { - const [actual] = footerEmpty(await parsed.empty, 'always'); + const [actual] = footerEmpty(await parsed.empty, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('with footer should fail for empty keyword', async () => { +test("with footer should fail for empty keyword", async () => { const [actual] = footerEmpty(await parsed.filled); const expected = false; expect(actual).toEqual(expected); }); test('with footer should succeed for "never"', async () => { - const [actual] = footerEmpty(await parsed.filled, 'never'); + const [actual] = footerEmpty(await parsed.filled, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with footer should fail for "always"', async () => { - const [actual] = footerEmpty(await parsed.filled, 'always'); + const [actual] = footerEmpty(await parsed.filled, "always"); const expected = false; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/footer-empty.ts b/@commitlint/rules/src/footer-empty.ts index 9a3d8a81c1..c007f025c8 100644 --- a/@commitlint/rules/src/footer-empty.ts +++ b/@commitlint/rules/src/footer-empty.ts @@ -1,13 +1,13 @@ -import * as ensure from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import * as ensure from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; -export const footerEmpty: SyncRule = (parsed, when = 'always') => { - const negated = when === 'never'; - const notEmpty = ensure.notEmpty(parsed.footer || ''); +export const footerEmpty: SyncRule = (parsed, when = "always") => { + const negated = when === "never"; + const notEmpty = ensure.notEmpty(parsed.footer || ""); return [ negated ? notEmpty : !notEmpty, - message(['footer', negated ? 'may not' : 'must', 'be empty']), + message(["footer", negated ? "may not" : "must", "be empty"]), ]; }; diff --git a/@commitlint/rules/src/footer-leading-blank.test.ts b/@commitlint/rules/src/footer-leading-blank.test.ts index a0566a9ae8..8e17c4d343 100644 --- a/@commitlint/rules/src/footer-leading-blank.test.ts +++ b/@commitlint/rules/src/footer-leading-blank.test.ts @@ -1,20 +1,20 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {footerLeadingBlank} from './footer-leading-blank.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { footerLeadingBlank } from "./footer-leading-blank.js"; const messages = { - simple: 'test: subject', - body: 'test: subject\nbody', - trailing: 'test: subject\nbody\n\n', - without: 'test: subject\nbody\nBREAKING CHANGE: something important', + simple: "test: subject", + body: "test: subject\nbody", + trailing: "test: subject\nbody\n\n", + without: "test: subject\nbody\nBREAKING CHANGE: something important", withoutBody: - 'feat(new-parser): introduces a new parsing library\n\nBREAKING CHANGE: new library does not support foo-construct', + "feat(new-parser): introduces a new parsing library\n\nBREAKING CHANGE: new library does not support foo-construct", withBodyWithComment: - 'feat(new-parser): introduces a new parsing library\n\nBody Line 1\n# comment\nBody Line 2\n\nBREAKING CHANGE: new library does not support foo-construct', - with: 'test: subject\nbody\n\nBREAKING CHANGE: something important', + "feat(new-parser): introduces a new parsing library\n\nBody Line 1\n# comment\nBody Line 2\n\nBREAKING CHANGE: new library does not support foo-construct", + with: "test: subject\nbody\n\nBREAKING CHANGE: something important", withMulitLine: - 'test: subject\nmulti\nline\nbody\n\nBREAKING CHANGE: something important', - withDoubleNewLine: 'fix: some issue\n\ndetailed explanation\n\ncloses #123', + "test: subject\nmulti\nline\nbody\n\nBREAKING CHANGE: something important", + withDoubleNewLine: "fix: some issue\n\ndetailed explanation\n\ncloses #123", }; const parsed = { @@ -24,141 +24,141 @@ const parsed = { without: parse(messages.without), withoutBody: parse(messages.withoutBody), withBodyWithComment: parse(messages.withBodyWithComment, undefined, { - commentChar: '#', + commentChar: "#", }), with: parse(messages.with), withMulitLine: parse(messages.withMulitLine), withDoubleNewLine: parse(messages.withDoubleNewLine), }; -test('with simple message should succeed for empty keyword', async () => { +test("with simple message should succeed for empty keyword", async () => { const [actual] = footerLeadingBlank(await parsed.simple); const expected = true; expect(actual).toEqual(expected); }); test('with simple message should succeed for "never"', async () => { - const [actual] = footerLeadingBlank(await parsed.simple, 'never'); + const [actual] = footerLeadingBlank(await parsed.simple, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with simple message should succeed for "always"', async () => { - const [actual] = footerLeadingBlank(await parsed.simple, 'always'); + const [actual] = footerLeadingBlank(await parsed.simple, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('with body message should succeed for empty keyword', async () => { +test("with body message should succeed for empty keyword", async () => { const [actual] = footerLeadingBlank(await parsed.body); const expected = true; expect(actual).toEqual(expected); }); test('with body message should succeed for "never"', async () => { - const [actual] = footerLeadingBlank(await parsed.body, 'never'); + const [actual] = footerLeadingBlank(await parsed.body, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with body message should succeed for "always"', async () => { - const [actual] = footerLeadingBlank(await parsed.body, 'always'); + const [actual] = footerLeadingBlank(await parsed.body, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('with trailing message should succeed for empty keyword', async () => { +test("with trailing message should succeed for empty keyword", async () => { const [actual] = footerLeadingBlank(await parsed.trailing); const expected = true; expect(actual).toEqual(expected); }); test('with trailing message should succeed for "never"', async () => { - const [actual] = footerLeadingBlank(await parsed.trailing, 'never'); + const [actual] = footerLeadingBlank(await parsed.trailing, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with trailing message should succeed for "always"', async () => { - const [actual] = footerLeadingBlank(await parsed.trailing, 'always'); + const [actual] = footerLeadingBlank(await parsed.trailing, "always"); const expected = true; expect(actual).toEqual(expected); }); test('without body should fail for "never"', async () => { - const [actual] = footerLeadingBlank(await parsed.withoutBody, 'never'); + const [actual] = footerLeadingBlank(await parsed.withoutBody, "never"); const expected = false; expect(actual).toEqual(expected); }); test('without body should succeed for "always"', async () => { - const [actual] = footerLeadingBlank(await parsed.withoutBody, 'always'); + const [actual] = footerLeadingBlank(await parsed.withoutBody, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('without blank line before footer should fail for empty keyword', async () => { +test("without blank line before footer should fail for empty keyword", async () => { const [actual] = footerLeadingBlank(await parsed.without); const expected = false; expect(actual).toEqual(expected); }); test('without blank line before footer should succeed for "never"', async () => { - const [actual] = footerLeadingBlank(await parsed.without, 'never'); + const [actual] = footerLeadingBlank(await parsed.without, "never"); const expected = true; expect(actual).toEqual(expected); }); test('without blank line before footer should fail for "always"', async () => { - const [actual] = footerLeadingBlank(await parsed.without, 'always'); + const [actual] = footerLeadingBlank(await parsed.without, "always"); const expected = false; expect(actual).toEqual(expected); }); -test('with blank line before footer should succeed for empty keyword', async () => { +test("with blank line before footer should succeed for empty keyword", async () => { const [actual] = footerLeadingBlank(await parsed.with); const expected = true; expect(actual).toEqual(expected); }); test('with blank line before footer should fail for "never"', async () => { - const [actual] = footerLeadingBlank(await parsed.with, 'never'); + const [actual] = footerLeadingBlank(await parsed.with, "never"); const expected = false; expect(actual).toEqual(expected); }); test('with blank line before footer should succeed for "always"', async () => { - const [actual] = footerLeadingBlank(await parsed.with, 'always'); + const [actual] = footerLeadingBlank(await parsed.with, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('with blank line before footer and multiline body should succeed for empty keyword', async () => { +test("with blank line before footer and multiline body should succeed for empty keyword", async () => { const [actual] = footerLeadingBlank(await parsed.withMulitLine); const expected = true; expect(actual).toEqual(expected); }); test('with blank line before footer and multiline body should fail for "never"', async () => { - const [actual] = footerLeadingBlank(await parsed.withMulitLine, 'never'); + const [actual] = footerLeadingBlank(await parsed.withMulitLine, "never"); const expected = false; expect(actual).toEqual(expected); }); test('with blank line before footer and multiline body should succeed for "always"', async () => { - const [actual] = footerLeadingBlank(await parsed.withMulitLine, 'always'); + const [actual] = footerLeadingBlank(await parsed.withMulitLine, "always"); const expected = true; expect(actual).toEqual(expected); }); test('with double blank line before footer and double line in body should fail for "never"', async () => { - const [actual] = footerLeadingBlank(await parsed.withDoubleNewLine, 'never'); + const [actual] = footerLeadingBlank(await parsed.withDoubleNewLine, "never"); const expected = false; expect(actual).toEqual(expected); }); test('with double blank line before footer and double line in body should succeed for "always"', async () => { - const [actual] = footerLeadingBlank(await parsed.withDoubleNewLine, 'always'); + const [actual] = footerLeadingBlank(await parsed.withDoubleNewLine, "always"); const expected = true; expect(actual).toEqual(expected); }); @@ -166,7 +166,7 @@ test('with double blank line before footer and double line in body should succee test('with body containing comments should succeed for "always"', async () => { const [actual] = footerLeadingBlank( await parsed.withBodyWithComment, - 'always' + "always", ); const expected = true; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/footer-leading-blank.ts b/@commitlint/rules/src/footer-leading-blank.ts index ad8e2756bc..3f83b089a1 100644 --- a/@commitlint/rules/src/footer-leading-blank.ts +++ b/@commitlint/rules/src/footer-leading-blank.ts @@ -1,28 +1,28 @@ -import toLines from '@commitlint/to-lines'; -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import toLines from "@commitlint/to-lines"; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; -export const footerLeadingBlank: SyncRule = (parsed, when = 'always') => { +export const footerLeadingBlank: SyncRule = (parsed, when = "always") => { // Flunk if no footer is found if (!parsed.footer) { return [true]; } - const negated = when === 'never'; + const negated = when === "never"; const rawLines = toLines(parsed.raw); const footerLines = toLines(parsed.footer); const footerOffset = rawLines.indexOf(footerLines[0]); const [leading] = rawLines.slice(footerOffset - 1); // Check if the first line of footer is empty - const succeeds = leading === ''; + const succeeds = leading === ""; return [ negated ? !succeeds : succeeds, message([ - 'footer', - negated ? 'may not' : 'must', - 'have leading blank line', + "footer", + negated ? "may not" : "must", + "have leading blank line", ]), ]; }; diff --git a/@commitlint/rules/src/footer-max-length.test.ts b/@commitlint/rules/src/footer-max-length.test.ts index be41154709..0dd0a3cb23 100644 --- a/@commitlint/rules/src/footer-max-length.test.ts +++ b/@commitlint/rules/src/footer-max-length.test.ts @@ -1,15 +1,15 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {footerMaxLength} from './footer-max-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { footerMaxLength } from "./footer-max-length.js"; -const short = 'BREAKING CHANGE: a'; -const long = 'BREAKING CHANGE: ab'; +const short = "BREAKING CHANGE: a"; +const long = "BREAKING CHANGE: ab"; const value = short.length; const messages = { - simple: 'test: subject', - empty: 'test: subject\nbody', + simple: "test: subject", + empty: "test: subject\nbody", short: `test: subject\n${short}`, long: `test: subject\n${long}`, }; @@ -21,25 +21,25 @@ const parsed = { long: parse(messages.long), }; -test('with simple should succeed', async () => { +test("with simple should succeed", async () => { const [actual] = footerMaxLength(await parsed.simple, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = footerMaxLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should succeed', async () => { +test("with short should succeed", async () => { const [actual] = footerMaxLength(await parsed.short, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with long should fail', async () => { +test("with long should fail", async () => { const [actual] = footerMaxLength(await parsed.long, undefined, value); const expected = false; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/footer-max-length.ts b/@commitlint/rules/src/footer-max-length.ts index 43520ae546..d20a03ab45 100644 --- a/@commitlint/rules/src/footer-max-length.ts +++ b/@commitlint/rules/src/footer-max-length.ts @@ -1,10 +1,10 @@ -import {maxLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { maxLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const footerMaxLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.footer; diff --git a/@commitlint/rules/src/footer-max-line-length.test.ts b/@commitlint/rules/src/footer-max-line-length.test.ts index 5ce73cec90..7efa44c686 100644 --- a/@commitlint/rules/src/footer-max-line-length.test.ts +++ b/@commitlint/rules/src/footer-max-line-length.test.ts @@ -1,15 +1,15 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {footerMaxLineLength} from './footer-max-line-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { footerMaxLineLength } from "./footer-max-line-length.js"; -const short = 'BREAKING CHANGE: a'; -const long = 'BREAKING CHANGE: ab'; +const short = "BREAKING CHANGE: a"; +const long = "BREAKING CHANGE: ab"; const value = short.length; const messages = { - simple: 'test: subject', - empty: 'test: subject\nbody', + simple: "test: subject", + empty: "test: subject\nbody", short: `test: subject\n${short}`, long: `test: subject\n${long}`, shortMultipleLines: `test:subject\n${short}\n${short}\n${short}`, @@ -23,37 +23,37 @@ const parsed = { long: parse(messages.long), }; -test('with simple should succeed', async () => { +test("with simple should succeed", async () => { const [actual] = footerMaxLineLength(await parsed.simple, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = footerMaxLineLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should succeed', async () => { +test("with short should succeed", async () => { const [actual] = footerMaxLineLength(await parsed.short, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with long should fail', async () => { +test("with long should fail", async () => { const [actual] = footerMaxLineLength(await parsed.long, undefined, value); const expected = false; expect(actual).toEqual(expected); }); -test('with short with multiple lines should succeed', async () => { +test("with short with multiple lines should succeed", async () => { const [actual] = footerMaxLineLength(await parsed.short, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with long with multiple lines should fail', async () => { +test("with long with multiple lines should fail", async () => { const [actual] = footerMaxLineLength(await parsed.long, undefined, value); const expected = false; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/footer-max-line-length.ts b/@commitlint/rules/src/footer-max-line-length.ts index 34aea097dd..61366556fe 100644 --- a/@commitlint/rules/src/footer-max-line-length.ts +++ b/@commitlint/rules/src/footer-max-line-length.ts @@ -1,10 +1,10 @@ -import {maxLineLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { maxLineLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const footerMaxLineLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.footer; diff --git a/@commitlint/rules/src/footer-min-length.test.ts b/@commitlint/rules/src/footer-min-length.test.ts index 2526b76ebe..a70d86044a 100644 --- a/@commitlint/rules/src/footer-min-length.test.ts +++ b/@commitlint/rules/src/footer-min-length.test.ts @@ -1,15 +1,15 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {footerMinLength} from './footer-min-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { footerMinLength } from "./footer-min-length.js"; -const short = 'BREAKING CHANGE: a'; -const long = 'BREAKING CHANGE: ab'; +const short = "BREAKING CHANGE: a"; +const long = "BREAKING CHANGE: ab"; const value = long.length; const messages = { - simple: 'test: subject', - empty: 'test: subject\nbody', + simple: "test: subject", + empty: "test: subject\nbody", short: `test: subject\n${short}`, long: `test: subject\n${long}`, }; @@ -21,25 +21,25 @@ const parsed = { long: parse(messages.long), }; -test('with simple should succeed', async () => { +test("with simple should succeed", async () => { const [actual] = footerMinLength(await parsed.simple, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = footerMinLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should fail', async () => { +test("with short should fail", async () => { const [actual] = footerMinLength(await parsed.short, undefined, value); const expected = false; expect(actual).toEqual(expected); }); -test('with long should succeed', async () => { +test("with long should succeed", async () => { const [actual] = footerMinLength(await parsed.long, undefined, value); const expected = true; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/footer-min-length.ts b/@commitlint/rules/src/footer-min-length.ts index 9959cb788c..54f7c6143c 100644 --- a/@commitlint/rules/src/footer-min-length.ts +++ b/@commitlint/rules/src/footer-min-length.ts @@ -1,10 +1,10 @@ -import {minLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { minLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const footerMinLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { if (!parsed.footer) { return [true]; diff --git a/@commitlint/rules/src/header-case.test.ts b/@commitlint/rules/src/header-case.test.ts index a2e79c0ceb..edda2b957c 100644 --- a/@commitlint/rules/src/header-case.test.ts +++ b/@commitlint/rules/src/header-case.test.ts @@ -1,17 +1,17 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {headerCase} from './header-case.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { headerCase } from "./header-case.js"; const messages = { - numeric: '1.0.0\n', - lowercase: 'header\n', - mixedcase: 'hEaDeR\n', - uppercase: 'HEADER\n', - camelcase: 'heaDer\n', - kebabcase: 'hea-der\n', - pascalcase: 'HeaDer\n', - snakecase: 'hea_der\n', - startcase: 'Hea Der\n', + numeric: "1.0.0\n", + lowercase: "header\n", + mixedcase: "hEaDeR\n", + uppercase: "HEADER\n", + camelcase: "heaDer\n", + kebabcase: "hea-der\n", + pascalcase: "HeaDer\n", + snakecase: "hea_der\n", + startcase: "Hea Der\n", }; const parsed = { @@ -27,199 +27,199 @@ const parsed = { }; test('with lowercase header should fail for "never lowercase"', async () => { - const [actual] = headerCase(await parsed.lowercase, 'never', 'lowercase'); + const [actual] = headerCase(await parsed.lowercase, "never", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with lowercase header should succeed for "always lowercase"', async () => { - const [actual] = headerCase(await parsed.lowercase, 'always', 'lowercase'); + const [actual] = headerCase(await parsed.lowercase, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase header should succeed for "never lowercase"', async () => { - const [actual] = headerCase(await parsed.mixedcase, 'never', 'lowercase'); + const [actual] = headerCase(await parsed.mixedcase, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase header should fail for "always lowercase"', async () => { - const [actual] = headerCase(await parsed.mixedcase, 'always', 'lowercase'); + const [actual] = headerCase(await parsed.mixedcase, "always", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase header should succeed for "never uppercase"', async () => { - const [actual] = headerCase(await parsed.mixedcase, 'never', 'uppercase'); + const [actual] = headerCase(await parsed.mixedcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase header should fail for "always uppercase"', async () => { - const [actual] = headerCase(await parsed.mixedcase, 'always', 'uppercase'); + const [actual] = headerCase(await parsed.mixedcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with uppercase header should fail for "never uppercase"', async () => { - const [actual] = headerCase(await parsed.uppercase, 'never', 'uppercase'); + const [actual] = headerCase(await parsed.uppercase, "never", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with lowercase header should succeed for "always uppercase"', async () => { - const [actual] = headerCase(await parsed.uppercase, 'always', 'uppercase'); + const [actual] = headerCase(await parsed.uppercase, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with camelcase header should fail for "always uppercase"', async () => { - const [actual] = headerCase(await parsed.camelcase, 'always', 'uppercase'); + const [actual] = headerCase(await parsed.camelcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase header should succeed for "never uppercase"', async () => { - const [actual] = headerCase(await parsed.camelcase, 'never', 'uppercase'); + const [actual] = headerCase(await parsed.camelcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with camelcase header should fail for "always pascalcase"', async () => { - const [actual] = headerCase(await parsed.camelcase, 'always', 'pascal-case'); + const [actual] = headerCase(await parsed.camelcase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase header should fail for "always kebabcase"', async () => { - const [actual] = headerCase(await parsed.camelcase, 'always', 'kebab-case'); + const [actual] = headerCase(await parsed.camelcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase header should fail for "always snakecase"', async () => { - const [actual] = headerCase(await parsed.camelcase, 'always', 'snake-case'); + const [actual] = headerCase(await parsed.camelcase, "always", "snake-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase header should succeed for "always camelcase"', async () => { - const [actual] = headerCase(await parsed.camelcase, 'always', 'camel-case'); + const [actual] = headerCase(await parsed.camelcase, "always", "camel-case"); const expected = true; expect(actual).toEqual(expected); }); test('with pascalcase header should fail for "always uppercase"', async () => { - const [actual] = headerCase(await parsed.pascalcase, 'always', 'uppercase'); + const [actual] = headerCase(await parsed.pascalcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase header should succeed for "never uppercase"', async () => { - const [actual] = headerCase(await parsed.pascalcase, 'never', 'uppercase'); + const [actual] = headerCase(await parsed.pascalcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with pascalcase header should succeed for "always pascalcase"', async () => { - const [actual] = headerCase(await parsed.pascalcase, 'always', 'pascal-case'); + const [actual] = headerCase(await parsed.pascalcase, "always", "pascal-case"); const expected = true; expect(actual).toEqual(expected); }); test('with pascalcase header should fail for "always kebabcase"', async () => { - const [actual] = headerCase(await parsed.pascalcase, 'always', 'kebab-case'); + const [actual] = headerCase(await parsed.pascalcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase header should fail for "always snakecase"', async () => { - const [actual] = headerCase(await parsed.pascalcase, 'always', 'snake-case'); + const [actual] = headerCase(await parsed.pascalcase, "always", "snake-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase header should fail for "always camelcase"', async () => { - const [actual] = headerCase(await parsed.pascalcase, 'always', 'camel-case'); + const [actual] = headerCase(await parsed.pascalcase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase header should fail for "always uppercase"', async () => { - const [actual] = headerCase(await parsed.snakecase, 'always', 'uppercase'); + const [actual] = headerCase(await parsed.snakecase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase header should succeed for "never uppercase"', async () => { - const [actual] = headerCase(await parsed.snakecase, 'never', 'uppercase'); + const [actual] = headerCase(await parsed.snakecase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with snakecase header should fail for "always pascalcase"', async () => { - const [actual] = headerCase(await parsed.snakecase, 'always', 'pascal-case'); + const [actual] = headerCase(await parsed.snakecase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase header should fail for "always kebabcase"', async () => { - const [actual] = headerCase(await parsed.snakecase, 'always', 'kebab-case'); + const [actual] = headerCase(await parsed.snakecase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase header should succeed for "always snakecase"', async () => { - const [actual] = headerCase(await parsed.snakecase, 'always', 'snake-case'); + const [actual] = headerCase(await parsed.snakecase, "always", "snake-case"); const expected = true; expect(actual).toEqual(expected); }); test('with snakecase header should fail for "always camelcase"', async () => { - const [actual] = headerCase(await parsed.snakecase, 'always', 'camel-case'); + const [actual] = headerCase(await parsed.snakecase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase header should fail for "always uppercase"', async () => { - const [actual] = headerCase(await parsed.startcase, 'always', 'uppercase'); + const [actual] = headerCase(await parsed.startcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase header should succeed for "never uppercase"', async () => { - const [actual] = headerCase(await parsed.startcase, 'never', 'uppercase'); + const [actual] = headerCase(await parsed.startcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with startcase header should fail for "always pascalcase"', async () => { - const [actual] = headerCase(await parsed.startcase, 'always', 'pascal-case'); + const [actual] = headerCase(await parsed.startcase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase header should fail for "always kebabcase"', async () => { - const [actual] = headerCase(await parsed.startcase, 'always', 'kebab-case'); + const [actual] = headerCase(await parsed.startcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase header should fail for "always snakecase"', async () => { - const [actual] = headerCase(await parsed.startcase, 'always', 'snake-case'); + const [actual] = headerCase(await parsed.startcase, "always", "snake-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase header should fail for "always camelcase"', async () => { - const [actual] = headerCase(await parsed.startcase, 'always', 'camel-case'); + const [actual] = headerCase(await parsed.startcase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase header should succeed for "always startcase"', async () => { - const [actual] = headerCase(await parsed.startcase, 'always', 'start-case'); + const [actual] = headerCase(await parsed.startcase, "always", "start-case"); const expected = true; expect(actual).toEqual(expected); }); @@ -227,92 +227,92 @@ test('with startcase header should succeed for "always startcase"', async () => test('should use expected message with "always"', async () => { const [, message] = headerCase( await parsed.uppercase, - 'always', - 'lower-case' + "always", + "lower-case", ); - expect(message).toContain('must be lower-case'); + expect(message).toContain("must be lower-case"); }); test('should use expected message with "never"', async () => { - const [, message] = headerCase(await parsed.uppercase, 'never', 'upper-case'); - expect(message).toContain('must not be upper-case'); + const [, message] = headerCase(await parsed.uppercase, "never", "upper-case"); + expect(message).toContain("must not be upper-case"); }); test('with uppercase scope should succeed for "always [uppercase, lowercase]"', async () => { - const [actual] = headerCase(await parsed.uppercase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = headerCase(await parsed.uppercase, "always", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with lowercase header should succeed for "always [uppercase, lowercase]"', async () => { - const [actual] = headerCase(await parsed.lowercase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = headerCase(await parsed.lowercase, "always", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase header should fail for "always [uppercase, lowercase]"', async () => { - const [actual] = headerCase(await parsed.mixedcase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = headerCase(await parsed.mixedcase, "always", [ + "uppercase", + "lowercase", ]); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase header should pass for "always [uppercase, lowercase, camel-case]"', async () => { - const [actual] = headerCase(await parsed.mixedcase, 'always', [ - 'uppercase', - 'lowercase', - 'camel-case', + const [actual] = headerCase(await parsed.mixedcase, "always", [ + "uppercase", + "lowercase", + "camel-case", ]); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase scope should pass for "never [uppercase, lowercase]"', async () => { - const [actual] = headerCase(await parsed.mixedcase, 'never', [ - 'uppercase', - 'lowercase', + const [actual] = headerCase(await parsed.mixedcase, "never", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with uppercase scope should fail for "never [uppercase, lowercase]"', async () => { - const [actual] = headerCase(await parsed.uppercase, 'never', [ - 'uppercase', - 'lowercase', + const [actual] = headerCase(await parsed.uppercase, "never", [ + "uppercase", + "lowercase", ]); const expected = false; expect(actual).toEqual(expected); }); test('with numeric header should succeed for "never lowercase"', async () => { - const [actual] = headerCase(await parsed.numeric, 'never', 'lowercase'); + const [actual] = headerCase(await parsed.numeric, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with numeric header should succeed for "always lowercase"', async () => { - const [actual] = headerCase(await parsed.numeric, 'always', 'lowercase'); + const [actual] = headerCase(await parsed.numeric, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with numeric header should succeed for "never uppercase"', async () => { - const [actual] = headerCase(await parsed.numeric, 'never', 'uppercase'); + const [actual] = headerCase(await parsed.numeric, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with numeric header should succeed for "always uppercase"', async () => { - const [actual] = headerCase(await parsed.numeric, 'always', 'uppercase'); + const [actual] = headerCase(await parsed.numeric, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/header-case.ts b/@commitlint/rules/src/header-case.ts index cb907c9e40..310b8a753e 100644 --- a/@commitlint/rules/src/header-case.ts +++ b/@commitlint/rules/src/header-case.ts @@ -1,24 +1,24 @@ -import {case as ensureCase} from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {TargetCaseType, SyncRule} from '@commitlint/types'; +import { case as ensureCase } from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { TargetCaseType, SyncRule } from "@commitlint/types"; -const negated = (when?: string) => when === 'never'; +const negated = (when?: string) => when === "never"; export const headerCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( parsed, - when = 'always', - value = [] + when = "always", + value = [], ) => { - const {header} = parsed; + const { header } = parsed; - if (typeof header !== 'string' || !header.match(/^[a-z]/i)) { + if (typeof header !== "string" || !header.match(/^[a-z]/i)) { return [true]; } const checks = (Array.isArray(value) ? value : [value]).map((check) => { - if (typeof check === 'string') { + if (typeof check === "string") { return { - when: 'always', + when: "always", case: check, }; } @@ -30,7 +30,7 @@ export const headerCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( return negated(check.when) ? !r : r; }); - const list = checks.map((c) => c.case).join(', '); + const list = checks.map((c) => c.case).join(", "); return [ negated(when) ? !result : result, diff --git a/@commitlint/rules/src/header-full-stop.test.ts b/@commitlint/rules/src/header-full-stop.test.ts index 667cfc80dd..98fd156437 100644 --- a/@commitlint/rules/src/header-full-stop.test.ts +++ b/@commitlint/rules/src/header-full-stop.test.ts @@ -1,6 +1,6 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {headerFullStop} from './header-full-stop.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { headerFullStop } from "./header-full-stop.js"; const messages = { with: `header.\n`, @@ -13,25 +13,25 @@ const parsed = { }; test('with against "always ." should succeed', async () => { - const [actual] = headerFullStop(await parsed.with, 'always', '.'); + const [actual] = headerFullStop(await parsed.with, "always", "."); const expected = true; expect(actual).toEqual(expected); }); test('with against "never ." should fail', async () => { - const [actual] = headerFullStop(await parsed.with, 'never', '.'); + const [actual] = headerFullStop(await parsed.with, "never", "."); const expected = false; expect(actual).toEqual(expected); }); test('without against "always ." should fail', async () => { - const [actual] = headerFullStop(await parsed.without, 'always', '.'); + const [actual] = headerFullStop(await parsed.without, "always", "."); const expected = false; expect(actual).toEqual(expected); }); test('without against "never ." should succeed', async () => { - const [actual] = headerFullStop(await parsed.without, 'never', '.'); + const [actual] = headerFullStop(await parsed.without, "never", "."); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/header-full-stop.ts b/@commitlint/rules/src/header-full-stop.ts index 1cb5031918..ae57cd26e5 100644 --- a/@commitlint/rules/src/header-full-stop.ts +++ b/@commitlint/rules/src/header-full-stop.ts @@ -1,17 +1,17 @@ -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; export const headerFullStop: SyncRule<string> = ( parsed, - when = 'always', - value = '.' + when = "always", + value = ".", ) => { - const {header} = parsed; - const negated = when === 'never'; + const { header } = parsed; + const negated = when === "never"; const hasStop = header?.[header.length - 1] === value; return [ negated ? !hasStop : hasStop, - message(['header', negated ? 'may not' : 'must', 'end with full stop']), + message(["header", negated ? "may not" : "must", "end with full stop"]), ]; }; diff --git a/@commitlint/rules/src/header-max-length.test.ts b/@commitlint/rules/src/header-max-length.test.ts index d57626e797..c7180e66b0 100644 --- a/@commitlint/rules/src/header-max-length.test.ts +++ b/@commitlint/rules/src/header-max-length.test.ts @@ -1,9 +1,9 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {headerMaxLength} from './header-max-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { headerMaxLength } from "./header-max-length.js"; -const short = 'test: a'; -const long = 'test: ab'; +const short = "test: a"; +const long = "test: ab"; const value = short.length; @@ -17,13 +17,13 @@ const parsed = { long: parse(messages.long), }; -test('with short should succeed', async () => { +test("with short should succeed", async () => { const [actual] = headerMaxLength(await parsed.short, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with long should fail', async () => { +test("with long should fail", async () => { const [actual] = headerMaxLength(await parsed.long, undefined, value); const expected = false; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/header-max-length.ts b/@commitlint/rules/src/header-max-length.ts index 7cb3a6b4e6..0147c9d67f 100644 --- a/@commitlint/rules/src/header-max-length.ts +++ b/@commitlint/rules/src/header-max-length.ts @@ -1,10 +1,10 @@ -import {maxLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { maxLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const headerMaxLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { return [ maxLength(parsed.header, value), diff --git a/@commitlint/rules/src/header-min-length.test.ts b/@commitlint/rules/src/header-min-length.test.ts index 7991371978..e97dfe3d48 100644 --- a/@commitlint/rules/src/header-min-length.test.ts +++ b/@commitlint/rules/src/header-min-length.test.ts @@ -1,9 +1,9 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {headerMinLength} from './header-min-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { headerMinLength } from "./header-min-length.js"; -const short = 'BREAKING CHANGE: a'; -const long = 'BREAKING CHANGE: ab'; +const short = "BREAKING CHANGE: a"; +const long = "BREAKING CHANGE: ab"; const value = long.length; @@ -17,13 +17,13 @@ const parsed = { long: parse(messages.long), }; -test('with short should fail', async () => { +test("with short should fail", async () => { const [actual] = headerMinLength(await parsed.short, undefined, value); const expected = false; expect(actual).toEqual(expected); }); -test('with long should succeed', async () => { +test("with long should succeed", async () => { const [actual] = headerMinLength(await parsed.long, undefined, value); const expected = true; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/header-min-length.ts b/@commitlint/rules/src/header-min-length.ts index bd9ae29662..d332b077b3 100644 --- a/@commitlint/rules/src/header-min-length.ts +++ b/@commitlint/rules/src/header-min-length.ts @@ -1,10 +1,10 @@ -import {minLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { minLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const headerMinLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { return [ minLength(parsed.header, value), diff --git a/@commitlint/rules/src/header-trim.test.ts b/@commitlint/rules/src/header-trim.test.ts index 410cfc1bc2..f9280b2bf7 100644 --- a/@commitlint/rules/src/header-trim.test.ts +++ b/@commitlint/rules/src/header-trim.test.ts @@ -1,23 +1,23 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import type {Commit} from 'conventional-commits-parser'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import type { Commit } from "conventional-commits-parser"; -import {headerTrim} from './header-trim.js'; +import { headerTrim } from "./header-trim.js"; const messages = { - correct: 'test: subject', + correct: "test: subject", - whitespaceStart: ' test: subject', - whitespaceEnd: 'test: subject ', - whitespaceSurround: ' test: subject ', + whitespaceStart: " test: subject", + whitespaceEnd: "test: subject ", + whitespaceSurround: " test: subject ", - tabStart: '\t\ttest: subject', - tabEnd: 'test: subject\t\t', - tabSurround: '\t\ttest: subject\t', + tabStart: "\t\ttest: subject", + tabEnd: "test: subject\t\t", + tabSurround: "\t\ttest: subject\t", - mixStart: '\t\ttest: subject', - mixEnd: 'test: subject\t\t', - mixSurround: '\t \ttest: subject \t \t', + mixStart: "\t\ttest: subject", + mixEnd: "test: subject\t\t", + mixSurround: "\t \ttest: subject \t \t", }; const parsed = Object.entries(messages).reduce( @@ -25,49 +25,49 @@ const parsed = Object.entries(messages).reduce( Object.assign(_parsed, { [key]: parse(message), }), - {} as Record<keyof typeof messages, Promise<Commit>> + {} as Record<keyof typeof messages, Promise<Commit>>, ); -test('should succeed when header is not surrounded by whitespace', async () => { +test("should succeed when header is not surrounded by whitespace", async () => { const result = headerTrim(await parsed.correct); expect(result).toEqual(expect.arrayContaining([true])); }); test.each([ - {scenario: 'mixed whitespace ', commit: parsed.mixStart}, - {scenario: 'whitespace', commit: parsed.whitespaceStart}, - {scenario: 'tab', commit: parsed.tabStart}, -] as const)('should fail when starts with $scenario', async ({commit}) => { + { scenario: "mixed whitespace ", commit: parsed.mixStart }, + { scenario: "whitespace", commit: parsed.whitespaceStart }, + { scenario: "tab", commit: parsed.tabStart }, +] as const)("should fail when starts with $scenario", async ({ commit }) => { const result = headerTrim(await commit); expect(result).toEqual( - expect.arrayContaining([false, 'header must not start with whitespace']) + expect.arrayContaining([false, "header must not start with whitespace"]), ); }); test.each([ - {scenario: 'mixed whitespace', commit: parsed.mixEnd}, - {scenario: 'whitespace', commit: parsed.whitespaceEnd}, - {scenario: 'tab', commit: parsed.tabEnd}, -] as const)('should fail when ends with $scenario', async ({commit}) => { + { scenario: "mixed whitespace", commit: parsed.mixEnd }, + { scenario: "whitespace", commit: parsed.whitespaceEnd }, + { scenario: "tab", commit: parsed.tabEnd }, +] as const)("should fail when ends with $scenario", async ({ commit }) => { const result = headerTrim(await commit); expect(result).toEqual( - expect.arrayContaining([false, 'header must not end with whitespace']) + expect.arrayContaining([false, "header must not end with whitespace"]), ); }); test.each([ - {scenario: 'mixed whitespace', commit: parsed.mixSurround}, - {scenario: 'whitespace', commit: parsed.whitespaceSurround}, - {scenario: 'tab', commit: parsed.tabSurround}, + { scenario: "mixed whitespace", commit: parsed.mixSurround }, + { scenario: "whitespace", commit: parsed.whitespaceSurround }, + { scenario: "tab", commit: parsed.tabSurround }, ] as const)( - 'should fail when surrounded by with $scenario', - async ({commit}) => { + "should fail when surrounded by with $scenario", + async ({ commit }) => { const result = headerTrim(await commit); expect(result).toEqual( expect.arrayContaining([ false, - 'header must not be surrounded by whitespace', - ]) + "header must not be surrounded by whitespace", + ]), ); - } + }, ); diff --git a/@commitlint/rules/src/header-trim.ts b/@commitlint/rules/src/header-trim.ts index f1ef65be66..05edeab268 100644 --- a/@commitlint/rules/src/header-trim.ts +++ b/@commitlint/rules/src/header-trim.ts @@ -1,30 +1,22 @@ -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; export const headerTrim: SyncRule = (parsed) => { - const {header} = parsed; + const { header } = parsed; - if (!header) { - return [true]; - } + if (!header) return [true]; - const startsWithWhiteSpace = header !== header.trimStart(); - const endsWithWhiteSpace = header !== header.trimEnd(); + const startsWithWhiteSpace = header.length > header.trimStart().length; + const endsWithWhiteSpace = header.length > header.trimEnd().length; - switch (true) { - case startsWithWhiteSpace && endsWithWhiteSpace: - return [ - false, - message(['header', 'must not be surrounded by whitespace']), - ]; + if (startsWithWhiteSpace && endsWithWhiteSpace) + return [false, message(["header", "must not be surrounded by whitespace"])]; - case startsWithWhiteSpace: - return [false, message(['header', 'must not start with whitespace'])]; + if (startsWithWhiteSpace) + return [false, message(["header", "must not start with whitespace"])]; - case endsWithWhiteSpace: - return [false, message(['header', 'must not end with whitespace'])]; + if (endsWithWhiteSpace) + return [false, message(["header", "must not end with whitespace"])]; - default: - return [true]; - } + return [true]; }; diff --git a/@commitlint/rules/src/index.test.ts b/@commitlint/rules/src/index.test.ts index 822fd53c73..22f3b91847 100644 --- a/@commitlint/rules/src/index.test.ts +++ b/@commitlint/rules/src/index.test.ts @@ -1,41 +1,41 @@ -import {test, expect} from 'vitest'; -import fs from 'fs'; -import path from 'path'; -import {fileURLToPath} from 'url'; +import { test, expect } from "vitest"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; -import {globSync} from 'glob'; +import { globSync } from "glob"; -import rules from './index.js'; +import rules from "./index.js"; -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); -test('exports all rules', () => { - const expected = _glob('*.ts').sort(); +test("exports all rules", () => { + const expected = _glob("*.ts").sort(); const actual = Object.keys(rules).sort(); expect(actual).toEqual(expected); }); -test('rules export functions', () => { +test("rules export functions", () => { const actual = Object.values(rules); - expect(actual.every((rule) => typeof rule === 'function')).toBe(true); + expect(actual.every((rule) => typeof rule === "function")).toBe(true); }); -test('all rules are present in documentation', () => { +test("all rules are present in documentation", () => { const file = fs.readFileSync( - path.join(__dirname, '../../../docs/reference/rules.md'), - 'utf-8' + path.join(__dirname, "../../../docs/reference/rules.md"), + "utf-8", ); const results = file .split(/(\n|\r)/) - .filter((s) => s.startsWith('##') && !s.includes('`deprecated`')) - .map((s) => s.replace('## ', '')); + .filter((s) => s.startsWith("##") && !s.includes("`deprecated`")) + .map((s) => s.replace("## ", "")); expect(Object.keys(rules)).toEqual(expect.arrayContaining(results)); }); function _glob(pattern: string) { const files = globSync(pattern, { - ignore: ['**/index.ts', '**/*.test.ts'], + ignore: ["**/index.ts", "**/*.test.ts"], cwd: __dirname, }); return files.map(relative).map(toExport); diff --git a/@commitlint/rules/src/index.ts b/@commitlint/rules/src/index.ts index c3b3f6b4d1..95e7a9c86d 100644 --- a/@commitlint/rules/src/index.ts +++ b/@commitlint/rules/src/index.ts @@ -1,75 +1,77 @@ -import {bodyCase} from './body-case.js'; -import {bodyEmpty} from './body-empty.js'; -import {bodyFullStop} from './body-full-stop.js'; -import {bodyLeadingBlank} from './body-leading-blank.js'; -import {bodyMaxLength} from './body-max-length.js'; -import {bodyMaxLineLength} from './body-max-line-length.js'; -import {bodyMinLength} from './body-min-length.js'; -import {footerEmpty} from './footer-empty.js'; -import {footerLeadingBlank} from './footer-leading-blank.js'; -import {footerMaxLength} from './footer-max-length.js'; -import {footerMaxLineLength} from './footer-max-line-length.js'; -import {footerMinLength} from './footer-min-length.js'; -import {headerCase} from './header-case.js'; -import {headerFullStop} from './header-full-stop.js'; -import {headerMaxLength} from './header-max-length.js'; -import {headerMinLength} from './header-min-length.js'; -import {headerTrim} from './header-trim.js'; -import {referencesEmpty} from './references-empty.js'; -import {scopeCase} from './scope-case.js'; -import {scopeEmpty} from './scope-empty.js'; -import {scopeEnum} from './scope-enum.js'; -import {scopeMaxLength} from './scope-max-length.js'; -import {scopeMinLength} from './scope-min-length.js'; -import {signedOffBy} from './signed-off-by.js'; -import {subjectCase} from './subject-case.js'; -import {subjectEmpty} from './subject-empty.js'; -import {subjectFullStop} from './subject-full-stop.js'; -import {subjectMaxLength} from './subject-max-length.js'; -import {subjectMinLength} from './subject-min-length.js'; -import {subjectExclamationMark} from './subject-exclamation-mark.js'; -import {trailerExists} from './trailer-exists.js'; -import {typeCase} from './type-case.js'; -import {typeEmpty} from './type-empty.js'; -import {typeEnum} from './type-enum.js'; -import {typeMaxLength} from './type-max-length.js'; -import {typeMinLength} from './type-min-length.js'; +import { breakingChangeExclamationMark } from "./breaking-change-exclamation-mark.js"; +import { bodyCase } from "./body-case.js"; +import { bodyEmpty } from "./body-empty.js"; +import { bodyFullStop } from "./body-full-stop.js"; +import { bodyLeadingBlank } from "./body-leading-blank.js"; +import { bodyMaxLength } from "./body-max-length.js"; +import { bodyMaxLineLength } from "./body-max-line-length.js"; +import { bodyMinLength } from "./body-min-length.js"; +import { footerEmpty } from "./footer-empty.js"; +import { footerLeadingBlank } from "./footer-leading-blank.js"; +import { footerMaxLength } from "./footer-max-length.js"; +import { footerMaxLineLength } from "./footer-max-line-length.js"; +import { footerMinLength } from "./footer-min-length.js"; +import { headerCase } from "./header-case.js"; +import { headerFullStop } from "./header-full-stop.js"; +import { headerMaxLength } from "./header-max-length.js"; +import { headerMinLength } from "./header-min-length.js"; +import { headerTrim } from "./header-trim.js"; +import { referencesEmpty } from "./references-empty.js"; +import { scopeCase } from "./scope-case.js"; +import { scopeEmpty } from "./scope-empty.js"; +import { scopeEnum } from "./scope-enum.js"; +import { scopeMaxLength } from "./scope-max-length.js"; +import { scopeMinLength } from "./scope-min-length.js"; +import { signedOffBy } from "./signed-off-by.js"; +import { subjectCase } from "./subject-case.js"; +import { subjectEmpty } from "./subject-empty.js"; +import { subjectFullStop } from "./subject-full-stop.js"; +import { subjectMaxLength } from "./subject-max-length.js"; +import { subjectMinLength } from "./subject-min-length.js"; +import { subjectExclamationMark } from "./subject-exclamation-mark.js"; +import { trailerExists } from "./trailer-exists.js"; +import { typeCase } from "./type-case.js"; +import { typeEmpty } from "./type-empty.js"; +import { typeEnum } from "./type-enum.js"; +import { typeMaxLength } from "./type-max-length.js"; +import { typeMinLength } from "./type-min-length.js"; export default { - 'body-case': bodyCase, - 'body-empty': bodyEmpty, - 'body-full-stop': bodyFullStop, - 'body-leading-blank': bodyLeadingBlank, - 'body-max-length': bodyMaxLength, - 'body-max-line-length': bodyMaxLineLength, - 'body-min-length': bodyMinLength, - 'footer-empty': footerEmpty, - 'footer-leading-blank': footerLeadingBlank, - 'footer-max-length': footerMaxLength, - 'footer-max-line-length': footerMaxLineLength, - 'footer-min-length': footerMinLength, - 'header-case': headerCase, - 'header-full-stop': headerFullStop, - 'header-max-length': headerMaxLength, - 'header-min-length': headerMinLength, - 'header-trim': headerTrim, - 'references-empty': referencesEmpty, - 'scope-case': scopeCase, - 'scope-empty': scopeEmpty, - 'scope-enum': scopeEnum, - 'scope-max-length': scopeMaxLength, - 'scope-min-length': scopeMinLength, - 'signed-off-by': signedOffBy, - 'subject-case': subjectCase, - 'subject-empty': subjectEmpty, - 'subject-full-stop': subjectFullStop, - 'subject-max-length': subjectMaxLength, - 'subject-min-length': subjectMinLength, - 'subject-exclamation-mark': subjectExclamationMark, - 'trailer-exists': trailerExists, - 'type-case': typeCase, - 'type-empty': typeEmpty, - 'type-enum': typeEnum, - 'type-max-length': typeMaxLength, - 'type-min-length': typeMinLength, + "body-case": bodyCase, + "body-empty": bodyEmpty, + "body-full-stop": bodyFullStop, + "body-leading-blank": bodyLeadingBlank, + "body-max-length": bodyMaxLength, + "body-max-line-length": bodyMaxLineLength, + "body-min-length": bodyMinLength, + "breaking-change-exclamation-mark": breakingChangeExclamationMark, + "footer-empty": footerEmpty, + "footer-leading-blank": footerLeadingBlank, + "footer-max-length": footerMaxLength, + "footer-max-line-length": footerMaxLineLength, + "footer-min-length": footerMinLength, + "header-case": headerCase, + "header-full-stop": headerFullStop, + "header-max-length": headerMaxLength, + "header-min-length": headerMinLength, + "header-trim": headerTrim, + "references-empty": referencesEmpty, + "scope-case": scopeCase, + "scope-empty": scopeEmpty, + "scope-enum": scopeEnum, + "scope-max-length": scopeMaxLength, + "scope-min-length": scopeMinLength, + "signed-off-by": signedOffBy, + "subject-case": subjectCase, + "subject-empty": subjectEmpty, + "subject-exclamation-mark": subjectExclamationMark, + "subject-full-stop": subjectFullStop, + "subject-max-length": subjectMaxLength, + "subject-min-length": subjectMinLength, + "trailer-exists": trailerExists, + "type-case": typeCase, + "type-empty": typeEmpty, + "type-enum": typeEnum, + "type-max-length": typeMaxLength, + "type-min-length": typeMinLength, }; diff --git a/@commitlint/rules/src/references-empty.test.ts b/@commitlint/rules/src/references-empty.test.ts index cd6465aac6..03b12bd060 100644 --- a/@commitlint/rules/src/references-empty.test.ts +++ b/@commitlint/rules/src/references-empty.test.ts @@ -1,21 +1,21 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {referencesEmpty} from './references-empty.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { referencesEmpty } from "./references-empty.js"; // @ts-expect-error -- no typings -import preset from 'conventional-changelog-angular'; +import preset from "conventional-changelog-angular"; const messages = { - plain: 'foo: bar', - comment: 'foo: baz\n#1 Comment', - reference: '#comment\nfoo: baz \nCloses #1', - references: '#comment\nfoo: bar \nCloses #1, #2, #3', - prefix: 'bar REF-1234', + plain: "foo: bar", + comment: "foo: baz\n#1 Comment", + reference: "#comment\nfoo: baz \nCloses #1", + references: "#comment\nfoo: bar \nCloses #1, #2, #3", + prefix: "bar REF-1234", }; const opts = (async () => { const o = await preset(); - o.parserOpts.commentChar = '#'; + o.parserOpts.commentChar = "#"; return o; })(); @@ -29,60 +29,60 @@ const parsed = { references: (async () => parse(messages.references, undefined, (await opts).parserOpts))(), prefix: parse(messages.prefix, undefined, { - issuePrefixes: ['REF-'], + issuePrefixes: ["REF-"], }), }; -test('defaults to never and fails for plain', async () => { +test("defaults to never and fails for plain", async () => { const [actual] = referencesEmpty(await parsed.plain); const expected = false; expect(actual).toEqual(expected); }); -test('defaults to never and succeeds for reference', async () => { +test("defaults to never and succeeds for reference", async () => { const [actual] = referencesEmpty(await parsed.reference); const expected = true; expect(actual).toEqual(expected); }); -test('fails for comment with never', async () => { - const [actual] = referencesEmpty(await parsed.comment, 'never'); +test("fails for comment with never", async () => { + const [actual] = referencesEmpty(await parsed.comment, "never"); const expected = false; expect(actual).toEqual(expected); }); -test('succeeds for comment with always', async () => { - const [actual] = referencesEmpty(await parsed.comment, 'always'); +test("succeeds for comment with always", async () => { + const [actual] = referencesEmpty(await parsed.comment, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('succeeds for reference with never', async () => { - const [actual] = referencesEmpty(await parsed.reference, 'never'); +test("succeeds for reference with never", async () => { + const [actual] = referencesEmpty(await parsed.reference, "never"); const expected = true; expect(actual).toEqual(expected); }); -test('fails for reference with always', async () => { - const [actual] = referencesEmpty(await parsed.reference, 'always'); +test("fails for reference with always", async () => { + const [actual] = referencesEmpty(await parsed.reference, "always"); const expected = false; expect(actual).toEqual(expected); }); -test('succeeds for references with never', async () => { - const [actual] = referencesEmpty(await parsed.references, 'never'); +test("succeeds for references with never", async () => { + const [actual] = referencesEmpty(await parsed.references, "never"); const expected = true; expect(actual).toEqual(expected); }); -test('fails for references with always', async () => { - const [actual] = referencesEmpty(await parsed.references, 'always'); +test("fails for references with always", async () => { + const [actual] = referencesEmpty(await parsed.references, "always"); const expected = false; expect(actual).toEqual(expected); }); -test('succeeds for custom references with always', async () => { - const [actual] = referencesEmpty(await parsed.prefix, 'never'); +test("succeeds for custom references with always", async () => { + const [actual] = referencesEmpty(await parsed.prefix, "never"); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/references-empty.ts b/@commitlint/rules/src/references-empty.ts index 6682d1d99f..650675e087 100644 --- a/@commitlint/rules/src/references-empty.ts +++ b/@commitlint/rules/src/references-empty.ts @@ -1,11 +1,11 @@ -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; -export const referencesEmpty: SyncRule = (parsed, when = 'never') => { - const negated = when === 'always'; +export const referencesEmpty: SyncRule = (parsed, when = "never") => { + const negated = when === "always"; const notEmpty = parsed.references.length > 0; return [ negated ? !notEmpty : notEmpty, - message(['references', negated ? 'must' : 'may not', 'be empty']), + message(["references", negated ? "must" : "may not", "be empty"]), ]; }; diff --git a/@commitlint/rules/src/scope-case.test.ts b/@commitlint/rules/src/scope-case.test.ts index ba55acf731..4e352e7017 100644 --- a/@commitlint/rules/src/scope-case.test.ts +++ b/@commitlint/rules/src/scope-case.test.ts @@ -1,17 +1,17 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {scopeCase} from './scope-case.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { scopeCase } from "./scope-case.js"; const messages = { - empty: 'test: subject', - lowercase: 'test(scope): subject', - mixedcase: 'test(sCoPe): subject', - uppercase: 'test(SCOPE): subject', - camelcase: 'test(myScope): subject', - kebabcase: 'test(my-scope): subject', - pascalcase: 'test(MyScope): subject', - snakecase: 'test(my_scope): subject', - startcase: 'test(My Scope): subject', + empty: "test: subject", + lowercase: "test(scope): subject", + mixedcase: "test(sCoPe): subject", + uppercase: "test(SCOPE): subject", + camelcase: "test(myScope): subject", + kebabcase: "test(my-scope): subject", + pascalcase: "test(MyScope): subject", + snakecase: "test(my_scope): subject", + startcase: "test(My Scope): subject", }; const parsed = { @@ -27,298 +27,298 @@ const parsed = { }; test('with empty scope should succeed for "never lowercase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'lowercase'); + const [actual] = scopeCase(await parsed.empty, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "always lowercase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'always', 'lowercase'); + const [actual] = scopeCase(await parsed.empty, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "never uppercase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'uppercase'); + const [actual] = scopeCase(await parsed.empty, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "always uppercase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'always', 'uppercase'); + const [actual] = scopeCase(await parsed.empty, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "never camelcase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'camel-case'); + const [actual] = scopeCase(await parsed.empty, "never", "camel-case"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "always camelcase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'camel-case'); + const [actual] = scopeCase(await parsed.empty, "never", "camel-case"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "never kebabcase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'kebab-case'); + const [actual] = scopeCase(await parsed.empty, "never", "kebab-case"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "always kebabcase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'kebab-case'); + const [actual] = scopeCase(await parsed.empty, "never", "kebab-case"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "never pascalcase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'pascal-case'); + const [actual] = scopeCase(await parsed.empty, "never", "pascal-case"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "always pascalcase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'pascal-case'); + const [actual] = scopeCase(await parsed.empty, "never", "pascal-case"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "never snakecase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'snake-case'); + const [actual] = scopeCase(await parsed.empty, "never", "snake-case"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "always snakecase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'snake-case'); + const [actual] = scopeCase(await parsed.empty, "never", "snake-case"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "never startcase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'start-case'); + const [actual] = scopeCase(await parsed.empty, "never", "start-case"); const expected = true; expect(actual).toEqual(expected); }); test('with empty scope should succeed for "always startcase"', async () => { - const [actual] = scopeCase(await parsed.empty, 'never', 'start-case'); + const [actual] = scopeCase(await parsed.empty, "never", "start-case"); const expected = true; expect(actual).toEqual(expected); }); test('with lowercase scope should fail for "never lowercase"', async () => { - const [actual] = scopeCase(await parsed.lowercase, 'never', 'lowercase'); + const [actual] = scopeCase(await parsed.lowercase, "never", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with lowercase scope should succeed for "always lowercase"', async () => { - const [actual] = scopeCase(await parsed.lowercase, 'always', 'lowercase'); + const [actual] = scopeCase(await parsed.lowercase, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase scope should succeed for "never lowercase"', async () => { - const [actual] = scopeCase(await parsed.mixedcase, 'never', 'lowercase'); + const [actual] = scopeCase(await parsed.mixedcase, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase scope should fail for "always lowercase"', async () => { - const [actual] = scopeCase(await parsed.mixedcase, 'always', 'lowercase'); + const [actual] = scopeCase(await parsed.mixedcase, "always", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase scope should succeed for "never uppercase"', async () => { - const [actual] = scopeCase(await parsed.mixedcase, 'never', 'uppercase'); + const [actual] = scopeCase(await parsed.mixedcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with kebabcase scope should succeed for "always lowercase"', async () => { - const [actual] = scopeCase(await parsed.kebabcase, 'always', 'lowercase'); + const [actual] = scopeCase(await parsed.kebabcase, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with kebabcase scope should fail for "always camelcase"', async () => { - const [actual] = scopeCase(await parsed.kebabcase, 'always', 'camel-case'); + const [actual] = scopeCase(await parsed.kebabcase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with kebabcase scope should fail for "always pascalcase"', async () => { - const [actual] = scopeCase(await parsed.kebabcase, 'always', 'pascal-case'); + const [actual] = scopeCase(await parsed.kebabcase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with kebabcase scope should succeed for "always kebabcase"', async () => { - const [actual] = scopeCase(await parsed.kebabcase, 'always', 'kebab-case'); + const [actual] = scopeCase(await parsed.kebabcase, "always", "kebab-case"); const expected = true; expect(actual).toEqual(expected); }); test('with snakecase scope should succeed for "always lowercase"', async () => { - const [actual] = scopeCase(await parsed.snakecase, 'always', 'lowercase'); + const [actual] = scopeCase(await parsed.snakecase, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with snakecase scope should fail for "always camelcase"', async () => { - const [actual] = scopeCase(await parsed.snakecase, 'always', 'camel-case'); + const [actual] = scopeCase(await parsed.snakecase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase scope should fail for "always pascalcase"', async () => { - const [actual] = scopeCase(await parsed.snakecase, 'always', 'pascal-case'); + const [actual] = scopeCase(await parsed.snakecase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase scope should succeed for "always snakecase"', async () => { - const [actual] = scopeCase(await parsed.snakecase, 'always', 'snake-case'); + const [actual] = scopeCase(await parsed.snakecase, "always", "snake-case"); const expected = true; expect(actual).toEqual(expected); }); test('with camelcase scope should fail for "always lowercase"', async () => { - const [actual] = scopeCase(await parsed.camelcase, 'always', 'lowercase'); + const [actual] = scopeCase(await parsed.camelcase, "always", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase scope should succeed for "always camelcase"', async () => { - const [actual] = scopeCase(await parsed.camelcase, 'always', 'camel-case'); + const [actual] = scopeCase(await parsed.camelcase, "always", "camel-case"); const expected = true; expect(actual).toEqual(expected); }); test('with camelcase scope should fail for "always kebabcase"', async () => { - const [actual] = scopeCase(await parsed.camelcase, 'always', 'kebab-case'); + const [actual] = scopeCase(await parsed.camelcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase scope should fail for "always pascalcase"', async () => { - const [actual] = scopeCase(await parsed.camelcase, 'always', 'pascal-case'); + const [actual] = scopeCase(await parsed.camelcase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase scope should fail for "always lowercase"', async () => { - const [actual] = scopeCase(await parsed.pascalcase, 'always', 'lowercase'); + const [actual] = scopeCase(await parsed.pascalcase, "always", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase scope should fail for "always kebabcase"', async () => { - const [actual] = scopeCase(await parsed.pascalcase, 'always', 'kebab-case'); + const [actual] = scopeCase(await parsed.pascalcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase scope should fail for "always camelcase"', async () => { - const [actual] = scopeCase(await parsed.pascalcase, 'always', 'camel-case'); + const [actual] = scopeCase(await parsed.pascalcase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase scope should succeed for "always pascalcase"', async () => { - const [actual] = scopeCase(await parsed.pascalcase, 'always', 'pascal-case'); + const [actual] = scopeCase(await parsed.pascalcase, "always", "pascal-case"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase scope should fail for "always uppercase"', async () => { - const [actual] = scopeCase(await parsed.mixedcase, 'always', 'uppercase'); + const [actual] = scopeCase(await parsed.mixedcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with uppercase scope should fail for "never uppercase"', async () => { - const [actual] = scopeCase(await parsed.uppercase, 'never', 'uppercase'); + const [actual] = scopeCase(await parsed.uppercase, "never", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with uppercase scope should succeed for "always uppercase"', async () => { - const [actual] = scopeCase(await parsed.uppercase, 'always', 'uppercase'); + const [actual] = scopeCase(await parsed.uppercase, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with uppercase scope should succeed for "always [uppercase, lowercase]"', async () => { - const [actual] = scopeCase(await parsed.uppercase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = scopeCase(await parsed.uppercase, "always", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with lowercase scope should succeed for "always [uppercase, lowercase]"', async () => { - const [actual] = scopeCase(await parsed.lowercase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = scopeCase(await parsed.lowercase, "always", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase scope should fail for "always [uppercase, lowercase]"', async () => { - const [actual] = scopeCase(await parsed.mixedcase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = scopeCase(await parsed.mixedcase, "always", [ + "uppercase", + "lowercase", ]); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase scope should pass for "always [uppercase, lowercase, camel-case]"', async () => { - const [actual] = scopeCase(await parsed.mixedcase, 'always', [ - 'uppercase', - 'lowercase', - 'camel-case', + const [actual] = scopeCase(await parsed.mixedcase, "always", [ + "uppercase", + "lowercase", + "camel-case", ]); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase scope should pass for "never [uppercase, lowercase]"', async () => { - const [actual] = scopeCase(await parsed.mixedcase, 'never', [ - 'uppercase', - 'lowercase', + const [actual] = scopeCase(await parsed.mixedcase, "never", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with uppercase scope should fail for "never [uppercase, lowercase]"', async () => { - const [actual] = scopeCase(await parsed.uppercase, 'never', [ - 'uppercase', - 'lowercase', + const [actual] = scopeCase(await parsed.uppercase, "never", [ + "uppercase", + "lowercase", ]); const expected = false; expect(actual).toEqual(expected); }); test('with slash in scope should succeed for "always pascal-case"', async () => { - const commit = await parse('feat(Modules/Graph): add Pie Chart'); - const [actual] = scopeCase(commit, 'always', 'pascal-case'); + const commit = await parse("feat(Modules/Graph): add Pie Chart"); + const [actual] = scopeCase(commit, "always", "pascal-case"); const expected = true; expect(actual).toEqual(expected); }); test('with slash in subject should succeed for "always sentence case"', async () => { - const commit = await parse('chore: Update @angular/core'); - const [actual] = scopeCase(commit, 'always', 'sentencecase'); + const commit = await parse("chore: Update @angular/core"); + const [actual] = scopeCase(commit, "always", "sentencecase"); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/scope-case.ts b/@commitlint/rules/src/scope-case.ts index 7544cc1fa0..c620086eff 100644 --- a/@commitlint/rules/src/scope-case.ts +++ b/@commitlint/rules/src/scope-case.ts @@ -1,24 +1,24 @@ -import {case as ensureCase} from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {TargetCaseType, SyncRule} from '@commitlint/types'; +import { case as ensureCase } from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { TargetCaseType, SyncRule } from "@commitlint/types"; -const negated = (when?: string) => when === 'never'; +const negated = (when?: string) => when === "never"; export const scopeCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( parsed, - when = 'always', - value = [] + when = "always", + value = [], ) => { - const {scope} = parsed; + const { scope } = parsed; if (!scope) { return [true]; } const checks = (Array.isArray(value) ? value : [value]).map((check) => { - if (typeof check === 'string') { + if (typeof check === "string") { return { - when: 'always', + when: "always", case: check, }; } @@ -32,13 +32,13 @@ export const scopeCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( const result = checks.some((check) => { const r = scopeSegments.every( - (segment) => delimiters.test(segment) || ensureCase(segment, check.case) + (segment) => delimiters.test(segment) || ensureCase(segment, check.case), ); return negated(check.when) ? !r : r; }); - const list = checks.map((c) => c.case).join(', '); + const list = checks.map((c) => c.case).join(", "); return [ negated(when) ? !result : result, diff --git a/@commitlint/rules/src/scope-empty.test.ts b/@commitlint/rules/src/scope-empty.test.ts index b4c535fdd4..88977f8c17 100644 --- a/@commitlint/rules/src/scope-empty.test.ts +++ b/@commitlint/rules/src/scope-empty.test.ts @@ -1,11 +1,11 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {scopeEmpty} from './scope-empty.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { scopeEmpty } from "./scope-empty.js"; const messages = { - plain: 'foo(bar): baz', - superfluous: 'foo(): baz', - empty: 'foo: baz', + plain: "foo(bar): baz", + superfluous: "foo(): baz", + empty: "foo: baz", }; const parsed = { @@ -14,56 +14,56 @@ const parsed = { empty: parse(messages.empty), }; -test('with plain message it should succeed for empty keyword', async () => { +test("with plain message it should succeed for empty keyword", async () => { const [actual] = scopeEmpty(await parsed.plain); const expected = true; expect(actual).toEqual(expected); }); test('with plain message it should succeed for "never"', async () => { - const [actual] = scopeEmpty(await parsed.plain, 'never'); + const [actual] = scopeEmpty(await parsed.plain, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with plain message it should fail for "always"', async () => { - const [actual] = scopeEmpty(await parsed.plain, 'always'); + const [actual] = scopeEmpty(await parsed.plain, "always"); const expected = false; expect(actual).toEqual(expected); }); -test('with superfluous message it should fail for empty keyword', async () => { +test("with superfluous message it should fail for empty keyword", async () => { const [actual] = scopeEmpty(await parsed.superfluous); const expected = false; expect(actual).toEqual(expected); }); test('with superfluous message it should fail for "never"', async () => { - const [actual] = scopeEmpty(await parsed.superfluous, 'never'); + const [actual] = scopeEmpty(await parsed.superfluous, "never"); const expected = false; expect(actual).toEqual(expected); }); test('with superfluous message it should fail for "always"', async () => { - const [actual] = scopeEmpty(await parsed.superfluous, 'always'); + const [actual] = scopeEmpty(await parsed.superfluous, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('with empty message it should fail for empty keyword', async () => { +test("with empty message it should fail for empty keyword", async () => { const [actual] = scopeEmpty(await parsed.empty); const expected = false; expect(actual).toEqual(expected); }); test('with empty message it should fail for "never"', async () => { - const [actual] = scopeEmpty(await parsed.empty, 'never'); + const [actual] = scopeEmpty(await parsed.empty, "never"); const expected = false; expect(actual).toEqual(expected); }); test('with empty message it should fail for "always"', async () => { - const [actual] = scopeEmpty(await parsed.empty, 'always'); + const [actual] = scopeEmpty(await parsed.empty, "always"); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/scope-empty.ts b/@commitlint/rules/src/scope-empty.ts index 3ea0fa1f81..d7a9bb0e2e 100644 --- a/@commitlint/rules/src/scope-empty.ts +++ b/@commitlint/rules/src/scope-empty.ts @@ -1,12 +1,12 @@ -import * as ensure from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import * as ensure from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; -export const scopeEmpty: SyncRule = (parsed, when = 'never') => { - const negated = when === 'always'; - const notEmpty = ensure.notEmpty(parsed.scope || ''); +export const scopeEmpty: SyncRule = (parsed, when = "never") => { + const negated = when === "always"; + const notEmpty = ensure.notEmpty(parsed.scope || ""); return [ negated ? !notEmpty : notEmpty, - message(['scope', negated ? 'must' : 'may not', 'be empty']), + message(["scope", negated ? "must" : "may not", "be empty"]), ]; }; diff --git a/@commitlint/rules/src/scope-enum.test.ts b/@commitlint/rules/src/scope-enum.test.ts index 184534b608..1e7fb7efa7 100644 --- a/@commitlint/rules/src/scope-enum.test.ts +++ b/@commitlint/rules/src/scope-enum.test.ts @@ -1,52 +1,52 @@ -import {describe, test, it, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {RuleConfigCondition} from '@commitlint/types'; +import { describe, test, it, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { RuleConfigCondition } from "@commitlint/types"; -import {scopeEnum} from './scope-enum.js'; +import { scopeEnum } from "./scope-enum.js"; const messagesByScope = { single: { - plain: 'foo(bar): baz', + plain: "foo(bar): baz", }, multiple: { - multiple: 'foo(bar,baz): qux', - multipleCommaSpace: 'foo(bar, baz): qux', - multipleSlash: 'foo(bar/baz): qux', + multiple: "foo(bar,baz): qux", + multipleCommaSpace: "foo(bar, baz): qux", + multipleSlash: "foo(bar/baz): qux", }, none: { - empty: 'foo: baz', - superfluous: 'foo(): baz', + empty: "foo: baz", + superfluous: "foo(): baz", }, }; -const {single, multiple, none} = messagesByScope; +const { single, multiple, none } = messagesByScope; const messages = Object.values(messagesByScope).reduce<Record<string, string>>( - (acc, curr) => ({...acc, ...curr}), - {} + (acc, curr) => ({ ...acc, ...curr }), + {}, ); -const conditions: RuleConfigCondition[] = ['always', 'never']; +const conditions: RuleConfigCondition[] = ["always", "never"]; -describe('Scope Enum Validation', () => { - describe.each(conditions)('condition: %s', (condition) => { - describe('Enum without Scopes', () => { +describe("Scope Enum Validation", () => { + describe.each(conditions)("condition: %s", (condition) => { + describe("Enum without Scopes", () => { test.each(Object.keys(messages))( `Succeeds with a %s message and '${condition}'`, async (messageType) => { const [actual, message] = scopeEnum( await parse(messages[messageType]), condition, - [] + [], ); const expected = true; expect(actual).toEqual(expected); - expect(message).toEqual(''); - } + expect(message).toEqual(""); + }, ); }); - describe('Messages without Scopes', () => { + describe("Messages without Scopes", () => { Object.keys(none).forEach((messageType) => { const fakeMessage = messages[messageType]; @@ -54,7 +54,7 @@ describe('Scope Enum Validation', () => { const [actual, message] = scopeEnum( await parse(fakeMessage), condition, - ['bar'] + ["bar"], ); expect(actual).toBeTruthy(); expect(message).toBeFalsy(); @@ -64,7 +64,7 @@ describe('Scope Enum Validation', () => { const [actual, message] = scopeEnum( await parse(fakeMessage), condition, - ['bar', 'baz'] + ["bar", "baz"], ); expect(actual).toBeTruthy(); expect(message).toBeFalsy(); @@ -73,134 +73,134 @@ describe('Scope Enum Validation', () => { }); }); - describe('Always', () => { - describe('Single-Scope Messages', () => { + describe("Always", () => { + describe("Single-Scope Messages", () => { Object.keys(single).forEach((messageType) => { const fakeMessage = messages[messageType]; it(`Succeeds with a '${messageType}' message when all message scopes are included in single-scope enum`, async () => { const [actual, message] = scopeEnum( await parse(fakeMessage), - 'always', - ['bar'] + "always", + ["bar"], ); expect(actual).toBeTruthy(); - expect(message).toEqual('scope must be one of [bar]'); + expect(message).toEqual("scope must be one of [bar]"); }); test(`Succeeds with a '${messageType}' message when all message scopes are included in multi-scope enum`, async () => { const [actual, message] = scopeEnum( await parse(fakeMessage), - 'always', - ['bar', 'baz'] + "always", + ["bar", "baz"], ); expect(actual).toBeTruthy(); - expect(message).toEqual('scope must be one of [bar, baz]'); + expect(message).toEqual("scope must be one of [bar, baz]"); }); test(`Fails with a '${messageType}' message when any message scope is not included in enum`, async () => { const [actual, message] = scopeEnum( await parse(fakeMessage), - 'always', - ['foo'] + "always", + ["foo"], ); expect(actual).toBeFalsy(); - expect(message).toEqual('scope must be one of [foo]'); + expect(message).toEqual("scope must be one of [foo]"); }); }); }); - describe('Multi-Scope Messages', () => { + describe("Multi-Scope Messages", () => { Object.keys(multiple).forEach((messageType) => { const fakeMessage = messages[messageType]; test(`Succeeds with a '${messageType}' message when all message scopes are included in enum`, async () => { const [actual, message] = scopeEnum( await parse(fakeMessage), - 'always', - ['bar', 'baz'] + "always", + ["bar", "baz"], ); expect(actual).toBeTruthy(); - expect(message).toEqual('scope must be one of [bar, baz]'); + expect(message).toEqual("scope must be one of [bar, baz]"); }); test(`Fails with a '${messageType}' message when no message scopes are included in enum`, async () => { const [actual, message] = scopeEnum( await parse(fakeMessage), - 'always', - ['foo'] + "always", + ["foo"], ); expect(actual).toBeFalsy(); - expect(message).toEqual('scope must be one of [foo]'); + expect(message).toEqual("scope must be one of [foo]"); }); it(`Fails with a '${messageType}' message when only some message scopes are included in enum`, async () => { const [actual, message] = scopeEnum( await parse(fakeMessage), - 'always', - ['bar'] + "always", + ["bar"], ); expect(actual).toBeFalsy(); - expect(message).toEqual('scope must be one of [bar]'); + expect(message).toEqual("scope must be one of [bar]"); }); }); test(`Succeeds with a 'multipleSlash' message when the scopes are included in enum`, async () => { const [actual, message] = scopeEnum( - await parse(messages['multipleSlash']), - 'always', - ['bar/baz'] + await parse(messages["multipleSlash"]), + "always", + ["bar/baz"], ); expect(actual).toBeTruthy(); - expect(message).toEqual('scope must be one of [bar/baz]'); + expect(message).toEqual("scope must be one of [bar/baz]"); }); }); }); - describe('Never', () => { - describe('Messages with Scopes', () => { - Object.keys({...single, ...multiple}).forEach((messageType) => { + describe("Never", () => { + describe("Messages with Scopes", () => { + Object.keys({ ...single, ...multiple }).forEach((messageType) => { const fakeMessage = messages[messageType]; test(`Succeeds with a '${messageType}' message when no message scopes are included in enum`, async () => { const [actual, message] = scopeEnum( await parse(fakeMessage), - 'never', - ['foo'] + "never", + ["foo"], ); expect(actual).toBeTruthy(); - expect(message).toEqual('scope must not be one of [foo]'); + expect(message).toEqual("scope must not be one of [foo]"); }); it(`Fails with a '${messageType}' message when any message scope is included in single-scope enum`, async () => { const [actual, message] = scopeEnum( await parse(fakeMessage), - 'never', - ['bar'] + "never", + ["bar"], ); expect(actual).toBeFalsy(); - expect(message).toEqual('scope must not be one of [bar]'); + expect(message).toEqual("scope must not be one of [bar]"); }); test(`Fails with a '${messageType}' message when any message scope is included in multi-scope enum`, async () => { const [actual, message] = scopeEnum( await parse(fakeMessage), - 'never', - ['bar', 'baz'] + "never", + ["bar", "baz"], ); expect(actual).toBeFalsy(); - expect(message).toEqual('scope must not be one of [bar, baz]'); + expect(message).toEqual("scope must not be one of [bar, baz]"); }); }); test(`Fails with a 'multipleSlash' message when the scopes are included in enum`, async () => { const [actual, message] = scopeEnum( - await parse(messages['multipleSlash']), - 'never', - ['bar/baz'] + await parse(messages["multipleSlash"]), + "never", + ["bar/baz"], ); expect(actual).toBeFalsy(); - expect(message).toEqual('scope must not be one of [bar/baz]'); + expect(message).toEqual("scope must not be one of [bar/baz]"); }); }); }); diff --git a/@commitlint/rules/src/scope-enum.ts b/@commitlint/rules/src/scope-enum.ts index d7f5957f45..59cef26df9 100644 --- a/@commitlint/rules/src/scope-enum.ts +++ b/@commitlint/rules/src/scope-enum.ts @@ -1,27 +1,27 @@ -import * as ensure from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import * as ensure from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; export const scopeEnum: SyncRule<string[]> = ( - {scope}, - when = 'always', - value = [] + { scope }, + when = "always", + value = [], ) => { if (!scope || !value.length) { - return [true, '']; + return [true, ""]; } // Scopes may contain slash or comma delimiters to separate them and mark them as individual segments. // This means that each of these segments should be tested separately with `ensure`. const delimiters = /\/|\\|, ?/g; const messageScopes = scope.split(delimiters); - const errorMessage = ['scope must', `be one of [${value.join(', ')}]`]; + const errorMessage = ["scope must", `be one of [${value.join(", ")}]`]; const isScopeInEnum = (scope: string) => ensure.enum(scope, value); let isValid; - if (when === 'never') { + if (when === "never") { isValid = !messageScopes.some(isScopeInEnum) && !isScopeInEnum(scope); - errorMessage.splice(1, 0, 'not'); + errorMessage.splice(1, 0, "not"); } else { isValid = messageScopes.every(isScopeInEnum) || isScopeInEnum(scope); } diff --git a/@commitlint/rules/src/scope-max-length.test.ts b/@commitlint/rules/src/scope-max-length.test.ts index c8535118bb..97e5e4f6fa 100644 --- a/@commitlint/rules/src/scope-max-length.test.ts +++ b/@commitlint/rules/src/scope-max-length.test.ts @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {scopeMaxLength} from './scope-max-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { scopeMaxLength } from "./scope-max-length.js"; -const short = 'a'; -const long = 'ab'; +const short = "a"; +const long = "ab"; const value = short.length; const messages = { - empty: 'test: \n', + empty: "test: \n", short: `test(${short}): \n`, long: `test(${long}): \n`, }; @@ -19,19 +19,19 @@ const parsed = { long: parse(messages.long), }; -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = scopeMaxLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should succeed', async () => { +test("with short should succeed", async () => { const [actual] = scopeMaxLength(await parsed.short, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with long should fail', async () => { +test("with long should fail", async () => { const [actual] = scopeMaxLength(await parsed.long, undefined, value); const expected = false; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/scope-max-length.ts b/@commitlint/rules/src/scope-max-length.ts index 917d548f91..bcdf6f81ce 100644 --- a/@commitlint/rules/src/scope-max-length.ts +++ b/@commitlint/rules/src/scope-max-length.ts @@ -1,10 +1,10 @@ -import {maxLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { maxLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const scopeMaxLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.scope; diff --git a/@commitlint/rules/src/scope-min-length.test.ts b/@commitlint/rules/src/scope-min-length.test.ts index 327f5de49d..3ff18920ec 100644 --- a/@commitlint/rules/src/scope-min-length.test.ts +++ b/@commitlint/rules/src/scope-min-length.test.ts @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {scopeMinLength} from './scope-min-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { scopeMinLength } from "./scope-min-length.js"; -const short = 'a'; -const long = 'ab'; +const short = "a"; +const long = "ab"; const value = long.length; const messages = { - empty: 'test:\n', + empty: "test:\n", short: `test(${short}): \n`, long: `test(${long}): \n`, }; @@ -19,19 +19,19 @@ const parsed = { long: parse(messages.long), }; -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = scopeMinLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should fail', async () => { +test("with short should fail", async () => { const [actual] = scopeMinLength(await parsed.short, undefined, value); const expected = false; expect(actual).toEqual(expected); }); -test('with long should succeed', async () => { +test("with long should succeed", async () => { const [actual] = scopeMinLength(await parsed.long, undefined, value); const expected = true; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/scope-min-length.ts b/@commitlint/rules/src/scope-min-length.ts index 55a69da3e9..40b4c909f9 100644 --- a/@commitlint/rules/src/scope-min-length.ts +++ b/@commitlint/rules/src/scope-min-length.ts @@ -1,10 +1,10 @@ -import {minLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { minLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const scopeMinLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.scope; if (!input) { diff --git a/@commitlint/rules/src/signed-off-by.test.ts b/@commitlint/rules/src/signed-off-by.test.ts index 469f40e7fa..d47353927a 100644 --- a/@commitlint/rules/src/signed-off-by.test.ts +++ b/@commitlint/rules/src/signed-off-by.test.ts @@ -1,9 +1,9 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {signedOffBy} from './signed-off-by.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { signedOffBy } from "./signed-off-by.js"; const messages = { - empty: 'test:\n', + empty: "test:\n", with: `test: subject\nbody\nfooter\nSigned-off-by:\n\n`, without: `test: subject\nbody\nfooter\n\n`, inSubject: `test: subject Signed-off-by:\nbody\nfooter\n\n`, @@ -29,25 +29,25 @@ const parsed = { }; test('empty against "always signed-off-by" should fail', async () => { - const [actual] = signedOffBy(await parsed.empty, 'always', 'Signed-off-by:'); + const [actual] = signedOffBy(await parsed.empty, "always", "Signed-off-by:"); const expected = false; expect(actual).toEqual(expected); }); test('empty against "never signed-off-by" should succeed', async () => { - const [actual] = signedOffBy(await parsed.empty, 'never', 'Signed-off-by:'); + const [actual] = signedOffBy(await parsed.empty, "never", "Signed-off-by:"); const expected = true; expect(actual).toEqual(expected); }); test('with against "always signed-off-by" should succeed', async () => { - const [actual] = signedOffBy(await parsed.with, 'always', 'Signed-off-by:'); + const [actual] = signedOffBy(await parsed.with, "always", "Signed-off-by:"); const expected = true; expect(actual).toEqual(expected); }); test('with against "never signed-off-by" should fail', async () => { - const [actual] = signedOffBy(await parsed.with, 'never', 'Signed-off-by:'); + const [actual] = signedOffBy(await parsed.with, "never", "Signed-off-by:"); const expected = false; expect(actual).toEqual(expected); }); @@ -55,24 +55,24 @@ test('with against "never signed-off-by" should fail', async () => { test('without against "always signed-off-by" should fail', async () => { const [actual] = signedOffBy( await parsed.without, - 'always', - 'Signed-off-by:' + "always", + "Signed-off-by:", ); const expected = false; expect(actual).toEqual(expected); }); test('without against "never signed-off-by" should succeed', async () => { - const [actual] = signedOffBy(await parsed.without, 'never', 'Signed-off-by:'); + const [actual] = signedOffBy(await parsed.without, "never", "Signed-off-by:"); const expected = true; expect(actual).toEqual(expected); }); -test('trailing comments should be ignored', async () => { +test("trailing comments should be ignored", async () => { const [actual] = signedOffBy( await parsed.withSignoffAndComments, - 'always', - 'Signed-off-by:' + "always", + "Signed-off-by:", ); const expected = true; expect(actual).toEqual(expected); @@ -81,8 +81,8 @@ test('trailing comments should be ignored', async () => { test('inSubject against "always signed-off-by" should fail', async () => { const [actual] = signedOffBy( await parsed.inSubject, - 'always', - 'Signed-off-by:' + "always", + "Signed-off-by:", ); const expected = false; expect(actual).toEqual(expected); @@ -91,21 +91,21 @@ test('inSubject against "always signed-off-by" should fail', async () => { test('inSubject against "never signed-off-by" should succeed', async () => { const [actual] = signedOffBy( await parsed.inSubject, - 'never', - 'Signed-off-by:' + "never", + "Signed-off-by:", ); const expected = true; expect(actual).toEqual(expected); }); test('inBody against "always signed-off-by" should fail', async () => { - const [actual] = signedOffBy(await parsed.inBody, 'always', 'Signed-off-by:'); + const [actual] = signedOffBy(await parsed.inBody, "always", "Signed-off-by:"); const expected = false; expect(actual).toEqual(expected); }); test('inBody against "never signed-off-by" should succeed', async () => { - const [actual] = signedOffBy(await parsed.inBody, 'never', 'Signed-off-by:'); + const [actual] = signedOffBy(await parsed.inBody, "never", "Signed-off-by:"); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/signed-off-by.ts b/@commitlint/rules/src/signed-off-by.ts index 0a30c03e23..5a53c32395 100644 --- a/@commitlint/rules/src/signed-off-by.ts +++ b/@commitlint/rules/src/signed-off-by.ts @@ -1,29 +1,29 @@ -import message from '@commitlint/message'; -import toLines from '@commitlint/to-lines'; -import {SyncRule} from '@commitlint/types'; +import message from "@commitlint/message"; +import toLines from "@commitlint/to-lines"; +import { SyncRule } from "@commitlint/types"; export const signedOffBy: SyncRule<string> = ( parsed, - when = 'always', - value = '' + when = "always", + value = "", ) => { const lines = toLines(parsed.raw).filter( (ln) => // skip comments - !ln.startsWith('#') && + !ln.startsWith("#") && // ignore empty lines - Boolean(ln) + Boolean(ln), ); const last = lines[lines.length - 1]; - const negated = when === 'never'; + const negated = when === "never"; const hasSignedOffBy = // empty commit message last ? last.startsWith(value) : false; return [ negated ? !hasSignedOffBy : hasSignedOffBy, - message(['message', negated ? 'must not' : 'must', 'be signed off']), + message(["message", negated ? "must not" : "must", "be signed off"]), ]; }; diff --git a/@commitlint/rules/src/subject-case.test.ts b/@commitlint/rules/src/subject-case.test.ts index 5c8281bda6..911b8d5321 100644 --- a/@commitlint/rules/src/subject-case.test.ts +++ b/@commitlint/rules/src/subject-case.test.ts @@ -1,28 +1,28 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {subjectCase} from './subject-case.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { subjectCase } from "./subject-case.js"; const messages = { - empty: 'test:\n', - numeric: 'test: 1.0.0', - lowercase: 'test: subject', - lowercase_unicode: 'test: тема', // Bulgarian for `subject` - mixedcase: 'test: sUbJeCt', - caseless: 'test: 这是一次提交', // Chinese for `this is a commit` - uppercase: 'test: SUBJECT', - uppercase_unicode: 'test: ÛNDERWERP', // Frisian for `SUBJECT` - camelcase: 'test: subJect', - camelcase_unicode: 'test: θέΜα', // Greek for `subJect` - kebabcase: 'test: sub-ject', - kebabcase_unicode: 'test: áb-har', // Irish for `sub-ject` - pascalcase: 'test: SubJect', - pascalcase_unicode: 'test: ТақыРып', // Kazakh for `SubJect` - snakecase: 'test: sub_ject', - snakecase_unicode: 'test: сэ_дэв', // Mongolian for `sub_ject` - startcase: 'test: Sub Ject', - startcase_unicode: 'test: Äm Ne', // Swedish for `Sub Ject` - sentencecase: 'test: Sub ject', - sentencecase_unicode: 'test: Мав зуъ', // Tajik for `Sub ject` + empty: "test:\n", + numeric: "test: 1.0.0", + lowercase: "test: subject", + lowercase_unicode: "test: тема", // Bulgarian for `subject` + mixedcase: "test: sUbJeCt", + caseless: "test: 这是一次提交", // Chinese for `this is a commit` + uppercase: "test: SUBJECT", + uppercase_unicode: "test: ÛNDERWERP", // Frisian for `SUBJECT` + camelcase: "test: subJect", + camelcase_unicode: "test: θέΜα", // Greek for `subJect` + kebabcase: "test: sub-ject", + kebabcase_unicode: "test: áb-har", // Irish for `sub-ject` + pascalcase: "test: SubJect", + pascalcase_unicode: "test: ТақыРып", // Kazakh for `SubJect` + snakecase: "test: sub_ject", + snakecase_unicode: "test: сэ_дэв", // Mongolian for `sub_ject` + startcase: "test: Sub Ject", + startcase_unicode: "test: Äm Ne", // Swedish for `Sub Ject` + sentencecase: "test: Sub ject", + sentencecase_unicode: "test: Мав зуъ", // Tajik for `Sub ject` }; const parsed = { @@ -49,37 +49,37 @@ const parsed = { }; test('with empty subject should succeed for "never lowercase"', async () => { - const [actual] = subjectCase(await parsed.empty, 'never', 'lowercase'); + const [actual] = subjectCase(await parsed.empty, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty subject should succeed for "always lowercase"', async () => { - const [actual] = subjectCase(await parsed.empty, 'always', 'lowercase'); + const [actual] = subjectCase(await parsed.empty, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty subject should succeed for "never uppercase"', async () => { - const [actual] = subjectCase(await parsed.empty, 'never', 'uppercase'); + const [actual] = subjectCase(await parsed.empty, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty subject should succeed for "always uppercase"', async () => { - const [actual] = subjectCase(await parsed.empty, 'always', 'uppercase'); + const [actual] = subjectCase(await parsed.empty, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with lowercase subject should fail for "never lowercase"', async () => { - const [actual] = subjectCase(await parsed.lowercase, 'never', 'lowercase'); + const [actual] = subjectCase(await parsed.lowercase, "never", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with lowercase subject should succeed for "always lowercase"', async () => { - const [actual] = subjectCase(await parsed.lowercase, 'always', 'lowercase'); + const [actual] = subjectCase(await parsed.lowercase, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); @@ -87,63 +87,63 @@ test('with lowercase subject should succeed for "always lowercase"', async () => test('with lowercase unicode subject should fail for "always uppercase"', async () => { const [actual] = subjectCase( await parsed.lowercase_unicode, - 'always', - 'upper-case' + "always", + "upper-case", ); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase subject should succeed for "never lowercase"', async () => { - const [actual] = subjectCase(await parsed.mixedcase, 'never', 'lowercase'); + const [actual] = subjectCase(await parsed.mixedcase, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase subject should fail for "always lowercase"', async () => { - const [actual] = subjectCase(await parsed.mixedcase, 'always', 'lowercase'); + const [actual] = subjectCase(await parsed.mixedcase, "always", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase subject should succeed for "never uppercase"', async () => { - const [actual] = subjectCase(await parsed.mixedcase, 'never', 'uppercase'); + const [actual] = subjectCase(await parsed.mixedcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase subject should fail for "always uppercase"', async () => { - const [actual] = subjectCase(await parsed.mixedcase, 'always', 'uppercase'); + const [actual] = subjectCase(await parsed.mixedcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with caseless subject should succeed for "never sentencecase"', async () => { - const [actual] = subjectCase(await parsed.caseless, 'never', 'sentence-case'); + const [actual] = subjectCase(await parsed.caseless, "never", "sentence-case"); const expected = true; expect(actual).toEqual(expected); }); test('with caseless subject should succeed for "never uppercase"', async () => { - const [actual] = subjectCase(await parsed.caseless, 'never', 'upper-case'); + const [actual] = subjectCase(await parsed.caseless, "never", "upper-case"); const expected = true; expect(actual).toEqual(expected); }); test('with caseless subject should succeed for "always uppercase"', async () => { - const [actual] = subjectCase(await parsed.caseless, 'always', 'upper-case'); + const [actual] = subjectCase(await parsed.caseless, "always", "upper-case"); const expected = true; expect(actual).toEqual(expected); }); test('with uppercase subject should fail for "never uppercase"', async () => { - const [actual] = subjectCase(await parsed.uppercase, 'never', 'uppercase'); + const [actual] = subjectCase(await parsed.uppercase, "never", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with uppercase subject should succeed for "always uppercase"', async () => { - const [actual] = subjectCase(await parsed.uppercase, 'always', 'uppercase'); + const [actual] = subjectCase(await parsed.uppercase, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); @@ -151,45 +151,45 @@ test('with uppercase subject should succeed for "always uppercase"', async () => test('with uppercase unicode subject should fail for "always lowercase"', async () => { const [actual] = subjectCase( await parsed.uppercase_unicode, - 'always', - 'lower-case' + "always", + "lower-case", ); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase subject should fail for "always uppercase"', async () => { - const [actual] = subjectCase(await parsed.camelcase, 'always', 'uppercase'); + const [actual] = subjectCase(await parsed.camelcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase subject should succeed for "never uppercase"', async () => { - const [actual] = subjectCase(await parsed.camelcase, 'never', 'uppercase'); + const [actual] = subjectCase(await parsed.camelcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with camelcase subject should fail for "always pascalcase"', async () => { - const [actual] = subjectCase(await parsed.camelcase, 'always', 'pascal-case'); + const [actual] = subjectCase(await parsed.camelcase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase subject should fail for "always kebabcase"', async () => { - const [actual] = subjectCase(await parsed.camelcase, 'always', 'kebab-case'); + const [actual] = subjectCase(await parsed.camelcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase subject should fail for "always snakecase"', async () => { - const [actual] = subjectCase(await parsed.camelcase, 'always', 'snake-case'); + const [actual] = subjectCase(await parsed.camelcase, "always", "snake-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase subject should succeed for "always camelcase"', async () => { - const [actual] = subjectCase(await parsed.camelcase, 'always', 'camel-case'); + const [actual] = subjectCase(await parsed.camelcase, "always", "camel-case"); const expected = true; expect(actual).toEqual(expected); }); @@ -197,8 +197,8 @@ test('with camelcase subject should succeed for "always camelcase"', async () => test('with camelcase unicode subject should fail for "always sentencecase"', async () => { const [actual] = subjectCase( await parsed.camelcase_unicode, - 'always', - 'sentence-case' + "always", + "sentence-case", ); const expected = false; expect(actual).toEqual(expected); @@ -207,21 +207,21 @@ test('with camelcase unicode subject should fail for "always sentencecase"', asy test('with kebabcase unicode subject should fail for "always camelcase"', async () => { const [actual] = subjectCase( await parsed.kebabcase_unicode, - 'always', - 'camel-case' + "always", + "camel-case", ); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase subject should fail for "always uppercase"', async () => { - const [actual] = subjectCase(await parsed.pascalcase, 'always', 'uppercase'); + const [actual] = subjectCase(await parsed.pascalcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase subject should succeed for "never uppercase"', async () => { - const [actual] = subjectCase(await parsed.pascalcase, 'never', 'uppercase'); + const [actual] = subjectCase(await parsed.pascalcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); @@ -229,27 +229,27 @@ test('with pascalcase subject should succeed for "never uppercase"', async () => test('with pascalcase subject should succeed for "always pascalcase"', async () => { const [actual] = subjectCase( await parsed.pascalcase, - 'always', - 'pascal-case' + "always", + "pascal-case", ); const expected = true; expect(actual).toEqual(expected); }); test('with pascalcase subject should fail for "always kebabcase"', async () => { - const [actual] = subjectCase(await parsed.pascalcase, 'always', 'kebab-case'); + const [actual] = subjectCase(await parsed.pascalcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase subject should fail for "always snakecase"', async () => { - const [actual] = subjectCase(await parsed.pascalcase, 'always', 'snake-case'); + const [actual] = subjectCase(await parsed.pascalcase, "always", "snake-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase subject should fail for "always camelcase"', async () => { - const [actual] = subjectCase(await parsed.pascalcase, 'always', 'camel-case'); + const [actual] = subjectCase(await parsed.pascalcase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); @@ -257,45 +257,45 @@ test('with pascalcase subject should fail for "always camelcase"', async () => { test('with pascalcase unicode subject should fail for "always uppercase"', async () => { const [actual] = subjectCase( await parsed.pascalcase_unicode, - 'always', - 'upper-case' + "always", + "upper-case", ); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase subject should fail for "always uppercase"', async () => { - const [actual] = subjectCase(await parsed.snakecase, 'always', 'uppercase'); + const [actual] = subjectCase(await parsed.snakecase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase subject should succeed for "never uppercase"', async () => { - const [actual] = subjectCase(await parsed.snakecase, 'never', 'uppercase'); + const [actual] = subjectCase(await parsed.snakecase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with snakecase subject should fail for "always pascalcase"', async () => { - const [actual] = subjectCase(await parsed.snakecase, 'always', 'pascal-case'); + const [actual] = subjectCase(await parsed.snakecase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase subject should fail for "always kebabcase"', async () => { - const [actual] = subjectCase(await parsed.snakecase, 'always', 'kebab-case'); + const [actual] = subjectCase(await parsed.snakecase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase subject should succeed for "always snakecase"', async () => { - const [actual] = subjectCase(await parsed.snakecase, 'always', 'snake-case'); + const [actual] = subjectCase(await parsed.snakecase, "always", "snake-case"); const expected = true; expect(actual).toEqual(expected); }); test('with snakecase subject should fail for "always camelcase"', async () => { - const [actual] = subjectCase(await parsed.snakecase, 'always', 'camel-case'); + const [actual] = subjectCase(await parsed.snakecase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); @@ -303,51 +303,51 @@ test('with snakecase subject should fail for "always camelcase"', async () => { test('with snakecase unicode subject should fail for "never lowercase"', async () => { const [actual] = subjectCase( await parsed.snakecase_unicode, - 'never', - 'lower-case' + "never", + "lower-case", ); const expected = false; expect(actual).toEqual(expected); }); test('with startcase subject should fail for "always uppercase"', async () => { - const [actual] = subjectCase(await parsed.startcase, 'always', 'uppercase'); + const [actual] = subjectCase(await parsed.startcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase subject should succeed for "never uppercase"', async () => { - const [actual] = subjectCase(await parsed.startcase, 'never', 'uppercase'); + const [actual] = subjectCase(await parsed.startcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with startcase subject should fail for "always pascalcase"', async () => { - const [actual] = subjectCase(await parsed.startcase, 'always', 'pascal-case'); + const [actual] = subjectCase(await parsed.startcase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase subject should fail for "always kebabcase"', async () => { - const [actual] = subjectCase(await parsed.startcase, 'always', 'kebab-case'); + const [actual] = subjectCase(await parsed.startcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase subject should fail for "always snakecase"', async () => { - const [actual] = subjectCase(await parsed.startcase, 'always', 'snake-case'); + const [actual] = subjectCase(await parsed.startcase, "always", "snake-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase subject should fail for "always camelcase"', async () => { - const [actual] = subjectCase(await parsed.startcase, 'always', 'camel-case'); + const [actual] = subjectCase(await parsed.startcase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase subject should succeed for "always startcase"', async () => { - const [actual] = subjectCase(await parsed.startcase, 'always', 'start-case'); + const [actual] = subjectCase(await parsed.startcase, "always", "start-case"); const expected = true; expect(actual).toEqual(expected); }); @@ -355,8 +355,8 @@ test('with startcase subject should succeed for "always startcase"', async () => test('with startcase unicode subject should fail for "always pascalcase"', async () => { const [actual] = subjectCase( await parsed.startcase_unicode, - 'always', - 'pascal-case' + "always", + "pascal-case", ); const expected = false; expect(actual).toEqual(expected); @@ -365,8 +365,8 @@ test('with startcase unicode subject should fail for "always pascalcase"', async test('with sentencecase subject should succeed for "always sentence-case"', async () => { const [actual] = subjectCase( await parsed.sentencecase, - 'always', - 'sentence-case' + "always", + "sentence-case", ); const expected = true; expect(actual).toEqual(expected); @@ -375,8 +375,8 @@ test('with sentencecase subject should succeed for "always sentence-case"', asyn test('with sentencecase subject should fail for "never sentencecase"', async () => { const [actual] = subjectCase( await parsed.sentencecase, - 'never', - 'sentence-case' + "never", + "sentence-case", ); const expected = false; expect(actual).toEqual(expected); @@ -385,8 +385,8 @@ test('with sentencecase subject should fail for "never sentencecase"', async () test('with sentencecase subject should fail for "always pascalcase"', async () => { const [actual] = subjectCase( await parsed.sentencecase, - 'always', - 'pascal-case' + "always", + "pascal-case", ); const expected = false; expect(actual).toEqual(expected); @@ -395,8 +395,8 @@ test('with sentencecase subject should fail for "always pascalcase"', async () = test('with sentencecase subject should succeed for "never camelcase"', async () => { const [actual] = subjectCase( await parsed.sentencecase, - 'never', - 'camel-case' + "never", + "camel-case", ); const expected = true; expect(actual).toEqual(expected); @@ -405,8 +405,8 @@ test('with sentencecase subject should succeed for "never camelcase"', async () test('with sentencecase unicode subject should fail for "always camelcase"', async () => { const [actual] = subjectCase( await parsed.sentencecase_unicode, - 'always', - 'camel-case' + "always", + "camel-case", ); const expected = false; expect(actual).toEqual(expected); @@ -415,96 +415,96 @@ test('with sentencecase unicode subject should fail for "always camelcase"', asy test('should use expected message with "always"', async () => { const [, message] = subjectCase( await parsed.uppercase, - 'always', - 'lower-case' + "always", + "lower-case", ); - expect(message).toContain('must be lower-case'); + expect(message).toContain("must be lower-case"); }); test('should use expected message with "never"', async () => { const [, message] = subjectCase( await parsed.uppercase, - 'never', - 'upper-case' + "never", + "upper-case", ); - expect(message).toContain('must not be upper-case'); + expect(message).toContain("must not be upper-case"); }); test('with uppercase scope should succeed for "always [uppercase, lowercase]"', async () => { - const [actual] = subjectCase(await parsed.uppercase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = subjectCase(await parsed.uppercase, "always", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with lowercase subject should succeed for "always [uppercase, lowercase]"', async () => { - const [actual] = subjectCase(await parsed.lowercase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = subjectCase(await parsed.lowercase, "always", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase subject should fail for "always [uppercase, lowercase]"', async () => { - const [actual] = subjectCase(await parsed.mixedcase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = subjectCase(await parsed.mixedcase, "always", [ + "uppercase", + "lowercase", ]); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase subject should pass for "always [uppercase, lowercase, camel-case]"', async () => { - const [actual] = subjectCase(await parsed.mixedcase, 'always', [ - 'uppercase', - 'lowercase', - 'camel-case', + const [actual] = subjectCase(await parsed.mixedcase, "always", [ + "uppercase", + "lowercase", + "camel-case", ]); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase scope should pass for "never [uppercase, lowercase]"', async () => { - const [actual] = subjectCase(await parsed.mixedcase, 'never', [ - 'uppercase', - 'lowercase', + const [actual] = subjectCase(await parsed.mixedcase, "never", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with uppercase scope should fail for "never [uppercase, lowercase]"', async () => { - const [actual] = subjectCase(await parsed.uppercase, 'never', [ - 'uppercase', - 'lowercase', + const [actual] = subjectCase(await parsed.uppercase, "never", [ + "uppercase", + "lowercase", ]); const expected = false; expect(actual).toEqual(expected); }); test('with numeric subject should succeed for "never lowercase"', async () => { - const [actual] = subjectCase(await parsed.numeric, 'never', 'lowercase'); + const [actual] = subjectCase(await parsed.numeric, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with numeric subject should succeed for "always lowercase"', async () => { - const [actual] = subjectCase(await parsed.numeric, 'always', 'lowercase'); + const [actual] = subjectCase(await parsed.numeric, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with numeric subject should succeed for "never uppercase"', async () => { - const [actual] = subjectCase(await parsed.numeric, 'never', 'uppercase'); + const [actual] = subjectCase(await parsed.numeric, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with numeric subject should succeed for "always uppercase"', async () => { - const [actual] = subjectCase(await parsed.numeric, 'always', 'uppercase'); + const [actual] = subjectCase(await parsed.numeric, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/subject-case.ts b/@commitlint/rules/src/subject-case.ts index 13e7de850a..c5bfa610b7 100644 --- a/@commitlint/rules/src/subject-case.ts +++ b/@commitlint/rules/src/subject-case.ts @@ -1,6 +1,6 @@ -import {case as ensureCase} from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {TargetCaseType, SyncRule} from '@commitlint/types'; +import { case as ensureCase } from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { TargetCaseType, SyncRule } from "@commitlint/types"; /** * Since the rule requires first symbol of a subject to be a letter, use @@ -19,23 +19,23 @@ import {TargetCaseType, SyncRule} from '@commitlint/types'; */ const startsWithLetterRegex = /^[\p{Ll}\p{Lu}\p{Lt}]/iu; -const negated = (when?: string) => when === 'never'; +const negated = (when?: string) => when === "never"; export const subjectCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( parsed, - when = 'always', - value = [] + when = "always", + value = [], ) => { - const {subject} = parsed; + const { subject } = parsed; - if (typeof subject !== 'string' || !subject.match(startsWithLetterRegex)) { + if (typeof subject !== "string" || !subject.match(startsWithLetterRegex)) { return [true]; } const checks = (Array.isArray(value) ? value : [value]).map((check) => { - if (typeof check === 'string') { + if (typeof check === "string") { return { - when: 'always', + when: "always", case: check, }; } @@ -47,7 +47,7 @@ export const subjectCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( return negated(check.when) ? !r : r; }); - const list = checks.map((c) => c.case).join(', '); + const list = checks.map((c) => c.case).join(", "); return [ negated(when) ? !result : result, diff --git a/@commitlint/rules/src/subject-empty.test.ts b/@commitlint/rules/src/subject-empty.test.ts index dca594d9ed..e8c6440c84 100644 --- a/@commitlint/rules/src/subject-empty.test.ts +++ b/@commitlint/rules/src/subject-empty.test.ts @@ -1,10 +1,10 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {subjectEmpty} from './subject-empty.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { subjectEmpty } from "./subject-empty.js"; const messages = { - empty: 'test: \nbody', - filled: 'test: subject\nbody', + empty: "test: \nbody", + filled: "test: subject\nbody", }; const parsed = { @@ -12,38 +12,38 @@ const parsed = { filled: parse(messages.filled), }; -test('without subject should succeed for empty keyword', async () => { +test("without subject should succeed for empty keyword", async () => { const [actual] = subjectEmpty(await parsed.empty); const expected = true; expect(actual).toEqual(expected); }); test('without subject should fail for "never"', async () => { - const [actual] = subjectEmpty(await parsed.empty, 'never'); + const [actual] = subjectEmpty(await parsed.empty, "never"); const expected = false; expect(actual).toEqual(expected); }); test('without subject should succeed for "always"', async () => { - const [actual] = subjectEmpty(await parsed.empty, 'always'); + const [actual] = subjectEmpty(await parsed.empty, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('with subject fail for empty keyword', async () => { +test("with subject fail for empty keyword", async () => { const [actual] = subjectEmpty(await parsed.filled); const expected = false; expect(actual).toEqual(expected); }); test('with subject succeed for "never"', async () => { - const [actual] = subjectEmpty(await parsed.filled, 'never'); + const [actual] = subjectEmpty(await parsed.filled, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with subject fail for "always"', async () => { - const [actual] = subjectEmpty(await parsed.filled, 'always'); + const [actual] = subjectEmpty(await parsed.filled, "always"); const expected = false; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/subject-empty.ts b/@commitlint/rules/src/subject-empty.ts index fc94daefcb..d489b2c3ab 100644 --- a/@commitlint/rules/src/subject-empty.ts +++ b/@commitlint/rules/src/subject-empty.ts @@ -1,13 +1,13 @@ -import * as ensure from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import * as ensure from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; -export const subjectEmpty: SyncRule = (parsed, when = 'always') => { - const negated = when === 'never'; - const notEmpty = ensure.notEmpty(parsed.subject || ''); +export const subjectEmpty: SyncRule = (parsed, when = "always") => { + const negated = when === "never"; + const notEmpty = ensure.notEmpty(parsed.subject || ""); return [ negated ? notEmpty : !notEmpty, - message(['subject', negated ? 'may not' : 'must', 'be empty']), + message(["subject", negated ? "may not" : "must", "be empty"]), ]; }; diff --git a/@commitlint/rules/src/subject-exclamation-mark.test.ts b/@commitlint/rules/src/subject-exclamation-mark.test.ts index ef1a9b2e28..55e47d0e7a 100644 --- a/@commitlint/rules/src/subject-exclamation-mark.test.ts +++ b/@commitlint/rules/src/subject-exclamation-mark.test.ts @@ -1,17 +1,17 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; // @ts-expect-error -- no typings -import preset from 'conventional-changelog-angular'; +import preset from "conventional-changelog-angular"; -import {subjectExclamationMark} from './subject-exclamation-mark.js'; +import { subjectExclamationMark } from "./subject-exclamation-mark.js"; const parseMessage = async (str: string) => { - const {parserOpts} = await preset(); + const { parserOpts } = await preset(); return parse(str, undefined, parserOpts); }; const messages = { - empty: 'test:\n', + empty: "test:\n", with: `test!: subject\n`, without: `test: subject\n`, }; @@ -23,37 +23,37 @@ const parsed = { }; test('empty against "always" should fail', async () => { - const [actual] = subjectExclamationMark(await parsed.empty, 'always'); + const [actual] = subjectExclamationMark(await parsed.empty, "always"); const expected = false; expect(actual).toEqual(expected); }); test('empty against "never" should succeed', async () => { - const [actual] = subjectExclamationMark(await parsed.empty, 'never'); + const [actual] = subjectExclamationMark(await parsed.empty, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with against "always" should succeed', async () => { - const [actual] = subjectExclamationMark(await parsed.with, 'always'); + const [actual] = subjectExclamationMark(await parsed.with, "always"); const expected = true; expect(actual).toEqual(expected); }); test('with against "never" should fail', async () => { - const [actual] = subjectExclamationMark(await parsed.with, 'never'); + const [actual] = subjectExclamationMark(await parsed.with, "never"); const expected = false; expect(actual).toEqual(expected); }); test('without against "always" should fail', async () => { - const [actual] = subjectExclamationMark(await parsed.without, 'always'); + const [actual] = subjectExclamationMark(await parsed.without, "always"); const expected = false; expect(actual).toEqual(expected); }); test('without against "never" should succeed', async () => { - const [actual] = subjectExclamationMark(await parsed.without, 'never'); + const [actual] = subjectExclamationMark(await parsed.without, "never"); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/subject-exclamation-mark.ts b/@commitlint/rules/src/subject-exclamation-mark.ts index 11cc29b590..886d142f9c 100644 --- a/@commitlint/rules/src/subject-exclamation-mark.ts +++ b/@commitlint/rules/src/subject-exclamation-mark.ts @@ -1,21 +1,21 @@ -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; -export const subjectExclamationMark: SyncRule = (parsed, when = 'always') => { +export const subjectExclamationMark: SyncRule = (parsed, when = "always") => { const input = parsed.header; if (!input) { - return [true, '']; + return [true, ""]; } - const negated = when === 'never'; - const hasExclamationMark = /!:/.test(input); + const negated = when === "never"; + const hasExclamationMark = /^(\w*)(?:\((.*)\))?!: (.*)$/.test(input); return [ negated ? !hasExclamationMark : hasExclamationMark, message([ - 'subject', - negated ? 'must not' : 'must', - 'have an exclamation mark in the subject to identify a breaking change', + "subject", + negated ? "must not" : "must", + "have an exclamation mark in the subject to identify a breaking change", ]), ]; }; diff --git a/@commitlint/rules/src/subject-full-stop.test.ts b/@commitlint/rules/src/subject-full-stop.test.ts index d787a537f8..344f65652b 100644 --- a/@commitlint/rules/src/subject-full-stop.test.ts +++ b/@commitlint/rules/src/subject-full-stop.test.ts @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {subjectFullStop} from './subject-full-stop.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { subjectFullStop } from "./subject-full-stop.js"; const messages = { - empty: 'test:\n', + empty: "test:\n", with: `test: subject.\n`, without: `test: subject\n`, standardScopeWith: `type(scope): subject.\n`, - nonStandardScopeWith: 'type.scope: subject.\n', - ellipsisMessage: 'test: subject ends with ellipsis...', + nonStandardScopeWith: "type.scope: subject.\n", + ellipsisMessage: "test: subject ends with ellipsis...", }; const parsed = { @@ -21,37 +21,37 @@ const parsed = { }; test('empty against "always" should succeed', async () => { - const [actual] = subjectFullStop(await parsed.empty, 'always', '.'); + const [actual] = subjectFullStop(await parsed.empty, "always", "."); const expected = true; expect(actual).toEqual(expected); }); test('empty against "never ." should succeed', async () => { - const [actual] = subjectFullStop(await parsed.empty, 'never', '.'); + const [actual] = subjectFullStop(await parsed.empty, "never", "."); const expected = true; expect(actual).toEqual(expected); }); test('with against "always ." should succeed', async () => { - const [actual] = subjectFullStop(await parsed.with, 'always', '.'); + const [actual] = subjectFullStop(await parsed.with, "always", "."); const expected = true; expect(actual).toEqual(expected); }); test('with against "never ." should fail', async () => { - const [actual] = subjectFullStop(await parsed.with, 'never', '.'); + const [actual] = subjectFullStop(await parsed.with, "never", "."); const expected = false; expect(actual).toEqual(expected); }); test('without against "always ." should fail', async () => { - const [actual] = subjectFullStop(await parsed.without, 'always', '.'); + const [actual] = subjectFullStop(await parsed.without, "always", "."); const expected = false; expect(actual).toEqual(expected); }); test('without against "never ." should succeed', async () => { - const [actual] = subjectFullStop(await parsed.without, 'never', '.'); + const [actual] = subjectFullStop(await parsed.without, "never", "."); const expected = true; expect(actual).toEqual(expected); }); @@ -59,8 +59,8 @@ test('without against "never ." should succeed', async () => { test('commit message title with standard scope and full-stop against "never ." should fail', async () => { const [actual] = subjectFullStop( await parsed.standardScopeWith, - 'never', - '.' + "never", + ".", ); const expected = false; expect(actual).toEqual(expected); @@ -69,15 +69,15 @@ test('commit message title with standard scope and full-stop against "never ." s test('commit message title with non standard scope and full-stop against "never ." should fail', async () => { const [actual] = subjectFullStop( await parsed.nonStandardScopeWith, - 'never', - '.' + "never", + ".", ); const expected = false; expect(actual).toEqual(expected); }); test('ellipsis is not fullstop so commit title ending with it against "never ." should not fail', async () => { - const [actual] = subjectFullStop(await parsed.ellipsisMessage, 'never', '.'); + const [actual] = subjectFullStop(await parsed.ellipsisMessage, "never", "."); const expected = true; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/subject-full-stop.ts b/@commitlint/rules/src/subject-full-stop.ts index 1b4acd88cb..6f1eed4aef 100644 --- a/@commitlint/rules/src/subject-full-stop.ts +++ b/@commitlint/rules/src/subject-full-stop.ts @@ -1,26 +1,26 @@ -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; export const subjectFullStop: SyncRule<string> = ( parsed, - when = 'always', - value = '.' + when = "always", + value = ".", ) => { - const colonIndex = parsed.header?.indexOf(':') || 0; + const colonIndex = parsed.header?.indexOf(":") || 0; if (colonIndex > 0 && colonIndex === parsed.header!.length - 1) { return [true]; } const input = parsed.header; - const negated = when === 'never'; + const negated = when === "never"; let hasStop = input?.[input.length - 1] === value; - if (input?.slice(-3) === '...') { + if (input?.slice(-3) === "...") { hasStop = false; } return [ negated ? !hasStop : hasStop, - message(['subject', negated ? 'may not' : 'must', 'end with full stop']), + message(["subject", negated ? "may not" : "must", "end with full stop"]), ]; }; diff --git a/@commitlint/rules/src/subject-max-length.test.ts b/@commitlint/rules/src/subject-max-length.test.ts index 0cffa76800..c89b8c246d 100644 --- a/@commitlint/rules/src/subject-max-length.test.ts +++ b/@commitlint/rules/src/subject-max-length.test.ts @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {subjectMaxLength} from './subject-max-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { subjectMaxLength } from "./subject-max-length.js"; -const short = 'a'; -const long = 'ab'; +const short = "a"; +const long = "ab"; const value = short.length; const messages = { - empty: 'test:\n', + empty: "test:\n", short: `test: ${short}\n`, long: `test: ${long}\n`, }; @@ -19,19 +19,19 @@ const parsed = { long: parse(messages.long), }; -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = subjectMaxLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should succeed', async () => { +test("with short should succeed", async () => { const [actual] = subjectMaxLength(await parsed.short, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with long should fail', async () => { +test("with long should fail", async () => { const [actual] = subjectMaxLength(await parsed.long, undefined, value); const expected = false; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/subject-max-length.ts b/@commitlint/rules/src/subject-max-length.ts index 86d27ed60c..ca2c148cfa 100644 --- a/@commitlint/rules/src/subject-max-length.ts +++ b/@commitlint/rules/src/subject-max-length.ts @@ -1,10 +1,10 @@ -import {maxLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { maxLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const subjectMaxLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.subject; diff --git a/@commitlint/rules/src/subject-min-length.test.ts b/@commitlint/rules/src/subject-min-length.test.ts index fa22f8c0b8..d269f6e22a 100644 --- a/@commitlint/rules/src/subject-min-length.test.ts +++ b/@commitlint/rules/src/subject-min-length.test.ts @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {subjectMinLength} from './subject-min-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { subjectMinLength } from "./subject-min-length.js"; -const short = 'a'; -const long = 'ab'; +const short = "a"; +const long = "ab"; const value = long.length; const messages = { - empty: 'test:\n', + empty: "test:\n", short: `test: ${short}\n`, long: `test: ${long}\n`, }; @@ -19,19 +19,19 @@ const parsed = { long: parse(messages.long), }; -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = subjectMinLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should fail', async () => { +test("with short should fail", async () => { const [actual] = subjectMinLength(await parsed.short, undefined, value); const expected = false; expect(actual).toEqual(expected); }); -test('with long should succeed', async () => { +test("with long should succeed", async () => { const [actual] = subjectMinLength(await parsed.long, undefined, value); const expected = true; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/subject-min-length.ts b/@commitlint/rules/src/subject-min-length.ts index 98310a4fb3..b0835e8159 100644 --- a/@commitlint/rules/src/subject-min-length.ts +++ b/@commitlint/rules/src/subject-min-length.ts @@ -1,10 +1,10 @@ -import {minLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { minLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const subjectMinLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.subject; if (!input) { diff --git a/@commitlint/rules/src/trailer-exists.test.ts b/@commitlint/rules/src/trailer-exists.test.ts index dd959a08a3..c090ad7b11 100644 --- a/@commitlint/rules/src/trailer-exists.test.ts +++ b/@commitlint/rules/src/trailer-exists.test.ts @@ -1,9 +1,9 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {trailerExists} from './trailer-exists.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { trailerExists } from "./trailer-exists.js"; const messages = { - empty: 'test:\n', + empty: "test:\n", with: `test: subject\n\nbody\n\nfooter\n\nSigned-off-by:\n\n`, without: `test: subject\n\nbody\n\nfooter\n\n`, inSubject: `test: subject Signed-off-by:\n\nbody\n\nfooter\n\n`, @@ -33,8 +33,8 @@ const parsed = { test('empty against "always trailer-exists" should fail', async () => { const [actual] = trailerExists( await parsed.empty, - 'always', - 'Signed-off-by:' + "always", + "Signed-off-by:", ); const expected = false; @@ -42,19 +42,19 @@ test('empty against "always trailer-exists" should fail', async () => { }); test('empty against "never trailer-exists" should succeed', async () => { - const [actual] = trailerExists(await parsed.empty, 'never', 'Signed-off-by:'); + const [actual] = trailerExists(await parsed.empty, "never", "Signed-off-by:"); const expected = true; expect(actual).toEqual(expected); }); test('with against "always trailer-exists" should succeed', async () => { - const [actual] = trailerExists(await parsed.with, 'always', 'Signed-off-by:'); + const [actual] = trailerExists(await parsed.with, "always", "Signed-off-by:"); const expected = true; expect(actual).toEqual(expected); }); test('with against "never trailer-exists" should fail', async () => { - const [actual] = trailerExists(await parsed.with, 'never', 'Signed-off-by:'); + const [actual] = trailerExists(await parsed.with, "never", "Signed-off-by:"); const expected = false; expect(actual).toEqual(expected); }); @@ -62,8 +62,8 @@ test('with against "never trailer-exists" should fail', async () => { test('without against "always trailer-exists" should fail', async () => { const [actual] = trailerExists( await parsed.without, - 'always', - 'Signed-off-by:' + "always", + "Signed-off-by:", ); const expected = false; @@ -73,19 +73,19 @@ test('without against "always trailer-exists" should fail', async () => { test('without against "never trailer-exists" should succeed', async () => { const [actual] = trailerExists( await parsed.without, - 'never', - 'Signed-off-by:' + "never", + "Signed-off-by:", ); const expected = true; expect(actual).toEqual(expected); }); -test('comments and other trailers should be ignored', async () => { +test("comments and other trailers should be ignored", async () => { const [actual] = trailerExists( await parsed.withSignoffAndNoise, - 'always', - 'Signed-off-by:' + "always", + "Signed-off-by:", ); const expected = true; @@ -95,8 +95,8 @@ test('comments and other trailers should be ignored', async () => { test('inSubject against "always trailer-exists" should fail', async () => { const [actual] = trailerExists( await parsed.inSubject, - 'always', - 'Signed-off-by:' + "always", + "Signed-off-by:", ); const expected = false; @@ -106,8 +106,8 @@ test('inSubject against "always trailer-exists" should fail', async () => { test('inSubject against "never trailer-exists" should succeed', async () => { const [actual] = trailerExists( await parsed.inSubject, - 'never', - 'Signed-off-by:' + "never", + "Signed-off-by:", ); const expected = true; @@ -117,8 +117,8 @@ test('inSubject against "never trailer-exists" should succeed', async () => { test('inBody against "always trailer-exists" should fail', async () => { const [actual] = trailerExists( await parsed.inBody, - 'always', - 'Signed-off-by:' + "always", + "Signed-off-by:", ); const expected = false; @@ -128,8 +128,8 @@ test('inBody against "always trailer-exists" should fail', async () => { test('inBody against "never trailer-exists" should succeed', async () => { const [actual] = trailerExists( await parsed.inBody, - 'never', - 'Signed-off-by:' + "never", + "Signed-off-by:", ); const expected = true; diff --git a/@commitlint/rules/src/trailer-exists.ts b/@commitlint/rules/src/trailer-exists.ts index 8ca7f7ae56..3dc516767e 100644 --- a/@commitlint/rules/src/trailer-exists.ts +++ b/@commitlint/rules/src/trailer-exists.ts @@ -1,30 +1,30 @@ -import {spawnSync} from 'child_process'; -import message from '@commitlint/message'; -import toLines from '@commitlint/to-lines'; -import {SyncRule} from '@commitlint/types'; +import { spawnSync } from "node:child_process"; +import message from "@commitlint/message"; +import toLines from "@commitlint/to-lines"; +import { SyncRule } from "@commitlint/types"; export const trailerExists: SyncRule<string> = ( parsed, - when = 'always', - value = '' + when = "always", + value = "", ) => { - const trailers = spawnSync('git', ['interpret-trailers', '--parse'], { - input: parsed.raw || '', + const trailers = spawnSync("git", ["interpret-trailers", "--parse"], { + input: parsed.raw || "", }).stdout; const matches = toLines(trailers.toString()).filter((ln) => - ln.startsWith(value) + ln.startsWith(value), ).length; - const negated = when === 'never'; + const negated = when === "never"; const hasTrailer = matches > 0; return [ negated ? !hasTrailer : hasTrailer, message([ - 'message', - negated ? 'must not' : 'must', - 'have `' + value + '` trailer', + "message", + negated ? "must not" : "must", + "have `" + value + "` trailer", ]), ]; }; diff --git a/@commitlint/rules/src/type-case.test.ts b/@commitlint/rules/src/type-case.test.ts index 79ab7b8f98..b482e53cc0 100644 --- a/@commitlint/rules/src/type-case.test.ts +++ b/@commitlint/rules/src/type-case.test.ts @@ -1,17 +1,17 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {typeCase} from './type-case.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { typeCase } from "./type-case.js"; const messages = { - empty: '(scope): subject', - lowercase: 'type: subject', - mixedcase: 'tYpE: subject', - uppercase: 'TYPE: subject', - camelcase: 'tyPe: subject', - pascalcase: 'TyPe: subject', - snakecase: 'ty_pe: subject', - kebabcase: 'ty-pe: subject', - startcase: 'Ty Pe: subject', + empty: "(scope): subject", + lowercase: "type: subject", + mixedcase: "tYpE: subject", + uppercase: "TYPE: subject", + camelcase: "tyPe: subject", + pascalcase: "TyPe: subject", + snakecase: "ty_pe: subject", + kebabcase: "ty-pe: subject", + startcase: "Ty Pe: subject", }; const parsed = { @@ -25,300 +25,300 @@ const parsed = { kebabcase: parse(messages.kebabcase), startcase: parse(messages.startcase, undefined, { headerPattern: /^(.*): (.*)$/, - headerCorrespondence: ['type', 'subject'], + headerCorrespondence: ["type", "subject"], }), }; test('with empty type should succeed for "never lowercase"', async () => { - const [actual] = typeCase(await parsed.empty, 'never', 'lowercase'); + const [actual] = typeCase(await parsed.empty, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty type should succeed for "always lowercase"', async () => { - const [actual] = typeCase(await parsed.empty, 'always', 'lowercase'); + const [actual] = typeCase(await parsed.empty, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty type should succeed for "never uppercase"', async () => { - const [actual] = typeCase(await parsed.empty, 'never', 'uppercase'); + const [actual] = typeCase(await parsed.empty, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with empty type should succeed for "always uppercase"', async () => { - const [actual] = typeCase(await parsed.empty, 'always', 'uppercase'); + const [actual] = typeCase(await parsed.empty, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with lowercase type should fail for "never lowercase"', async () => { - const [actual] = typeCase(await parsed.lowercase, 'never', 'lowercase'); + const [actual] = typeCase(await parsed.lowercase, "never", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with lowercase type should succeed for "always lowercase"', async () => { - const [actual] = typeCase(await parsed.lowercase, 'always', 'lowercase'); + const [actual] = typeCase(await parsed.lowercase, "always", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase type should succeed for "never lowercase"', async () => { - const [actual] = typeCase(await parsed.mixedcase, 'never', 'lowercase'); + const [actual] = typeCase(await parsed.mixedcase, "never", "lowercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase type should fail for "always lowercase"', async () => { - const [actual] = typeCase(await parsed.mixedcase, 'always', 'lowercase'); + const [actual] = typeCase(await parsed.mixedcase, "always", "lowercase"); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase type should succeed for "never uppercase"', async () => { - const [actual] = typeCase(await parsed.mixedcase, 'never', 'uppercase'); + const [actual] = typeCase(await parsed.mixedcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase type should fail for "always uppercase"', async () => { - const [actual] = typeCase(await parsed.mixedcase, 'always', 'uppercase'); + const [actual] = typeCase(await parsed.mixedcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with uppercase type should fail for "never uppercase"', async () => { - const [actual] = typeCase(await parsed.uppercase, 'never', 'uppercase'); + const [actual] = typeCase(await parsed.uppercase, "never", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with lowercase type should succeed for "always uppercase"', async () => { - const [actual] = typeCase(await parsed.uppercase, 'always', 'uppercase'); + const [actual] = typeCase(await parsed.uppercase, "always", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with camelcase type should fail for "always uppercase"', async () => { - const [actual] = typeCase(await parsed.camelcase, 'always', 'uppercase'); + const [actual] = typeCase(await parsed.camelcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase type should succeed for "never uppercase"', async () => { - const [actual] = typeCase(await parsed.camelcase, 'never', 'uppercase'); + const [actual] = typeCase(await parsed.camelcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with camelcase type should fail for "always pascalcase"', async () => { - const [actual] = typeCase(await parsed.camelcase, 'always', 'pascal-case'); + const [actual] = typeCase(await parsed.camelcase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase type should fail for "always kebabcase"', async () => { - const [actual] = typeCase(await parsed.camelcase, 'always', 'kebab-case'); + const [actual] = typeCase(await parsed.camelcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase type should fail for "always snakecase"', async () => { - const [actual] = typeCase(await parsed.camelcase, 'always', 'snake-case'); + const [actual] = typeCase(await parsed.camelcase, "always", "snake-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase type should fail for "always startcase"', async () => { - const [actual] = typeCase(await parsed.camelcase, 'always', 'start-case'); + const [actual] = typeCase(await parsed.camelcase, "always", "start-case"); const expected = false; expect(actual).toEqual(expected); }); test('with camelcase type should succeed for "always camelcase"', async () => { - const [actual] = typeCase(await parsed.camelcase, 'always', 'camel-case'); + const [actual] = typeCase(await parsed.camelcase, "always", "camel-case"); const expected = true; expect(actual).toEqual(expected); }); test('with pascalcase type should fail for "always uppercase"', async () => { - const [actual] = typeCase(await parsed.pascalcase, 'always', 'uppercase'); + const [actual] = typeCase(await parsed.pascalcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase type should succeed for "never uppercase"', async () => { - const [actual] = typeCase(await parsed.pascalcase, 'never', 'uppercase'); + const [actual] = typeCase(await parsed.pascalcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with pascalcase type should fail for "always camelcase"', async () => { - const [actual] = typeCase(await parsed.pascalcase, 'always', 'camel-case'); + const [actual] = typeCase(await parsed.pascalcase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase type should fail for "always kebabcase"', async () => { - const [actual] = typeCase(await parsed.pascalcase, 'always', 'kebab-case'); + const [actual] = typeCase(await parsed.pascalcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase type should fail for "always snakecase"', async () => { - const [actual] = typeCase(await parsed.pascalcase, 'always', 'snake-case'); + const [actual] = typeCase(await parsed.pascalcase, "always", "snake-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase type should fail for "always startcase"', async () => { - const [actual] = typeCase(await parsed.pascalcase, 'always', 'start-case'); + const [actual] = typeCase(await parsed.pascalcase, "always", "start-case"); const expected = false; expect(actual).toEqual(expected); }); test('with pascalcase type should succeed for "always pascalcase"', async () => { - const [actual] = typeCase(await parsed.pascalcase, 'always', 'pascal-case'); + const [actual] = typeCase(await parsed.pascalcase, "always", "pascal-case"); const expected = true; expect(actual).toEqual(expected); }); test('with snakecase type should fail for "always uppercase"', async () => { - const [actual] = typeCase(await parsed.snakecase, 'always', 'uppercase'); + const [actual] = typeCase(await parsed.snakecase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase type should succeed for "never uppercase"', async () => { - const [actual] = typeCase(await parsed.snakecase, 'never', 'uppercase'); + const [actual] = typeCase(await parsed.snakecase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with snakecase type should fail for "always camelcase"', async () => { - const [actual] = typeCase(await parsed.snakecase, 'always', 'camel-case'); + const [actual] = typeCase(await parsed.snakecase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase type should fail for "always kebabcase"', async () => { - const [actual] = typeCase(await parsed.snakecase, 'always', 'kebab-case'); + const [actual] = typeCase(await parsed.snakecase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase type should succeed for "always snakecase"', async () => { - const [actual] = typeCase(await parsed.snakecase, 'always', 'snake-case'); + const [actual] = typeCase(await parsed.snakecase, "always", "snake-case"); const expected = true; expect(actual).toEqual(expected); }); test('with snakecase type should fail for "always pascalcase"', async () => { - const [actual] = typeCase(await parsed.snakecase, 'always', 'pascal-case'); + const [actual] = typeCase(await parsed.snakecase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with snakecase type should fail for "always start case"', async () => { - const [actual] = typeCase(await parsed.snakecase, 'always', 'start-case'); + const [actual] = typeCase(await parsed.snakecase, "always", "start-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase type should fail for "always uppercase"', async () => { - const [actual] = typeCase(await parsed.startcase, 'always', 'uppercase'); + const [actual] = typeCase(await parsed.startcase, "always", "uppercase"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase type should succeed for "never uppercase"', async () => { - const [actual] = typeCase(await parsed.startcase, 'never', 'uppercase'); + const [actual] = typeCase(await parsed.startcase, "never", "uppercase"); const expected = true; expect(actual).toEqual(expected); }); test('with startcase type should fail for "always camelcase"', async () => { - const [actual] = typeCase(await parsed.startcase, 'always', 'camel-case'); + const [actual] = typeCase(await parsed.startcase, "always", "camel-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase type should fail for "always kebabcase"', async () => { - const [actual] = typeCase(await parsed.startcase, 'always', 'kebab-case'); + const [actual] = typeCase(await parsed.startcase, "always", "kebab-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase type should fail for "always snakecase"', async () => { - const [actual] = typeCase(await parsed.startcase, 'always', 'snake-case'); + const [actual] = typeCase(await parsed.startcase, "always", "snake-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase type should fail for "always pascalcase"', async () => { - const [actual] = typeCase(await parsed.startcase, 'always', 'pascal-case'); + const [actual] = typeCase(await parsed.startcase, "always", "pascal-case"); const expected = false; expect(actual).toEqual(expected); }); test('with startcase type should succeed for "always startcase"', async () => { - const [actual] = typeCase(await parsed.startcase, 'always', 'start-case'); + const [actual] = typeCase(await parsed.startcase, "always", "start-case"); const expected = true; expect(actual).toEqual(expected); }); test('with uppercase scope should succeed for "always [uppercase, lowercase]"', async () => { - const [actual] = typeCase(await parsed.uppercase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = typeCase(await parsed.uppercase, "always", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with lowercase subject should succeed for "always [uppercase, lowercase]"', async () => { - const [actual] = typeCase(await parsed.lowercase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = typeCase(await parsed.lowercase, "always", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase subject should fail for "always [uppercase, lowercase]"', async () => { - const [actual] = typeCase(await parsed.mixedcase, 'always', [ - 'uppercase', - 'lowercase', + const [actual] = typeCase(await parsed.mixedcase, "always", [ + "uppercase", + "lowercase", ]); const expected = false; expect(actual).toEqual(expected); }); test('with mixedcase subject should pass for "always [uppercase, lowercase, camel-case]"', async () => { - const [actual] = typeCase(await parsed.mixedcase, 'always', [ - 'uppercase', - 'lowercase', - 'camel-case', + const [actual] = typeCase(await parsed.mixedcase, "always", [ + "uppercase", + "lowercase", + "camel-case", ]); const expected = true; expect(actual).toEqual(expected); }); test('with mixedcase scope should pass for "never [uppercase, lowercase]"', async () => { - const [actual] = typeCase(await parsed.mixedcase, 'never', [ - 'uppercase', - 'lowercase', + const [actual] = typeCase(await parsed.mixedcase, "never", [ + "uppercase", + "lowercase", ]); const expected = true; expect(actual).toEqual(expected); }); test('with uppercase scope should fail for "never [uppercase, lowercase]"', async () => { - const [actual] = typeCase(await parsed.uppercase, 'never', [ - 'uppercase', - 'lowercase', + const [actual] = typeCase(await parsed.uppercase, "never", [ + "uppercase", + "lowercase", ]); const expected = false; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/type-case.ts b/@commitlint/rules/src/type-case.ts index 71aa2fafdc..8c622e26ff 100644 --- a/@commitlint/rules/src/type-case.ts +++ b/@commitlint/rules/src/type-case.ts @@ -1,24 +1,24 @@ -import {case as ensureCase} from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {TargetCaseType, SyncRule} from '@commitlint/types'; +import { case as ensureCase } from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { TargetCaseType, SyncRule } from "@commitlint/types"; -const negated = (when?: string) => when === 'never'; +const negated = (when?: string) => when === "never"; export const typeCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( parsed, - when = 'always', - value = [] + when = "always", + value = [], ) => { - const {type} = parsed; + const { type } = parsed; if (!type) { return [true]; } const checks = (Array.isArray(value) ? value : [value]).map((check) => { - if (typeof check === 'string') { + if (typeof check === "string") { return { - when: 'always', + when: "always", case: check, }; } @@ -30,7 +30,7 @@ export const typeCase: SyncRule<TargetCaseType | TargetCaseType[]> = ( return negated(check.when) ? !r : r; }); - const list = checks.map((c) => c.case).join(', '); + const list = checks.map((c) => c.case).join(", "); return [ negated(when) ? !result : result, diff --git a/@commitlint/rules/src/type-empty.test.ts b/@commitlint/rules/src/type-empty.test.ts index 862fb3ae31..48b5d3a893 100644 --- a/@commitlint/rules/src/type-empty.test.ts +++ b/@commitlint/rules/src/type-empty.test.ts @@ -1,10 +1,10 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {typeEmpty} from './type-empty.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { typeEmpty } from "./type-empty.js"; const messages = { - empty: '(scope):', - filled: 'type: subject', + empty: "(scope):", + filled: "type: subject", }; const parsed = { @@ -12,38 +12,38 @@ const parsed = { filled: parse(messages.filled), }; -test('without type should succeed for empty keyword', async () => { +test("without type should succeed for empty keyword", async () => { const [actual] = typeEmpty(await parsed.empty); const expected = true; expect(actual).toEqual(expected); }); test('without type should fail for "never"', async () => { - const [actual] = typeEmpty(await parsed.empty, 'never'); + const [actual] = typeEmpty(await parsed.empty, "never"); const expected = false; expect(actual).toEqual(expected); }); test('without type should succeed for "always"', async () => { - const [actual] = typeEmpty(await parsed.empty, 'always'); + const [actual] = typeEmpty(await parsed.empty, "always"); const expected = true; expect(actual).toEqual(expected); }); -test('with type fail for empty keyword', async () => { +test("with type fail for empty keyword", async () => { const [actual] = typeEmpty(await parsed.filled); const expected = false; expect(actual).toEqual(expected); }); test('with type succeed for "never"', async () => { - const [actual] = typeEmpty(await parsed.filled, 'never'); + const [actual] = typeEmpty(await parsed.filled, "never"); const expected = true; expect(actual).toEqual(expected); }); test('with type fail for "always"', async () => { - const [actual] = typeEmpty(await parsed.filled, 'always'); + const [actual] = typeEmpty(await parsed.filled, "always"); const expected = false; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/type-empty.ts b/@commitlint/rules/src/type-empty.ts index 8802e00d77..867f6120e5 100644 --- a/@commitlint/rules/src/type-empty.ts +++ b/@commitlint/rules/src/type-empty.ts @@ -1,12 +1,12 @@ -import * as ensure from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import * as ensure from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; -export const typeEmpty: SyncRule = (parsed, when = 'always') => { - const negated = when === 'never'; - const notEmpty = ensure.notEmpty(parsed.type || ''); +export const typeEmpty: SyncRule = (parsed, when = "always") => { + const negated = when === "never"; + const notEmpty = ensure.notEmpty(parsed.type || ""); return [ negated ? notEmpty : !notEmpty, - message(['type', negated ? 'may not' : 'must', 'be empty']), + message(["type", negated ? "may not" : "must", "be empty"]), ]; }; diff --git a/@commitlint/rules/src/type-enum.test.ts b/@commitlint/rules/src/type-enum.test.ts index 4f3dd6ca31..dda24c27ea 100644 --- a/@commitlint/rules/src/type-enum.test.ts +++ b/@commitlint/rules/src/type-enum.test.ts @@ -1,11 +1,11 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {typeEnum} from './type-enum.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { typeEnum } from "./type-enum.js"; const messages = { - empty: '(): \n', - a: 'a(): \n', - b: 'b(): \n', + empty: "(): \n", + a: "a(): \n", + b: "b(): \n", }; const parsed = { @@ -14,110 +14,110 @@ const parsed = { b: parse(messages.b), }; -test('empty succeeds', async () => { +test("empty succeeds", async () => { const [actual] = typeEnum(await parsed.empty); const expected = true; expect(actual).toEqual(expected); }); test('empty on "a" succeeds', async () => { - const [actual] = typeEnum(await parsed.empty, undefined, ['a']); + const [actual] = typeEnum(await parsed.empty, undefined, ["a"]); const expected = true; expect(actual).toEqual(expected); }); test('empty on "always a" succeeds', async () => { - const [actual] = typeEnum(await parsed.empty, 'always', ['a']); + const [actual] = typeEnum(await parsed.empty, "always", ["a"]); const expected = true; expect(actual).toEqual(expected); }); test('empty on "never a" succeeds', async () => { - const [actual] = typeEnum(await parsed.empty, 'never', ['a']); + const [actual] = typeEnum(await parsed.empty, "never", ["a"]); const expected = true; expect(actual).toEqual(expected); }); test('empty on "always a, b" succeeds', async () => { - const [actual] = typeEnum(await parsed.empty, 'always', ['a', 'b']); + const [actual] = typeEnum(await parsed.empty, "always", ["a", "b"]); const expected = true; expect(actual).toEqual(expected); }); test('empty on "never a, b" succeeds', async () => { - const [actual] = typeEnum(await parsed.empty, 'never', ['a', 'b']); + const [actual] = typeEnum(await parsed.empty, "never", ["a", "b"]); const expected = true; expect(actual).toEqual(expected); }); test('a on "a" succeeds', async () => { - const [actual] = typeEnum(await parsed.a, undefined, ['a']); + const [actual] = typeEnum(await parsed.a, undefined, ["a"]); const expected = true; expect(actual).toEqual(expected); }); test('a on "always a" succeeds', async () => { - const [actual] = typeEnum(await parsed.a, 'always', ['a']); + const [actual] = typeEnum(await parsed.a, "always", ["a"]); const expected = true; expect(actual).toEqual(expected); }); test('a on "never a" fails', async () => { - const [actual] = typeEnum(await parsed.a, 'never', ['a']); + const [actual] = typeEnum(await parsed.a, "never", ["a"]); const expected = false; expect(actual).toEqual(expected); }); test('b on "b" succeeds', async () => { - const [actual] = typeEnum(await parsed.b, undefined, ['b']); + const [actual] = typeEnum(await parsed.b, undefined, ["b"]); const expected = true; expect(actual).toEqual(expected); }); test('b on "always b" succeeds', async () => { - const [actual] = typeEnum(await parsed.b, 'always', ['b']); + const [actual] = typeEnum(await parsed.b, "always", ["b"]); const expected = true; expect(actual).toEqual(expected); }); test('b on "never b" fails', async () => { - const [actual] = typeEnum(await parsed.b, 'never', ['b']); + const [actual] = typeEnum(await parsed.b, "never", ["b"]); const expected = false; expect(actual).toEqual(expected); }); test('a on "a, b" succeeds', async () => { - const [actual] = typeEnum(await parsed.a, undefined, ['a', 'b']); + const [actual] = typeEnum(await parsed.a, undefined, ["a", "b"]); const expected = true; expect(actual).toEqual(expected); }); test('a on "always a, b" succeeds', async () => { - const [actual] = typeEnum(await parsed.a, 'always', ['a', 'b']); + const [actual] = typeEnum(await parsed.a, "always", ["a", "b"]); const expected = true; expect(actual).toEqual(expected); }); test('a on "never a, b" fails', async () => { - const [actual] = typeEnum(await parsed.a, 'never', ['a', 'b']); + const [actual] = typeEnum(await parsed.a, "never", ["a", "b"]); const expected = false; expect(actual).toEqual(expected); }); test('b on "a, b" succeeds', async () => { - const [actual] = typeEnum(await parsed.b, undefined, ['a', 'b']); + const [actual] = typeEnum(await parsed.b, undefined, ["a", "b"]); const expected = true; expect(actual).toEqual(expected); }); test('b on "always a, b" succeeds', async () => { - const [actual] = typeEnum(await parsed.b, 'always', ['a', 'b']); + const [actual] = typeEnum(await parsed.b, "always", ["a", "b"]); const expected = true; expect(actual).toEqual(expected); }); test('b on "never a, b" fails', async () => { - const [actual] = typeEnum(await parsed.b, 'never', ['a', 'b']); + const [actual] = typeEnum(await parsed.b, "never", ["a", "b"]); const expected = false; expect(actual).toEqual(expected); }); diff --git a/@commitlint/rules/src/type-enum.ts b/@commitlint/rules/src/type-enum.ts index c4a8f9aa18..4ae17d9574 100644 --- a/@commitlint/rules/src/type-enum.ts +++ b/@commitlint/rules/src/type-enum.ts @@ -1,19 +1,19 @@ -import * as ensure from '@commitlint/ensure'; -import message from '@commitlint/message'; -import {SyncRule} from '@commitlint/types'; +import * as ensure from "@commitlint/ensure"; +import message from "@commitlint/message"; +import { SyncRule } from "@commitlint/types"; export const typeEnum: SyncRule<string[]> = ( parsed, - when = 'always', - value = [] + when = "always", + value = [], ) => { - const {type: input} = parsed; + const { type: input } = parsed; if (!input) { return [true]; } - const negated = when === 'never'; + const negated = when === "never"; const result = ensure.enum(input, value); return [ @@ -21,7 +21,7 @@ export const typeEnum: SyncRule<string[]> = ( message([ `type must`, negated ? `not` : null, - `be one of [${value.join(', ')}]`, + `be one of [${value.join(", ")}]`, ]), ]; }; diff --git a/@commitlint/rules/src/type-max-length.test.ts b/@commitlint/rules/src/type-max-length.test.ts index c77312ab49..2ce7601fcd 100644 --- a/@commitlint/rules/src/type-max-length.test.ts +++ b/@commitlint/rules/src/type-max-length.test.ts @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {typeMaxLength} from './type-max-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { typeMaxLength } from "./type-max-length.js"; -const short = 'a'; -const long = 'ab'; +const short = "a"; +const long = "ab"; const value = short.length; const messages = { - empty: '():\n', + empty: "():\n", short: `${short}: \n`, long: `${long}: \n`, }; @@ -19,19 +19,19 @@ const parsed = { long: parse(messages.long), }; -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = typeMaxLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should succeed', async () => { +test("with short should succeed", async () => { const [actual] = typeMaxLength(await parsed.short, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with long should fail', async () => { +test("with long should fail", async () => { const [actual] = typeMaxLength(await parsed.long, undefined, value); const expected = false; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/type-max-length.ts b/@commitlint/rules/src/type-max-length.ts index 1e4d27766f..7398ef3138 100644 --- a/@commitlint/rules/src/type-max-length.ts +++ b/@commitlint/rules/src/type-max-length.ts @@ -1,10 +1,10 @@ -import {maxLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { maxLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const typeMaxLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.type; diff --git a/@commitlint/rules/src/type-min-length.test.ts b/@commitlint/rules/src/type-min-length.test.ts index 3503c920cc..7caf3a91c5 100644 --- a/@commitlint/rules/src/type-min-length.test.ts +++ b/@commitlint/rules/src/type-min-length.test.ts @@ -1,14 +1,14 @@ -import {test, expect} from 'vitest'; -import parse from '@commitlint/parse'; -import {typeMinLength} from './type-min-length.js'; +import { test, expect } from "vitest"; +import parse from "@commitlint/parse"; +import { typeMinLength } from "./type-min-length.js"; -const short = 'a'; -const long = 'ab'; +const short = "a"; +const long = "ab"; const value = long.length; const messages = { - empty: '():\n', + empty: "():\n", short: `${short}: \n`, long: `${long}: \n`, }; @@ -19,19 +19,19 @@ const parsed = { long: parse(messages.long), }; -test('with empty should succeed', async () => { +test("with empty should succeed", async () => { const [actual] = typeMinLength(await parsed.empty, undefined, value); const expected = true; expect(actual).toEqual(expected); }); -test('with short should fail', async () => { +test("with short should fail", async () => { const [actual] = typeMinLength(await parsed.short, undefined, value); const expected = false; expect(actual).toEqual(expected); }); -test('with long should succeed', async () => { +test("with long should succeed", async () => { const [actual] = typeMinLength(await parsed.long, undefined, value); const expected = true; expect(actual).toEqual(expected); diff --git a/@commitlint/rules/src/type-min-length.ts b/@commitlint/rules/src/type-min-length.ts index f7ff3ea38b..619f7593ad 100644 --- a/@commitlint/rules/src/type-min-length.ts +++ b/@commitlint/rules/src/type-min-length.ts @@ -1,10 +1,10 @@ -import {minLength} from '@commitlint/ensure'; -import {SyncRule} from '@commitlint/types'; +import { minLength } from "@commitlint/ensure"; +import { SyncRule } from "@commitlint/types"; export const typeMinLength: SyncRule<number> = ( parsed, _when = undefined, - value = 0 + value = 0, ) => { const input = parsed.type; if (!input) { diff --git a/@commitlint/rules/tsconfig.json b/@commitlint/rules/tsconfig.json index 3f6d480309..2bc7f16034 100644 --- a/@commitlint/rules/tsconfig.json +++ b/@commitlint/rules/tsconfig.json @@ -8,9 +8,9 @@ "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], "references": [ - {"path": "../ensure"}, - {"path": "../message"}, - {"path": "../to-lines"}, - {"path": "../types"} + { "path": "../ensure" }, + { "path": "../message" }, + { "path": "../to-lines" }, + { "path": "../types" } ] } diff --git a/@commitlint/to-lines/CHANGELOG.md b/@commitlint/to-lines/CHANGELOG.md index 827485ce57..975274248b 100644 --- a/@commitlint/to-lines/CHANGELOG.md +++ b/@commitlint/to-lines/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/to-lines + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/to-lines + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/to-lines + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/to-lines diff --git a/@commitlint/to-lines/package.json b/@commitlint/to-lines/package.json index bb7f6854fa..cf4b62751d 100644 --- a/@commitlint/to-lines/package.json +++ b/@commitlint/to-lines/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/to-lines", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Lint your commit messages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,7 +36,7 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/to-lines/src/index.test.ts b/@commitlint/to-lines/src/index.test.ts index 095a9758df..8df9e30d52 100644 --- a/@commitlint/to-lines/src/index.test.ts +++ b/@commitlint/to-lines/src/index.test.ts @@ -1,27 +1,27 @@ -import {test, expect} from 'vitest'; +import { test, expect } from "vitest"; -import toLines from './index.js'; +import toLines from "./index.js"; -test('should return an array for empty input', () => { +test("should return an array for empty input", () => { expect((toLines as () => string[])()).toStrictEqual([]); }); -test('should return an array for null input', () => { +test("should return an array for null input", () => { expect((toLines as (input: any) => string[])(null)).toStrictEqual([]); }); -test('should return an array for empty string input', () => { - expect(toLines('')).toStrictEqual(['']); +test("should return an array for empty string input", () => { + expect(toLines("")).toStrictEqual([""]); }); -test('should split LF newlines', () => { - expect(toLines('some\nweird\ntext')).toStrictEqual(['some', 'weird', 'text']); +test("should split LF newlines", () => { + expect(toLines("some\nweird\ntext")).toStrictEqual(["some", "weird", "text"]); }); -test('should split CR+LF newlines', () => { - expect(toLines('some\r\nweird\r\ntext')).toStrictEqual([ - 'some', - 'weird', - 'text', +test("should split CR+LF newlines", () => { + expect(toLines("some\r\nweird\r\ntext")).toStrictEqual([ + "some", + "weird", + "text", ]); }); diff --git a/@commitlint/to-lines/src/index.ts b/@commitlint/to-lines/src/index.ts index 4870c2bcbf..ccc1d1b7d2 100644 --- a/@commitlint/to-lines/src/index.ts +++ b/@commitlint/to-lines/src/index.ts @@ -1,5 +1,5 @@ export default function toLines(input?: string | null): string[] { - if (typeof input !== 'string') { + if (typeof input !== "string") { return []; } diff --git a/@commitlint/top-level/CHANGELOG.md b/@commitlint/top-level/CHANGELOG.md index c212e04dce..326a0ef33a 100644 --- a/@commitlint/top-level/CHANGELOG.md +++ b/@commitlint/top-level/CHANGELOG.md @@ -3,6 +3,33 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/top-level + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/top-level + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/top-level diff --git a/@commitlint/top-level/package.json b/@commitlint/top-level/package.json index 3982acd578..4c48c1557a 100644 --- a/@commitlint/top-level/package.json +++ b/@commitlint/top-level/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/top-level", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Lint your commit messages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -36,10 +36,10 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, "dependencies": { "find-up": "^7.0.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/top-level/src/index.ts b/@commitlint/top-level/src/index.ts index 5e3f3d3e1b..4996d4f8ee 100644 --- a/@commitlint/top-level/src/index.ts +++ b/@commitlint/top-level/src/index.ts @@ -1,5 +1,5 @@ -import path from 'path'; -import {findUp} from 'find-up'; +import path from "node:path"; +import { findUp } from "find-up"; export default toplevel; @@ -9,19 +9,19 @@ export default toplevel; async function toplevel(cwd?: string) { const found = await searchDotGit(cwd); - if (typeof found !== 'string') { + if (typeof found !== "string") { return found; } - return path.join(found, '..'); + return path.join(found, ".."); } /** * Search .git, the '.git' can be a file(submodule), also can be a directory(normal) */ async function searchDotGit(cwd?: string) { - const foundFile = await findUp('.git', {cwd, type: 'file'}); - const foundDir = await findUp('.git', {cwd, type: 'directory'}); + const foundFile = await findUp(".git", { cwd, type: "file" }); + const foundDir = await findUp(".git", { cwd, type: "directory" }); return foundFile || foundDir; } diff --git a/@commitlint/travis-cli/CHANGELOG.md b/@commitlint/travis-cli/CHANGELOG.md index 817d04d451..579b28545c 100644 --- a/@commitlint/travis-cli/CHANGELOG.md +++ b/@commitlint/travis-cli/CHANGELOG.md @@ -3,6 +3,52 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + +**Note:** Version bump only for package @commitlint/travis-cli + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/travis-cli + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + + +### Bug Fixes + +* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299)) + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + +**Note:** Version bump only for package @commitlint/travis-cli + + + + + ## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15) **Note:** Version bump only for package @commitlint/travis-cli diff --git a/@commitlint/travis-cli/cli.js b/@commitlint/travis-cli/cli.js index 1bda77159f..940e27804b 100755 --- a/@commitlint/travis-cli/cli.js +++ b/@commitlint/travis-cli/cli.js @@ -1,2 +1,2 @@ #!/usr/bin/env node -import './lib/cli.js'; +import "./lib/cli.js"; diff --git a/@commitlint/travis-cli/package.json b/@commitlint/travis-cli/package.json index 92afbebd06..ed08b7cf2b 100644 --- a/@commitlint/travis-cli/package.json +++ b/@commitlint/travis-cli/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/travis-cli", "type": "module", - "version": "19.6.1", + "version": "20.1.0", "description": "Lint all relevant commits for a change or PR on Travis CI", "main": "lib/cli.js", "types": "lib/cli.d.ts", @@ -39,12 +39,12 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/test": "^19.5.0", - "@commitlint/utils": "^19.5.0" + "@commitlint/test": "^20.0.0", + "@commitlint/utils": "^20.0.0" }, "dependencies": { - "@commitlint/cli": "^19.6.1", - "tinyexec": "^0.3.0" + "@commitlint/cli": "^20.1.0", + "tinyexec": "^1.0.0" }, - "gitHead": "70f7f4688b51774e7ac5e40e896cdaa3f132b2bc" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/travis-cli/src/cli.test.ts b/@commitlint/travis-cli/src/cli.test.ts index c6d05e881f..b276a40792 100644 --- a/@commitlint/travis-cli/src/cli.test.ts +++ b/@commitlint/travis-cli/src/cli.test.ts @@ -1,67 +1,67 @@ -import {SpawnOptions} from 'node:child_process'; +import { SpawnOptions } from "node:child_process"; -import {test, expect} from 'vitest'; -import {createRequire} from 'module'; -import path from 'path'; -import {fileURLToPath} from 'url'; +import { test, expect } from "vitest"; +import { createRequire } from "node:module"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; -import {git} from '@commitlint/test'; -import {x} from 'tinyexec'; +import { git } from "@commitlint/test"; +import { x } from "tinyexec"; const require = createRequire(import.meta.url); -const __dirname = path.resolve(fileURLToPath(import.meta.url), '..'); +const __dirname = path.resolve(fileURLToPath(import.meta.url), ".."); -const bin = require.resolve('../cli.js'); +const bin = require.resolve("../cli.js"); -const TRAVIS_COMMITLINT_BIN = require.resolve('../fixtures/commitlint'); -const TRAVIS_COMMITLINT_GIT_BIN = require.resolve('../fixtures/git'); +const TRAVIS_COMMITLINT_BIN = require.resolve("../fixtures/commitlint"); +const TRAVIS_COMMITLINT_GIT_BIN = require.resolve("../fixtures/git"); const validBaseEnv = { - TRAVIS: 'true', - CI: 'true', - TRAVIS_COMMIT: 'TRAVIS_COMMIT', + TRAVIS: "true", + CI: "true", + TRAVIS_COMMIT: "TRAVIS_COMMIT", TRAVIS_COMMITLINT_BIN: TRAVIS_COMMITLINT_BIN, TRAVIS_COMMITLINT_GIT_BIN: TRAVIS_COMMITLINT_GIT_BIN, - TRAVIS_COMMIT_RANGE: 'TRAVIS_COMMIT_A.TRAVIS_COMMIT_B', - TRAVIS_EVENT_TYPE: 'TRAVIS_EVENT_TYPE', - TRAVIS_REPO_SLUG: 'TRAVIS_REPO_SLUG', - TRAVIS_PULL_REQUEST_SLUG: 'TRAVIS_PULL_REQUEST_SLUG', + TRAVIS_COMMIT_RANGE: "TRAVIS_COMMIT_A.TRAVIS_COMMIT_B", + TRAVIS_EVENT_TYPE: "TRAVIS_EVENT_TYPE", + TRAVIS_REPO_SLUG: "TRAVIS_REPO_SLUG", + TRAVIS_PULL_REQUEST_SLUG: "TRAVIS_PULL_REQUEST_SLUG", }; const cli = async (nodeOptions: SpawnOptions = {}, args: string[] = []) => - x(bin, args, {nodeOptions}); + x(bin, args, { nodeOptions }); -test('should throw when not on travis ci', async () => { +test("should throw when not on travis ci", async () => { const env = { - CI: 'false', - TRAVIS: 'false', + CI: "false", + TRAVIS: "false", }; - const output = await cli({env}); + const output = await cli({ env }); expect(output.stderr).toContain( - '@commitlint/travis-cli is intended to be used on Travis CI' + "@commitlint/travis-cli is intended to be used on Travis CI", ); }); -test('should throw when on travis ci, but env vars are missing', async () => { +test("should throw when on travis ci, but env vars are missing", async () => { const env = { - TRAVIS: 'true', - CI: 'true', + TRAVIS: "true", + CI: "true", }; - const output = await cli({env}); + const output = await cli({ env }); expect(output.stderr).toContain( - 'TRAVIS_COMMIT, TRAVIS_COMMIT_RANGE, TRAVIS_EVENT_TYPE, TRAVIS_REPO_SLUG, TRAVIS_PULL_REQUEST_SLUG' + "TRAVIS_COMMIT, TRAVIS_COMMIT_RANGE, TRAVIS_EVENT_TYPE, TRAVIS_REPO_SLUG, TRAVIS_PULL_REQUEST_SLUG", ); }); -test('should call git with expected args (test might fail locally)', async () => { +test("should call git with expected args (test might fail locally)", async () => { const cwd = await git.clone( - 'https://github.com/conventional-changelog/commitlint.git', - ['--depth=10'], + "https://github.com/conventional-changelog/commitlint.git", + ["--depth=10"], __dirname, - TRAVIS_COMMITLINT_GIT_BIN + TRAVIS_COMMITLINT_GIT_BIN, ); const result = await cli({ @@ -75,69 +75,69 @@ test('should call git with expected args (test might fail locally)', async () => const [stash, branches, commitlint] = invocations; - expect(stash).toEqual(['git', 'stash', '-k', '-u', '--quiet']); - expect(branches).toEqual(['git', 'stash', 'pop', '--quiet']); - expect(commitlint).toEqual(['commitlint']); + expect(stash).toEqual(["git", "stash", "-k", "-u", "--quiet"]); + expect(branches).toEqual(["git", "stash", "pop", "--quiet"]); + expect(commitlint).toEqual(["commitlint"]); }); -test('should call git with expected args on pull_request (test might fail locally)', async () => { +test("should call git with expected args on pull_request (test might fail locally)", async () => { const cwd = await git.clone( - 'https://github.com/conventional-changelog/commitlint.git', - ['--depth=10'], + "https://github.com/conventional-changelog/commitlint.git", + ["--depth=10"], __dirname, - TRAVIS_COMMITLINT_GIT_BIN + TRAVIS_COMMITLINT_GIT_BIN, ); const result = await cli({ cwd, - env: {...validBaseEnv, TRAVIS_EVENT_TYPE: 'pull_request'}, + env: { ...validBaseEnv, TRAVIS_EVENT_TYPE: "pull_request" }, }); const invocations = getInvocations(result.stdout); expect(invocations.length).toBe(3); const [stash, branches, commitlint] = invocations; - expect(stash).toEqual(['git', 'stash', '-k', '-u', '--quiet']); - expect(branches).toEqual(['git', 'stash', 'pop', '--quiet']); + expect(stash).toEqual(["git", "stash", "-k", "-u", "--quiet"]); + expect(branches).toEqual(["git", "stash", "pop", "--quiet"]); expect(commitlint).toEqual([ - 'commitlint', - '--from', - 'TRAVIS_COMMIT_A', - '--to', - 'TRAVIS_COMMIT_B', + "commitlint", + "--from", + "TRAVIS_COMMIT_A", + "--to", + "TRAVIS_COMMIT_B", ]); }); -test('should call git with extra expected args on pull_request (test might fail locally)', async () => { +test("should call git with extra expected args on pull_request (test might fail locally)", async () => { const cwd = await git.clone( - 'https://github.com/conventional-changelog/commitlint.git', - ['--depth=10'], + "https://github.com/conventional-changelog/commitlint.git", + ["--depth=10"], __dirname, - TRAVIS_COMMITLINT_GIT_BIN + TRAVIS_COMMITLINT_GIT_BIN, ); const result = await cli( { cwd, - env: {...validBaseEnv, TRAVIS_EVENT_TYPE: 'pull_request'}, + env: { ...validBaseEnv, TRAVIS_EVENT_TYPE: "pull_request" }, }, - ['--config', './config/commitlint.config.js'] + ["--config", "./config/commitlint.config.js"], ); const invocations = getInvocations(result.stdout); expect(invocations.length).toBe(3); const [stash, branches, commitlint] = invocations; - expect(stash).toEqual(['git', 'stash', '-k', '-u', '--quiet']); - expect(branches).toEqual(['git', 'stash', 'pop', '--quiet']); + expect(stash).toEqual(["git", "stash", "-k", "-u", "--quiet"]); + expect(branches).toEqual(["git", "stash", "pop", "--quiet"]); expect(commitlint).toEqual([ - 'commitlint', - '--from', - 'TRAVIS_COMMIT_A', - '--to', - 'TRAVIS_COMMIT_B', - '--config', - './config/commitlint.config.js', + "commitlint", + "--from", + "TRAVIS_COMMIT_A", + "--to", + "TRAVIS_COMMIT_B", + "--config", + "./config/commitlint.config.js", ]); }); @@ -146,12 +146,12 @@ function getInvocations(stdout: string): string[][] { const raw = Array.isArray(matches) ? matches : []; return raw - .filter((invocation) => invocation !== '\n') + .filter((invocation) => invocation !== "\n") .map((invocation) => invocation - .split(',') + .split(",") .map((fragment) => fragment.trim()) .map((fragment) => fragment.substring(1, fragment.length - 1)) - .filter(Boolean) + .filter(Boolean), ); } diff --git a/@commitlint/travis-cli/src/cli.ts b/@commitlint/travis-cli/src/cli.ts index 12ce0cf9f8..ad4c586277 100644 --- a/@commitlint/travis-cli/src/cli.ts +++ b/@commitlint/travis-cli/src/cli.ts @@ -1,29 +1,29 @@ -import {SpawnOptions} from 'node:child_process'; +import { SpawnOptions } from "node:child_process"; -import {createRequire} from 'module'; +import { createRequire } from "node:module"; -import {x} from 'tinyexec'; +import { x } from "tinyexec"; const require = createRequire(import.meta.url); // Allow to override used bins for testing purposes -const GIT = process.env.TRAVIS_COMMITLINT_GIT_BIN || 'git'; +const GIT = process.env.TRAVIS_COMMITLINT_GIT_BIN || "git"; const COMMITLINT = - process.env.TRAVIS_COMMITLINT_BIN || require('@commitlint/cli'); + process.env.TRAVIS_COMMITLINT_BIN || require("@commitlint/cli"); const REQUIRED = [ - 'TRAVIS_COMMIT', - 'TRAVIS_COMMIT_RANGE', - 'TRAVIS_EVENT_TYPE', - 'TRAVIS_REPO_SLUG', - 'TRAVIS_PULL_REQUEST_SLUG', + "TRAVIS_COMMIT", + "TRAVIS_COMMIT_RANGE", + "TRAVIS_EVENT_TYPE", + "TRAVIS_REPO_SLUG", + "TRAVIS_PULL_REQUEST_SLUG", ]; -const COMMIT = process.env.TRAVIS_COMMIT || ''; +const COMMIT = process.env.TRAVIS_COMMIT || ""; const REPO_SLUG = process.env.TRAVIS_REPO_SLUG; const PR_SLUG = process.env.TRAVIS_PULL_REQUEST_SLUG || REPO_SLUG; const RANGE = process.env.TRAVIS_COMMIT_RANGE; -const IS_PR = process.env.TRAVIS_EVENT_TYPE === 'pull_request'; +const IS_PR = process.env.TRAVIS_EVENT_TYPE === "pull_request"; main().catch((err) => { console.error(err); @@ -38,9 +38,10 @@ async function main() { // Make base and source available as dedicated remotes await Promise.all([ - () => fetch({name: 'base', url: `https://github.com/${REPO_SLUG}.git`}), + () => fetch({ name: "base", url: `https://github.com/${REPO_SLUG}.git` }), IS_PR - ? () => fetch({name: 'source', url: `https://github.com/${PR_SLUG}.git`}) + ? () => + fetch({ name: "source", url: `https://github.com/${PR_SLUG}.git` }) : () => Promise.resolve(), ]); @@ -51,8 +52,8 @@ async function main() { // Lint all commits in TRAVIS_COMMIT_RANGE if available if (IS_PR && RANGE) { - const [start, end] = RANGE.split('.').filter(Boolean); - await lint(['--from', start, '--to', end, ...args]); + const [start, end] = RANGE.split(".").filter(Boolean); + await lint(["--from", start, "--to", end, ...args]); } else { const input = await log(COMMIT); await lint(args, {}, input); @@ -62,20 +63,20 @@ async function main() { async function git(args: string[], nodeOptions: SpawnOptions = {}) { return x(GIT, args, { nodeOptions: { - stdio: 'inherit', + stdio: "inherit", ...nodeOptions, }, }); } -async function fetch({name, url}: {name: string; url: string}) { - await git(['remote', 'add', name, url]); - await git(['fetch', name, '--quiet']); +async function fetch({ name, url }: { name: string; url: string }) { + await git(["remote", "add", name, url]); + await git(["fetch", name, "--quiet"]); } async function isClean() { - const result = await git(['status', '--porcelain'], { - stdio: ['pipe', 'pipe', 'pipe'], + const result = await git(["status", "--porcelain"], { + stdio: ["pipe", "pipe", "pipe"], }); return !(result.stdout && result.stdout.trim()); } @@ -83,11 +84,11 @@ async function isClean() { async function lint( args: string[], nodeOptions: SpawnOptions = {}, - input: string = '' + input: string = "", ) { const result = x(COMMITLINT, args, { nodeOptions: { - stdio: ['pipe', 'inherit', 'inherit'], + stdio: ["pipe", "inherit", "inherit"], ...nodeOptions, }, }); @@ -99,8 +100,8 @@ async function lint( } async function log(hash: string) { - const result = await git(['log', '-n', '1', '--pretty=format:%B', hash], { - stdio: 'pipe', + const result = await git(["log", "-n", "1", "--pretty=format:%B", hash], { + stdio: "pipe", }); return result.stdout; } @@ -109,23 +110,23 @@ async function stash() { if (await isClean()) { return () => Promise.resolve(); } - await git(['stash', '-k', '-u', '--quiet']); - return () => git(['stash', 'pop', '--quiet']); + await git(["stash", "-k", "-u", "--quiet"]); + return () => git(["stash", "pop", "--quiet"]); } function validate() { - if (process.env.CI !== 'true' || process.env.TRAVIS !== 'true') { + if (process.env.CI !== "true" || process.env.TRAVIS !== "true") { throw new Error( - `@commitlint/travis-cli is intended to be used on Travis CI` + `@commitlint/travis-cli is intended to be used on Travis CI`, ); } const missing = REQUIRED.filter((envVar) => !(envVar in process.env)); if (missing.length > 0) { - const stanza = missing.length > 1 ? 'they were not' : 'it was not'; + const stanza = missing.length > 1 ? "they were not" : "it was not"; throw new Error( - `Expected ${missing.join(', ')} to be defined globally, ${stanza}.` + `Expected ${missing.join(", ")} to be defined globally, ${stanza}.`, ); } } diff --git a/@commitlint/travis-cli/tsconfig.json b/@commitlint/travis-cli/tsconfig.json index 2a6d93a0fa..12cd1d4571 100644 --- a/@commitlint/travis-cli/tsconfig.json +++ b/@commitlint/travis-cli/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["./src"], "exclude": ["./src/**/*.test.ts", "./lib/**/*"], - "references": [{"path": "../cli"}] + "references": [{ "path": "../cli" }] } diff --git a/@commitlint/types/CHANGELOG.md b/@commitlint/types/CHANGELOG.md index 8b9f52840a..4063f69695 100644 --- a/@commitlint/types/CHANGELOG.md +++ b/@commitlint/types/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/types + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package @commitlint/types + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + +**Note:** Version bump only for package @commitlint/types + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/types diff --git a/@commitlint/types/package.json b/@commitlint/types/package.json index 574b25fac8..7388a48dd6 100644 --- a/@commitlint/types/package.json +++ b/@commitlint/types/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/types", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Shared types for commitlint packages", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -33,7 +33,7 @@ "chalk": "^5.3.0" }, "devDependencies": { - "@commitlint/utils": "^19.5.0" + "@commitlint/utils": "^20.0.0" }, - "gitHead": "d829bf6260304ca8d6811f329fcdd1b6c50e9749" + "gitHead": "e82f05a737626bb69979d14564f5ff601997f679" } diff --git a/@commitlint/types/src/ensure.ts b/@commitlint/types/src/ensure.ts index 9d7be804af..309271e0a3 100644 --- a/@commitlint/types/src/ensure.ts +++ b/@commitlint/types/src/ensure.ts @@ -1,13 +1,13 @@ export type TargetCaseType = - | 'camel-case' - | 'kebab-case' - | 'snake-case' - | 'pascal-case' - | 'start-case' - | 'upper-case' - | 'uppercase' - | 'sentence-case' - | 'sentencecase' - | 'lower-case' - | 'lowercase' - | 'lowerCase'; + | "camel-case" + | "kebab-case" + | "snake-case" + | "pascal-case" + | "start-case" + | "upper-case" + | "uppercase" + | "sentence-case" + | "sentencecase" + | "lower-case" + | "lowercase" + | "lowerCase"; diff --git a/@commitlint/types/src/format.ts b/@commitlint/types/src/format.ts index 0ae167ebee..2ae1030d1f 100644 --- a/@commitlint/types/src/format.ts +++ b/@commitlint/types/src/format.ts @@ -1,11 +1,11 @@ -import type {ColorName, ModifierName} from 'chalk'; +import type { ColorName, ModifierName } from "chalk"; -import {QualifiedRules} from './load.js'; -import {RuleConfigSeverity} from './rules.js'; +import { QualifiedRules } from "./load.js"; +import { RuleConfigSeverity } from "./rules.js"; export type Formatter = ( report: FormattableReport, - options: FormatOptions + options: FormatOptions, ) => string; export interface FormattableProblem { diff --git a/@commitlint/types/src/index.ts b/@commitlint/types/src/index.ts index 8014dcdf76..aa363ca5ae 100644 --- a/@commitlint/types/src/index.ts +++ b/@commitlint/types/src/index.ts @@ -1,8 +1,8 @@ -export * from './ensure.js'; -export * from './format.js'; -export * from './is-ignored.js'; -export * from './lint.js'; -export * from './load.js'; -export * from './parse.js'; -export * from './prompt.js'; -export * from './rules.js'; +export * from "./ensure.js"; +export * from "./format.js"; +export * from "./is-ignored.js"; +export * from "./lint.js"; +export * from "./load.js"; +export * from "./parse.js"; +export * from "./prompt.js"; +export * from "./rules.js"; diff --git a/@commitlint/types/src/lint.ts b/@commitlint/types/src/lint.ts index 6e473e4b5c..f2cc02b002 100644 --- a/@commitlint/types/src/lint.ts +++ b/@commitlint/types/src/lint.ts @@ -1,7 +1,7 @@ -import type {Options} from 'conventional-commits-parser'; -import {IsIgnoredOptions} from './is-ignored.js'; -import {PluginRecords} from './load.js'; -import {RuleConfigSeverity, RuleConfigTuple} from './rules.js'; +import type { Options } from "conventional-commits-parser"; +import { IsIgnoredOptions } from "./is-ignored.js"; +import { PluginRecords } from "./load.js"; +import { RuleConfigSeverity, RuleConfigTuple } from "./rules.js"; export type LintRuleConfig = Record< string, @@ -12,9 +12,9 @@ export type LintRuleConfig = Record< export interface LintOptions { /** If it should ignore the default commit messages (defaults to `true`) */ - defaultIgnores?: IsIgnoredOptions['defaults']; + defaultIgnores?: IsIgnoredOptions["defaults"]; /** Additional commits to ignore, defined by ignore matchers */ - ignores?: IsIgnoredOptions['ignores']; + ignores?: IsIgnoredOptions["ignores"]; /** The parser configuration to use when linting the commit */ parserOpts?: Options; diff --git a/@commitlint/types/src/load.ts b/@commitlint/types/src/load.ts index 686fa01ebe..e095387fe2 100644 --- a/@commitlint/types/src/load.ts +++ b/@commitlint/types/src/load.ts @@ -1,11 +1,11 @@ -import {UserPromptConfig} from './prompt.js'; +import { UserPromptConfig } from "./prompt.js"; import { AsyncRule, Rule, RuleConfigQuality, RulesConfig, SyncRule, -} from './rules.js'; +} from "./rules.js"; export type PluginRecords = Record<string, Plugin>; diff --git a/@commitlint/types/src/parse.ts b/@commitlint/types/src/parse.ts index 6b7a3a4c07..c162098b5e 100644 --- a/@commitlint/types/src/parse.ts +++ b/@commitlint/types/src/parse.ts @@ -1,3 +1,3 @@ -import type {Commit, Options} from 'conventional-commits-parser'; +import type { Commit, Options } from "conventional-commits-parser"; -export type Parser = (message: string, options: Options) => Omit<Commit, 'raw'>; +export type Parser = (message: string, options: Options) => Omit<Commit, "raw">; diff --git a/@commitlint/types/src/prompt.ts b/@commitlint/types/src/prompt.ts index 25ca44385a..c426434d13 100644 --- a/@commitlint/types/src/prompt.ts +++ b/@commitlint/types/src/prompt.ts @@ -1,19 +1,19 @@ export type RuleField = - | 'header' - | 'type' - | 'scope' - | 'subject' - | 'body' - | 'footer'; + | "header" + | "type" + | "scope" + | "subject" + | "body" + | "footer"; export type PromptName = | RuleField - | 'isBreaking' - | 'breakingBody' - | 'breaking' - | 'isIssueAffected' - | 'issuesBody' - | 'issues'; + | "isBreaking" + | "breakingBody" + | "breaking" + | "isIssueAffected" + | "issuesBody" + | "issues"; export type PromptConfig = { settings: { @@ -26,7 +26,7 @@ export type PromptConfig = { PromptName, { description?: string; - messages?: {[K: string]: string}; + messages?: { [K: string]: string }; enum?: { [enumName: string]: { description?: string; @@ -34,6 +34,7 @@ export type PromptConfig = { emoji?: string; }; }; + emojiInHeader?: boolean; } > >; diff --git a/@commitlint/types/src/rules.ts b/@commitlint/types/src/rules.ts index 930a0d2613..533e5416df 100644 --- a/@commitlint/types/src/rules.ts +++ b/@commitlint/types/src/rules.ts @@ -1,6 +1,6 @@ -import type {Commit} from 'conventional-commits-parser'; +import type { Commit } from "conventional-commits-parser"; -import {TargetCaseType} from './ensure.js'; +import { TargetCaseType } from "./ensure.js"; /** * Rules match the input either as successful or failed. @@ -13,23 +13,23 @@ export type RuleOutcome = Readonly<[boolean, string?]>; * Rules receive a parsed commit, condition, and possible additional settings through value. * All rules should provide the most sensible rule condition and value. */ -export type RuleType = 'async' | 'sync' | 'either'; +export type RuleType = "async" | "sync" | "either"; -export type BaseRule<Value = never, Type extends RuleType = 'either'> = ( +export type BaseRule<Value = never, Type extends RuleType = "either"> = ( parsed: Commit, when?: RuleConfigCondition, - value?: Value -) => Type extends 'either' + value?: Value, +) => Type extends "either" ? RuleOutcome | Promise<RuleOutcome> - : Type extends 'async' - ? Promise<RuleOutcome> - : Type extends 'sync' - ? RuleOutcome - : never; + : Type extends "async" + ? Promise<RuleOutcome> + : Type extends "sync" + ? RuleOutcome + : never; -export type Rule<Value = never> = BaseRule<Value, 'either'>; -export type AsyncRule<Value = never> = BaseRule<Value, 'async'>; -export type SyncRule<Value = never> = BaseRule<Value, 'sync'>; +export type Rule<Value = never> = BaseRule<Value, "either">; +export type AsyncRule<Value = never> = BaseRule<Value, "async">; +export type SyncRule<Value = never> = BaseRule<Value, "sync">; /** * Rules always have a severity. @@ -49,7 +49,7 @@ export enum RuleConfigSeverity { * It can be either "always" (as tested), or "never" (as tested). * For example, `header-full-stop` can be enforced as "always" or "never". */ -export type RuleConfigCondition = 'always' | 'never'; +export type RuleConfigCondition = "always" | "never"; export type RuleConfigTuple<T> = T extends void ? @@ -71,7 +71,7 @@ export type QualifiedRuleConfig<T> = export type RuleConfig< V = RuleConfigQuality.Qualified, - T = void + T = void, > = V extends RuleConfigQuality.Qualified ? RuleConfigTuple<T> : QualifiedRuleConfig<T>; @@ -90,41 +90,42 @@ export type EnumRuleConfig<V = RuleConfigQuality.User> = RuleConfig< >; export type RulesConfig<V = RuleConfigQuality.User> = { - 'body-case': CaseRuleConfig<V>; - 'body-empty': RuleConfig<V>; - 'body-full-stop': RuleConfig<V, string>; - 'body-leading-blank': RuleConfig<V>; - 'body-max-length': LengthRuleConfig<V>; - 'body-max-line-length': LengthRuleConfig<V>; - 'body-min-length': LengthRuleConfig<V>; - 'footer-empty': RuleConfig<V>; - 'footer-leading-blank': RuleConfig<V>; - 'footer-max-length': LengthRuleConfig<V>; - 'footer-max-line-length': LengthRuleConfig<V>; - 'footer-min-length': LengthRuleConfig<V>; - 'header-case': CaseRuleConfig<V>; - 'header-full-stop': RuleConfig<V, string>; - 'header-max-length': LengthRuleConfig<V>; - 'header-min-length': LengthRuleConfig<V>; - 'header-trim': RuleConfig<V>; - 'references-empty': RuleConfig<V>; - 'scope-case': CaseRuleConfig<V>; - 'scope-empty': RuleConfig<V>; - 'scope-enum': EnumRuleConfig<V>; - 'scope-max-length': LengthRuleConfig<V>; - 'scope-min-length': LengthRuleConfig<V>; - 'signed-off-by': RuleConfig<V, string>; - 'subject-case': CaseRuleConfig<V>; - 'subject-empty': RuleConfig<V>; - 'subject-full-stop': RuleConfig<V, string>; - 'subject-max-length': LengthRuleConfig<V>; - 'subject-min-length': LengthRuleConfig<V>; - 'trailer-exists': RuleConfig<V, string>; - 'type-case': CaseRuleConfig<V>; - 'type-empty': RuleConfig<V>; - 'type-enum': EnumRuleConfig<V>; - 'type-max-length': LengthRuleConfig<V>; - 'type-min-length': LengthRuleConfig<V>; + "body-case": CaseRuleConfig<V>; + "body-empty": RuleConfig<V>; + "body-full-stop": RuleConfig<V, string>; + "body-leading-blank": RuleConfig<V>; + "body-max-length": LengthRuleConfig<V>; + "body-max-line-length": LengthRuleConfig<V>; + "body-min-length": LengthRuleConfig<V>; + "breaking-change-exclamation-mark": CaseRuleConfig<V>; + "footer-empty": RuleConfig<V>; + "footer-leading-blank": RuleConfig<V>; + "footer-max-length": LengthRuleConfig<V>; + "footer-max-line-length": LengthRuleConfig<V>; + "footer-min-length": LengthRuleConfig<V>; + "header-case": CaseRuleConfig<V>; + "header-full-stop": RuleConfig<V, string>; + "header-max-length": LengthRuleConfig<V>; + "header-min-length": LengthRuleConfig<V>; + "header-trim": RuleConfig<V>; + "references-empty": RuleConfig<V>; + "scope-case": CaseRuleConfig<V>; + "scope-empty": RuleConfig<V>; + "scope-enum": EnumRuleConfig<V>; + "scope-max-length": LengthRuleConfig<V>; + "scope-min-length": LengthRuleConfig<V>; + "signed-off-by": RuleConfig<V, string>; + "subject-case": CaseRuleConfig<V>; + "subject-empty": RuleConfig<V>; + "subject-full-stop": RuleConfig<V, string>; + "subject-max-length": LengthRuleConfig<V>; + "subject-min-length": LengthRuleConfig<V>; + "trailer-exists": RuleConfig<V, string>; + "type-case": CaseRuleConfig<V>; + "type-empty": RuleConfig<V>; + "type-enum": EnumRuleConfig<V>; + "type-max-length": LengthRuleConfig<V>; + "type-min-length": LengthRuleConfig<V>; // Plugins may add their custom rules [key: string]: AnyRuleConfig<V>; }; diff --git a/@packages/test-environment/CHANGELOG.md b/@packages/test-environment/CHANGELOG.md index bf2eaaddd6..5a0b754738 100644 --- a/@packages/test-environment/CHANGELOG.md +++ b/@packages/test-environment/CHANGELOG.md @@ -3,6 +3,33 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package vitest-environment-commitlint + + + + + +# [19.9.0](https://github.com/conventional-changelog/commitlint/compare/v19.8.1...v19.9.0) (2025-08-26) + + +### Bug Fixes + +* update dependency jest-environment-node to v30 ([#4448](https://github.com/conventional-changelog/commitlint/issues/4448)) ([42ca849](https://github.com/conventional-changelog/commitlint/commit/42ca849db3581bb5b7f1bbbcd0dfeda912566e5d)) + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + +**Note:** Version bump only for package vitest-environment-commitlint + + + + + # [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27) diff --git a/@packages/test-environment/package.json b/@packages/test-environment/package.json index c4d34c73d1..75d6d66b4b 100644 --- a/@packages/test-environment/package.json +++ b/@packages/test-environment/package.json @@ -1,7 +1,7 @@ { "name": "vitest-environment-commitlint", "type": "module", - "version": "19.0.0", + "version": "20.0.0", "description": "test environment for @commitlint", "private": true, "main": "lib/test-environment.js", @@ -30,8 +30,8 @@ "license": "MIT", "dependencies": { "@types/tmp": "^0.2.5", - "jest-environment-node": "^29.6.2", - "tmp": "^0.2.1" + "tmp": "^0.2.1", + "vitest": "^3.0.0" }, "gitHead": "71f0194f33943954a8dac1c458be47e5049717cd" } diff --git a/@packages/test-environment/src/test-environment.ts b/@packages/test-environment/src/test-environment.ts index be67cd56ff..448bf7f73e 100644 --- a/@packages/test-environment/src/test-environment.ts +++ b/@packages/test-environment/src/test-environment.ts @@ -1,14 +1,14 @@ // https://github.com/raszi/node-tmp/issues/229 -import type {Environment} from 'vitest'; -import {builtinEnvironments} from 'vitest/environments'; -import tmp from 'tmp'; +import type { Environment } from "vitest"; +import { builtinEnvironments } from "vitest/environments"; +import tmp from "tmp"; const nodeEnv = builtinEnvironments.node; const env: Environment = { ...nodeEnv, - name: 'commitlint', + name: "commitlint", async setup(global: object, options: Record<string, unknown>) { const setupEnv = await nodeEnv.setup(global, options); return { diff --git a/@packages/test/CHANGELOG.md b/@packages/test/CHANGELOG.md index 04086938aa..229303a1d4 100644 --- a/@packages/test/CHANGELOG.md +++ b/@packages/test/CHANGELOG.md @@ -3,6 +3,36 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/test + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + + +### Bug Fixes + +* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299)) + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/test diff --git a/@packages/test/package.json b/@packages/test/package.json index 31e1af0976..629771d7b5 100644 --- a/@packages/test/package.json +++ b/@packages/test/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/test", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "test utilities for @commitlint", "private": true, "main": "lib/index.js", @@ -37,7 +37,7 @@ "fs-extra": "^11.0.0", "pkg-dir": "^8.0.0", "resolve-pkg": "^2.0.0", - "tinyexec": "^0.3.0", + "tinyexec": "^1.0.0", "tmp": "^0.2.1" }, "gitHead": "71f0194f33943954a8dac1c458be47e5049717cd" diff --git a/@packages/test/src/fix.ts b/@packages/test/src/fix.ts index 762949e836..eca5fd03f8 100644 --- a/@packages/test/src/fix.ts +++ b/@packages/test/src/fix.ts @@ -1,8 +1,8 @@ -import path from 'path'; +import path from "node:path"; -import fs from 'fs-extra'; -import {packageDirectory as pkgDir} from 'pkg-dir'; -import tmp from 'tmp'; +import fs from "fs-extra"; +import { packageDirectory as pkgDir } from "pkg-dir"; +import tmp from "tmp"; export async function bootstrap(fixture?: string, directory?: string) { const tmpDir = tmp.dirSync({ @@ -10,8 +10,8 @@ export async function bootstrap(fixture?: string, directory?: string) { unsafeCleanup: true, }); - if (typeof fixture !== 'undefined') { - const packageDir = await pkgDir({cwd: directory}); + if (typeof fixture !== "undefined") { + const packageDir = await pkgDir({ cwd: directory }); if (!packageDir) { throw new Error(`ENOENT, no such file or directory '${packageDir}'`); } diff --git a/@packages/test/src/git.ts b/@packages/test/src/git.ts index e58c7f46ed..04ea365aae 100644 --- a/@packages/test/src/git.ts +++ b/@packages/test/src/git.ts @@ -1,6 +1,6 @@ -import {x} from 'tinyexec'; +import { x } from "tinyexec"; -import * as fix from './fix.js'; +import * as fix from "./fix.js"; export async function bootstrap(fixture?: string, directory?: string) { const cwd = await fix.bootstrap(fixture, directory); @@ -13,35 +13,37 @@ export async function clone( source: string, args: string[], directory?: string, - gitCommand = 'git' + gitCommand = "git", ) { const cwd = await fix.bootstrap(undefined, directory); - await x(gitCommand, ['clone', ...args, source, cwd]); + await x(gitCommand, ["clone", ...args, source, cwd]); await setup(cwd, gitCommand); return cwd; } export async function init(cwd: string) { - await x('git', ['init', cwd]); + await x("git", ["init", cwd]); await setup(cwd); return cwd; } -async function setup(cwd: string, gitCommand = 'git') { +async function setup(cwd: string, gitCommand = "git") { try { - await x(gitCommand, ['config', 'user.name', 'ava'], {nodeOptions: {cwd}}); - await x(gitCommand, ['config', 'user.email', 'test@example.com'], { - nodeOptions: {cwd}, + await x(gitCommand, ["config", "user.name", "ava"], { + nodeOptions: { cwd }, }); - await x(gitCommand, ['config', 'commit.gpgsign', 'false'], { - nodeOptions: {cwd}, + await x(gitCommand, ["config", "user.email", "test@example.com"], { + nodeOptions: { cwd }, + }); + await x(gitCommand, ["config", "commit.gpgsign", "false"], { + nodeOptions: { cwd }, }); } catch (err: any) { - if (typeof err === 'object' && typeof err.message === 'object') { + if (typeof err === "object" && typeof err.message === "object") { console.warn(`git config in ${cwd} failed`, err.message); } else { - console.error('An unknown error occurred setting up the git environment'); + console.error("An unknown error occurred setting up the git environment"); } } } diff --git a/@packages/test/src/index.test.ts b/@packages/test/src/index.test.ts index 0ee0b4ae13..0202eeeeb5 100644 --- a/@packages/test/src/index.test.ts +++ b/@packages/test/src/index.test.ts @@ -1,34 +1,34 @@ -import {test, expect} from 'vitest'; -import os from 'os'; -import path from 'path'; -import fs from 'fs-extra'; +import { test, expect } from "vitest"; +import os from "node:os"; +import path from "node:path"; +import fs from "fs-extra"; -import * as u from './index.js'; +import * as u from "./index.js"; -test('exports a git namespace', () => { - expect(typeof u.git).toBe('object'); +test("exports a git namespace", () => { + expect(typeof u.git).toBe("object"); }); -test('git namespace has bootstrap', () => { - expect(typeof u.git.bootstrap).toBe('function'); +test("git namespace has bootstrap", () => { + expect(typeof u.git.bootstrap).toBe("function"); }); -test('git namespace has clone', () => { - expect(typeof u.git.clone).toBe('function'); +test("git namespace has clone", () => { + expect(typeof u.git.clone).toBe("function"); }); -test('expect to create tmp directory', async () => { +test("expect to create tmp directory", async () => { const directory = await u.git.bootstrap(); - expect(directory).toContain('tmp-'); + expect(directory).toContain("tmp-"); expect(directory).toContain(os.tmpdir()); }); -test('expect to create tmp from directory from src', async () => { - const directory = await u.git.bootstrap('.github'); - expect(directory).toContain('tmp-'); +test("expect to create tmp from directory from src", async () => { + const directory = await u.git.bootstrap(".github"); + expect(directory).toContain("tmp-"); expect(directory).toContain(os.tmpdir()); expect(fs.existsSync(directory)).toBeTruthy(); - const indexFile = path.join(directory, 'PULL_REQUEST_TEMPLATE.md'); + const indexFile = path.join(directory, "PULL_REQUEST_TEMPLATE.md"); expect(fs.existsSync(indexFile)).toBeTruthy(); }); diff --git a/@packages/test/src/index.ts b/@packages/test/src/index.ts index b488ca1393..fb1c9a26a6 100644 --- a/@packages/test/src/index.ts +++ b/@packages/test/src/index.ts @@ -1,5 +1,5 @@ -import * as fix from './fix.js'; -import * as git from './git.js'; -import * as npm from './npm.js'; +import * as fix from "./fix.js"; +import * as git from "./git.js"; +import * as npm from "./npm.js"; -export {fix, git, npm}; +export { fix, git, npm }; diff --git a/@packages/test/src/npm.ts b/@packages/test/src/npm.ts index 997543435d..2c31e5520b 100644 --- a/@packages/test/src/npm.ts +++ b/@packages/test/src/npm.ts @@ -1,19 +1,18 @@ -import path from 'path'; +import path from "node:path"; -import fs from 'fs-extra'; -import resolvePkg from 'resolve-pkg'; +import fs from "fs-extra"; +import resolvePkg from "resolve-pkg"; -import * as git from './git.js'; +import * as git from "./git.js"; export async function installModules(cwd: string) { - const manifestPath = path.join(cwd, 'package.json'); - const targetModulesPath = path.join(cwd, 'node_modules'); + const manifestPath = path.join(cwd, "package.json"); + const targetModulesPath = path.join(cwd, "node_modules"); if (await fs.pathExists(manifestPath)) { - const {dependencies = {}, devDependencies = {}} = await fs.readJson( - manifestPath - ); - const deps = Object.keys({...dependencies, ...devDependencies}); + const { dependencies = {}, devDependencies = {} } = + await fs.readJson(manifestPath); + const deps = Object.keys({ ...dependencies, ...devDependencies }); await Promise.all( deps.map(async (dependency: any) => { const sourcePath = resolvePkg(dependency); @@ -22,7 +21,7 @@ export async function installModules(cwd: string) { throw new Error(`Could not resolve dependency ${dependency}`); } - const sourceModulesPath = findParentPath(sourcePath, 'node_modules'); + const sourceModulesPath = findParentPath(sourcePath, "node_modules"); if (!sourceModulesPath) { throw new Error(`Could not determine node_modules for ${sourcePath}`); @@ -31,9 +30,9 @@ export async function installModules(cwd: string) { const relativePath = path.relative(sourceModulesPath, sourcePath); const targetPath = path.join(targetModulesPath, relativePath); - await fs.mkdirp(path.join(targetPath, '..')); + await fs.mkdirp(path.join(targetPath, "..")); await fs.symlink(sourcePath, targetPath); - }) + }), ); } } @@ -46,23 +45,23 @@ export async function bootstrap(fixture: string, directory?: string) { function findParentPath( parentPath: string, - dirname: string + dirname: string, ): string | undefined { const rawFragments = parentPath.split(path.sep); - const {matched, fragments} = rawFragments.reduceRight( - ({fragments, matched}, item) => { + const { matched, fragments } = rawFragments.reduceRight( + ({ fragments, matched }, item) => { if (item === dirname && !matched) { - return {fragments, matched: true}; + return { fragments, matched: true }; } if (!matched && fragments.length > 0) { fragments.pop(); } - return {fragments, matched}; + return { fragments, matched }; }, - {fragments: rawFragments, matched: false} + { fragments: rawFragments, matched: false }, ); return matched ? fragments.join(path.sep) : undefined; diff --git a/@packages/utils/CHANGELOG.md b/@packages/utils/CHANGELOG.md index 7c23969707..3ccd55a0b5 100644 --- a/@packages/utils/CHANGELOG.md +++ b/@packages/utils/CHANGELOG.md @@ -3,6 +3,36 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + +**Note:** Version bump only for package @commitlint/utils + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + + +### Bug Fixes + +* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299)) + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + + + + # [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11) **Note:** Version bump only for package @commitlint/utils diff --git a/@packages/utils/dep-check.js b/@packages/utils/dep-check.js index cc9c3bdfe3..8f96322333 100755 --- a/@packages/utils/dep-check.js +++ b/@packages/utils/dep-check.js @@ -1,26 +1,26 @@ #!/usr/bin/env node -import path from 'path'; -import {x} from 'tinyexec'; +import path from "node:path"; +import { x } from "tinyexec"; const cwd = process.cwd(); function main() { return Promise.all([ - check(['--missing', '--no-dev', '.']), - check(['--extra', '--no-dev', '.']), + check(["--missing", "--no-dev", "."]), + check(["--extra", "--no-dev", "."]), ]) - .then((tasks) => [null, tasks.map((t) => t.stdout).join('\n')]) + .then((tasks) => [null, tasks.map((t) => t.stdout).join("\n")]) .catch((err) => [err]); } function check(args) { - return x('dependency-check', args, {nodeOptions: {cwd}}); + return x("dependency-check", args, { nodeOptions: { cwd } }); } main().then((args) => { const err = args[0]; const out = args[1]; - console.log(`Checking dependencies ${path.join(cwd, 'package.json')}`); + console.log(`Checking dependencies ${path.join(cwd, "package.json")}`); if (err) { console.error(err.stderr); process.exit(err.exitCode); diff --git a/@packages/utils/package.json b/@packages/utils/package.json index 932805dd84..7c26083e6c 100644 --- a/@packages/utils/package.json +++ b/@packages/utils/package.json @@ -1,7 +1,7 @@ { "name": "@commitlint/utils", "type": "module", - "version": "19.5.0", + "version": "20.0.0", "description": "Development utilities for @commitlint", "private": true, "files": [ @@ -47,7 +47,7 @@ "read-pkg": "^9.0.1", "require-from-string": "^2.0.2", "tar-fs": "^3.0.5", - "tinyexec": "^0.3.0", + "tinyexec": "^1.0.0", "tmp": "^0.2.1", "yargs": "^17.0.0" }, diff --git a/@packages/utils/pkg-check.js b/@packages/utils/pkg-check.js index 8d6b16df32..4f360df846 100755 --- a/@packages/utils/pkg-check.js +++ b/@packages/utils/pkg-check.js @@ -1,19 +1,19 @@ #!/usr/bin/env node -import path from 'path'; -import fs from 'fs'; +import path from "node:path"; +import fs from "node:fs"; -import readPkg from 'read-pkg'; -import requireFromString from 'require-from-string'; -import tar from 'tar-fs'; -import {x} from 'tinyexec'; -import tmp from 'tmp'; -import yargs from 'yargs'; -import zlib from 'zlib'; +import readPkg from "read-pkg"; +import requireFromString from "require-from-string"; +import tar from "tar-fs"; +import { x } from "tinyexec"; +import tmp from "tmp"; +import yargs from "yargs"; +import zlib from "node:zlib"; tmp.setGracefulCleanup(); const PRELUDE = ` -var Module = require('module'); +var Module = require('node:module'); var originalLoader = Module._load Module._load = function(path, parent) { @@ -32,16 +32,16 @@ Module._load = function(path, parent) { function main(flags) { if (!Proxy) { console - .warn('Skipping pkg-check, detected missing Proxy support') + .warn("Skipping pkg-check, detected missing Proxy support") .process.exit(0); } const cwd = flags.cwd || process.cwd(); const skipImport = - typeof flags.skipImport === 'boolean' ? flags.skipImport : false; + typeof flags.skipImport === "boolean" ? flags.skipImport : false; - return readPkg({cwd}).then((pkg) => { - return getTarballFiles(cwd, {write: !skipImport}).then((tarball) => { + return readPkg({ cwd }).then((pkg) => { + return getTarballFiles(cwd, { write: !skipImport }).then((tarball) => { return getPackageFiles(cwd).then((pkgFiles) => { let problems = []; @@ -50,16 +50,16 @@ function main(flags) { pkgFiles.bin .filter((binFile) => tarball.files.indexOf(binFile) === -1) .map((binFile) => ({ - type: 'bin', + type: "bin", file: binFile, message: `Required bin file ${binFile} not found for ${pkg.name}`, - })) + })), ); } if (!flags.skipMain && tarball.files.indexOf(pkgFiles.main) === -1) { problems.push({ - type: 'main', + type: "main", file: pkgFiles.main, message: `Required main file ${pkgFiles.main} not found for ${pkg.name}`, }); @@ -67,11 +67,11 @@ function main(flags) { if (!flags.skipImport && !flags.skipMain) { const importable = fileImportable( - path.join(tarball.dirname, pkgFiles.main) + path.join(tarball.dirname, pkgFiles.main), ); if (!importable[1]) { problems.push({ - type: 'import', + type: "import", file: pkgFiles.main, message: `Error while importing ${pkgFiles.main}: ${importable[0].message}`, }); @@ -93,37 +93,37 @@ main( yargs .options({ cwd: { - description: 'directory to execute in', - type: 'string', + description: "directory to execute in", + type: "string", }, skipMain: { default: false, - type: 'boolean', - description: 'Skip main checks', + type: "boolean", + description: "Skip main checks", }, skipBin: { default: false, - type: 'boolean', - description: 'Skip bin checks', + type: "boolean", + description: "Skip bin checks", }, skipImport: { default: false, - type: 'boolean', - description: 'Skip import smoke test', + type: "boolean", + description: "Skip import smoke test", }, }) - .scriptName('pkg-check') - .usage('pkg-check\n') - .usage('Check if a package creates valid tarballs') - .example('$0', '') + .scriptName("pkg-check") + .usage("pkg-check\n") + .usage("Check if a package creates valid tarballs") + .example("$0", "") .help() .version() - .strict().argv + .strict().argv, ) .then((report) => { if (report.problems.length > 0) { console.log( - `Found ${report.problems.length} problems while checking tarball for ${report.pkg.name}:` + `Found ${report.problems.length} problems while checking tarball for ${report.pkg.name}:`, ); report.problems.forEach((problem) => { @@ -145,16 +145,16 @@ async function getTarballFiles(source, options) { unsafeCleanup: true, }); const cwd = tmpDir.name; - const tarball = path.join(cwd, 'test-archive.tgz'); - await x('yarn', ['pack', '--filename', tarball], { - nodeOptions: {cwd: source}, + const tarball = path.join(cwd, "test-archive.tgz"); + await x("yarn", ["pack", "--filename", tarball], { + nodeOptions: { cwd: source }, }); return getArchiveFiles(tarball, options); } function getArchiveFiles(filePath, options) { - const write = typeof options.write === 'boolean' ? options.write : true; + const write = typeof options.write === "boolean" ? options.write : true; return new Promise((resolve, reject) => { const files = []; @@ -163,17 +163,17 @@ function getArchiveFiles(filePath, options) { .pipe( tar.extract(path.dirname(filePath), { ignore(_, header) { - files.push(path.relative('package', header.name)); + files.push(path.relative("package", header.name)); return !write; }, - }) + }), ) - .once('error', (err) => reject(err)) - .once('finish', () => + .once("error", (err) => reject(err)) + .once("finish", () => resolve({ - dirname: path.join(path.dirname(filePath), 'package'), + dirname: path.join(path.dirname(filePath), "package"), files: files, - }) + }), ); }); } @@ -181,7 +181,7 @@ function getArchiveFiles(filePath, options) { function getPackageFiles(source) { return readPkg(source).then((pkg) => { return { - main: normalizeMainPath(pkg.main || './index.js'), + main: normalizeMainPath(pkg.main || "./index.js"), bin: getPkgBinFiles(pkg.bin), }; }); @@ -200,11 +200,11 @@ function getPkgBinFiles(bin) { return []; } - if (typeof bin === 'string') { + if (typeof bin === "string") { return [path.normalize(bin)]; } - if (typeof bin === 'object') { + if (typeof bin === "object") { return Object.values(bin).map((b) => path.normalize(b)); } } @@ -216,7 +216,7 @@ function fileImportable(file) { ${PRELUDE} ${fs.readFileSync(file)} `, - file + file, ); return [null, true]; } catch (err) { diff --git a/CHANGELOG.md b/CHANGELOG.md index 6baaf1a0b2..27d8b8092c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,155 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30) + + +### Bug Fixes + +* **resolve-extends:** add import attribute for JSON config files ([#4551](https://github.com/conventional-changelog/commitlint/issues/4551)) ([82936c9](https://github.com/conventional-changelog/commitlint/commit/82936c90a2845b4f5721eef3c71d6183416d5b78)) + + +### Features + +* **config-pnpm-scopes:** allow global scope ([#4553](https://github.com/conventional-changelog/commitlint/issues/4553)) ([e571970](https://github.com/conventional-changelog/commitlint/commit/e57197061447eb9ea74b8d81ab003ad3b4652be6)) + + + + + +# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25) + + +### Bug Fixes + +* update dependency tar-fs to v3.1.1 [security] ([#4550](https://github.com/conventional-changelog/commitlint/issues/4550)) ([273a43e](https://github.com/conventional-changelog/commitlint/commit/273a43e359fc04b7b8f4b4949ec7ecc07718b786)) + + +* feat(rules)!: make body-max-line-length ignore lines with URLs (#4486) ([2f37a88](https://github.com/conventional-changelog/commitlint/commit/2f37a886be4b07bcd8e1126cc6a13256e7b6cc37)), closes [#4486](https://github.com/conventional-changelog/commitlint/issues/4486) + + +### BREAKING CHANGES + +* when lines contain URLs exceeding the maximum +line length `body-max-line-length` will be ignored + + + + + +## [19.9.1](https://github.com/conventional-changelog/commitlint/compare/v19.9.0...v19.9.1) (2025-08-29) + + +### Bug Fixes + +* add TypeScript support and configuration for pnpm scopes ([#4544](https://github.com/conventional-changelog/commitlint/issues/4544)) ([ea75778](https://github.com/conventional-changelog/commitlint/commit/ea75778e8d32c932d85062902456cd821e471fdd)) + + + + + +# [19.9.0](https://github.com/conventional-changelog/commitlint/compare/v19.8.1...v19.9.0) (2025-08-26) + + +### Bug Fixes + +* update dependency jest-environment-node to v30 ([#4448](https://github.com/conventional-changelog/commitlint/issues/4448)) ([42ca849](https://github.com/conventional-changelog/commitlint/commit/42ca849db3581bb5b7f1bbbcd0dfeda912566e5d)) +* update dependency jest-environment-node to v30.0.2 ([#4469](https://github.com/conventional-changelog/commitlint/issues/4469)) ([4da7e43](https://github.com/conventional-changelog/commitlint/commit/4da7e43be4134cbc01f847f82ef438fdfcc6dda9)) +* update dependency tar-fs to v3.0.10 ([#4461](https://github.com/conventional-changelog/commitlint/issues/4461)) ([f02c47c](https://github.com/conventional-changelog/commitlint/commit/f02c47c669055f3ce6f0f4ba553d4a5ed4e1ee57)) +* update dependency tar-fs to v3.0.9 ([#4421](https://github.com/conventional-changelog/commitlint/issues/4421)) ([0650e03](https://github.com/conventional-changelog/commitlint/commit/0650e03d960eb904c40a3faf4c8d24415807bbdd)) +* update dependency tar-fs to v3.1.0 ([#4496](https://github.com/conventional-changelog/commitlint/issues/4496)) ([31b4f72](https://github.com/conventional-changelog/commitlint/commit/31b4f72d2fdca5094b1325bdac7bcd5c5693c423)) + + +### Features + +* **config-pnpm-scopes:** migrate package to TypeScript ([#4541](https://github.com/conventional-changelog/commitlint/issues/4541)) ([6ae36ea](https://github.com/conventional-changelog/commitlint/commit/6ae36ea5a55d7736024461ec6af94a14b821acc4)) + + +### Reverts + +* Revert "chore: update dependency cross-env to v10 (#4528)" (#4529) ([b5bfd12](https://github.com/conventional-changelog/commitlint/commit/b5bfd125140c5a7a6bcdefb9c3d22b7c13e3ea17)), closes [#4528](https://github.com/conventional-changelog/commitlint/issues/4528) [#4529](https://github.com/conventional-changelog/commitlint/issues/4529) + + + + + +## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08) + + +### Bug Fixes + +* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299)) +* update dependency tinyexec to v1.0.1 ([#4347](https://github.com/conventional-changelog/commitlint/issues/4347)) ([c1b26d1](https://github.com/conventional-changelog/commitlint/commit/c1b26d1579a5bc310a750f2c75143027129d2321)) + + +### Performance Improvements + +* **rules:** optimize header-trim ([#4363](https://github.com/conventional-changelog/commitlint/issues/4363)) ([b7e404b](https://github.com/conventional-changelog/commitlint/commit/b7e404bc036dbd3cbdffa38e85c833d10e52d68b)) + + + + + +# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07) + + +### Bug Fixes + +* **config-lerna-scopes:** remove deprecated @lerna/project dependency ([#4284](https://github.com/conventional-changelog/commitlint/issues/4284)) ([f2f78f1](https://github.com/conventional-changelog/commitlint/commit/f2f78f105a32d040d8eb7e340f59a1d50fad9ac0)) +* update dependency semver to v7.7.1 ([#4272](https://github.com/conventional-changelog/commitlint/issues/4272)) ([6148587](https://github.com/conventional-changelog/commitlint/commit/6148587400b7f4c041183e3b2e5f1cfadbe2d6b0)) + + +### Features + +* **config-workspace-scopes:** add config preset for npm and yarn workspaces ([#4269](https://github.com/conventional-changelog/commitlint/issues/4269)) ([67ff9e8](https://github.com/conventional-changelog/commitlint/commit/67ff9e82c10898757052df1d4233566b0b2cb433)) + + +### Performance Improvements + +* use `node:` prefix to bypass require.cache call for builtins ([#4302](https://github.com/conventional-changelog/commitlint/issues/4302)) ([0cd8f41](https://github.com/conventional-changelog/commitlint/commit/0cd8f410573fe11383f788b1ceb7e0946143591d)) + + +### Reverts + +* Revert "fix: improve security validation regex in is-ignored function (#4258)" (#4314) ([b27024a](https://github.com/conventional-changelog/commitlint/commit/b27024a5ae509d1df9373ed712f2279d0bc39170)), closes [#4258](https://github.com/conventional-changelog/commitlint/issues/4258) [#4314](https://github.com/conventional-changelog/commitlint/issues/4314) + + + + + +## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02) + + +### Bug Fixes + +* **config-nx-scopes:** fix for projects without explicit targets ([#4261](https://github.com/conventional-changelog/commitlint/issues/4261)) ([25bb2cd](https://github.com/conventional-changelog/commitlint/commit/25bb2cd8c70353637f77d471e39f4e4b17fa4cae)) +* improve security validation regex in is-ignored function ([#4258](https://github.com/conventional-changelog/commitlint/issues/4258)) ([7403d63](https://github.com/conventional-changelog/commitlint/commit/7403d6382cc2fb1f066a47d7229593eefe528561)) +* update dependency fast-glob to v3.3.3 ([#4235](https://github.com/conventional-changelog/commitlint/issues/4235)) ([c286237](https://github.com/conventional-changelog/commitlint/commit/c28623733351f2920d32e27169a27e127f900985)) +* update dependency fs-extra to v11.3.0 ([#4249](https://github.com/conventional-changelog/commitlint/issues/4249)) ([39acfe4](https://github.com/conventional-changelog/commitlint/commit/39acfe4a3d88863d126a6a9661a80246a7df9428)) +* update dependency tar-fs to v3.0.7 ([#4243](https://github.com/conventional-changelog/commitlint/issues/4243)) ([708320f](https://github.com/conventional-changelog/commitlint/commit/708320f0403684d2f76a20eb8a83deb84c0c808e)) +* update dependency tar-fs to v3.0.8 ([#4247](https://github.com/conventional-changelog/commitlint/issues/4247)) ([ecb5d3a](https://github.com/conventional-changelog/commitlint/commit/ecb5d3a1c5be5713ccdbb4f4e863390a80d8d917)) + + + + + +# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04) + + +### Bug Fixes + +* update dependency chalk to v5.4.1 ([#4228](https://github.com/conventional-changelog/commitlint/issues/4228)) ([0b11176](https://github.com/conventional-changelog/commitlint/commit/0b111767fa6700eab82c7a4804273c0f6275a3d3)) +* update dependency tinyexec to v0.3.2 ([#4229](https://github.com/conventional-changelog/commitlint/issues/4229)) ([dca0d97](https://github.com/conventional-changelog/commitlint/commit/dca0d97261977681b0366d9733dbbf227bb9a9b1)) + + +### Features + +* support lerna 7 and 8 ([#4221](https://github.com/conventional-changelog/commitlint/issues/4221)) ([3b8da63](https://github.com/conventional-changelog/commitlint/commit/3b8da63f50f868555a3f026a76e96cd8d20638de)) + + + + + ## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15) diff --git a/Dockerfile.ci b/Dockerfile.ci index 25a4fec074..3b9351355c 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -1,3 +1,4 @@ +# syntax=docker/dockerfile:1 FROM docker.io/library/node:18-alpine AS builder WORKDIR /src COPY . ./ @@ -7,6 +8,7 @@ RUN yarn install --frozen-lockfile --network-timeout 100000 && \ # Commit lint CLI packages npm pack @commitlint/cli && \ npm pack @commitlint/config-validator && \ + npm pack @commitlint/config-pnpm-scopes && \ npm pack @commitlint/config-nx-scopes && \ npm pack @commitlint/ensure && \ npm pack @commitlint/execute-rule && \ diff --git a/Dockerfile.dev b/Dockerfile.dev index a85d53ac6f..a00826f979 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,3 +1,4 @@ +# syntax=docker/dockerfile:1 FROM brainpower/node-cubicle WORKDIR /root/repo diff --git a/README.md b/README.md index f8d93d4f23..2219e7aa4a 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,13 @@ These can be modified by [your own configuration](#config). - See [Rules](./docs/reference/rules.md) for a complete list of possible rules - An example configuration can be found at [@commitlint/config-conventional](./@commitlint/config-conventional/src/index.ts) +### Important note about Node 24+ + +Node v24 changes the way that modules are loaded, and this includes the commitlint config file. If your project does not contain a `package.json`, commitlint may fail to load the config, resulting in a `Please add rules to your commitlint.config.js` error message. This can be fixed by doing either of the following: + +- Add a `package.json` file, declaring your project as an ES6 module. This can be done easily by running `npm init es6`. +- Rename the config file from `commitlint.config.js` to `commitlint.config.mjs`. + ## Shared configuration A number of shared configurations are available to install and use with `commitlint`: @@ -127,6 +134,7 @@ A number of shared configurations are available to install and use with `commitl - [@commitlint/config-lerna-scopes](./@commitlint/config-lerna-scopes) - [@commitlint/config-nx-scopes](./@commitlint/config-nx-scopes) - [@commitlint/config-patternplate](./@commitlint/config-patternplate) +- [@commitlint/config-workspace-scopes](./@commitlint/config-workspace-scopes) - [conventional-changelog-lint-config-atom](https://github.com/erikmueller/conventional-changelog-lint-config-atom) - [conventional-changelog-lint-config-canonical](https://github.com/gajus/conventional-changelog-lint-config-canonical) diff --git a/docker-compose.yml b/compose.yaml similarity index 68% rename from docker-compose.yml rename to compose.yaml index 401320c97e..710f6a0bb9 100644 --- a/docker-compose.yml +++ b/compose.yaml @@ -1,4 +1,3 @@ -version: '3' services: commitlint: build: @@ -6,10 +5,10 @@ services: dockerfile: Dockerfile.dev image: marionebl/commitlint-cubicle ports: - - '8443:8443' + - "8443:8443" environment: - - SSH_AUTH_SOCK=/.ssh-agent/socket - - SSH_AUTH_PROXY_SOCK=/.ssh-agent/proxy-socket + SSH_AUTH_SOCK: /.ssh-agent/socket + SSH_AUTH_PROXY_SOCK: /.ssh-agent/proxy-socket volumes: - .:/root/repo - $SSH_AUTH_SOCK:/.ssh-agent/socket diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 3bafab5417..55de22edfd 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -1,98 +1,100 @@ -import {defineConfig} from 'vitepress'; -import {tabsMarkdownPlugin} from 'vitepress-plugin-tabs'; +import { defineConfig } from "vitepress"; +import { tabsMarkdownPlugin } from "vitepress-plugin-tabs"; // https://vitepress.dev/reference/site-config export default defineConfig({ - title: 'commitlint', - description: 'Lint commit messages', + title: "commitlint", + description: "Lint commit messages", - head: [['link', {rel: 'icon', type: 'image/png', href: '/assets/icon.png'}]], + head: [ + ["link", { rel: "icon", type: "image/png", href: "/assets/icon.png" }], + ], themeConfig: { // https://vitepress.dev/reference/default-theme-config editLink: { pattern: - 'https://github.com/conventional-changelog/commitlint/edit/master/docs/:path', + "https://github.com/conventional-changelog/commitlint/edit/master/docs/:path", }, - logo: '/assets/icon.png', + logo: "/assets/icon.png", nav: [ - {text: 'Home', link: '/'}, - {text: 'Guides', link: '/guides/getting-started'}, - {text: 'Reference', link: '/reference/configuration'}, + { text: "Home", link: "/" }, + { text: "Guides", link: "/guides/getting-started" }, + { text: "Reference", link: "/reference/configuration" }, ], sidebar: [ { - text: 'Guides', - base: '/guides', + text: "Guides", + base: "/guides", items: [ - {text: 'Getting started', link: '/getting-started'}, - {text: 'Local setup', link: '/local-setup'}, - {text: 'CI setup', link: '/ci-setup'}, - {text: 'Use prompt', link: '/use-prompt'}, + { text: "Getting started", link: "/getting-started" }, + { text: "Local setup", link: "/local-setup" }, + { text: "CI setup", link: "/ci-setup" }, + { text: "Use prompt", link: "/use-prompt" }, ], }, { - text: 'Reference', - base: '/reference', + text: "Reference", + base: "/reference", items: [ - {text: 'CLI', link: '/cli'}, - {text: 'Configuration', link: '/configuration'}, - {text: 'Rules configuration', link: '/rules-configuration'}, - {text: 'Rules', link: '/rules'}, - {text: 'Plugins', link: '/plugins'}, - {text: 'Prompt', link: '/prompt'}, - {text: 'Examples', link: '/examples'}, - {text: 'Community projects', link: '/community-projects'}, + { text: "CLI", link: "/cli" }, + { text: "Configuration", link: "/configuration" }, + { text: "Rules configuration", link: "/rules-configuration" }, + { text: "Rules", link: "/rules" }, + { text: "Plugins", link: "/plugins" }, + { text: "Prompt", link: "/prompt" }, + { text: "Examples", link: "/examples" }, + { text: "Community projects", link: "/community-projects" }, ], }, { - text: 'API', - base: '/api', + text: "API", + base: "/api", collapsed: true, items: [ - {text: '@commitlint/load', link: '/load'}, - {text: '@commitlint/read', link: '/read'}, - {text: '@commitlint/lint', link: '/lint'}, - {text: '@commitlint/format', link: '/format'}, + { text: "@commitlint/load", link: "/load" }, + { text: "@commitlint/read", link: "/read" }, + { text: "@commitlint/lint", link: "/lint" }, + { text: "@commitlint/format", link: "/format" }, ], }, { - text: 'Concepts', - base: '/concepts', + text: "Concepts", + base: "/concepts", collapsed: true, items: [ - {text: 'Commit-conventions', link: '/commit-conventions'}, - {text: 'Shareable config', link: '/shareable-config'}, + { text: "Commit-conventions", link: "/commit-conventions" }, + { text: "Shareable config", link: "/shareable-config" }, ], }, { - text: 'Support', - base: '/support', + text: "Support", + base: "/support", collapsed: true, items: [ - {text: 'Troubleshooting', link: '/troubleshooting'}, - {text: 'Releases', link: '/releases'}, - {text: 'Upgrade commitlint', link: '/upgrade'}, + { text: "Troubleshooting", link: "/troubleshooting" }, + { text: "Releases", link: "/releases" }, + { text: "Upgrade commitlint", link: "/upgrade" }, ], }, { - text: 'Attributions', - link: '/attributions', + text: "Attributions", + link: "/attributions", }, ], socialLinks: [ { - icon: 'github', - link: 'https://github.com/conventional-changelog/commitlint', + icon: "github", + link: "https://github.com/conventional-changelog/commitlint", }, ], search: { - provider: 'local', + provider: "local", }, }, diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index c1b1900e45..afe3923ee8 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,11 +1,11 @@ // .vitepress/theme/index.ts -import type {Theme} from 'vitepress'; -import DefaultTheme from 'vitepress/theme'; -import {enhanceAppWithTabs} from 'vitepress-plugin-tabs/client'; +import type { Theme } from "vitepress"; +import DefaultTheme from "vitepress/theme"; +import { enhanceAppWithTabs } from "vitepress-plugin-tabs/client"; export default { extends: DefaultTheme, - enhanceApp({app}) { + enhanceApp({ app }) { enhanceAppWithTabs(app); }, } satisfies Theme; diff --git a/docs/api/format.md b/docs/api/format.md index b490bb972a..55a8ead843 100644 --- a/docs/api/format.md +++ b/docs/api/format.md @@ -68,7 +68,7 @@ format(report?: Report = {}, options?: formatOptions = {}) => string[]; ## Import ```js -import format from '@commitlint/format'; +import format from "@commitlint/format"; ``` ## Examples @@ -94,20 +94,20 @@ format( warnings: [ { level: 0, - name: 'some-hint', - message: 'This will not show up as it has level 0', + name: "some-hint", + message: "This will not show up as it has level 0", }, { level: 1, - name: 'some-warning', - message: 'This will show up yellow as it has level 1', + name: "some-warning", + message: "This will show up yellow as it has level 1", }, ], errors: [ { level: 2, - name: 'some-error', - message: 'This will show up red as it has level 2', + name: "some-error", + message: "This will show up red as it has level 2", }, ], }, @@ -115,7 +115,7 @@ format( }, { color: false, - } + }, ); /* => [ diff --git a/docs/api/lint.md b/docs/api/lint.md index 3f8b7cb439..dbd676563d 100644 --- a/docs/api/lint.md +++ b/docs/api/lint.md @@ -45,13 +45,13 @@ lint(message: string, rules: {[ruleName: string]: Rule}, opts?: Options) => Prom ### Import ```js -import lint from '@commitlint/lint'; +import lint from "@commitlint/lint"; ``` ### Usage without config ```js -const report = await lint('foo: bar'); +const report = await lint("foo: bar"); console.log(report); // => { valid: true, errors: [], warnings: [] } ``` @@ -59,7 +59,7 @@ console.log(report); ### Usage with type-enum rules and valid message ```js -const report = await lint('foo: bar', {'type-enum': [1, 'always', ['foo']]}); +const report = await lint("foo: bar", { "type-enum": [1, "always", ["foo"]] }); console.log(report); // => { valid: true, errors: [], warnings: [] } ``` @@ -67,7 +67,7 @@ console.log(report); ### Usage with type-enum rules and invalid message ```js -const report = await lint('foo: bar', {'type-enum': [1, 'always', ['bar']]}); +const report = await lint("foo: bar", { "type-enum": [1, "always", ["bar"]] }); console.log(report); /* => { @@ -91,14 +91,14 @@ console.log(report); const opts = { parserOpts: { headerPattern: /^(\w*)-(\w*)/, - headerCorrespondence: ['type', 'scope'], + headerCorrespondence: ["type", "scope"], }, }; const report = await lint( - 'foo-bar', - {'type-enum': [2, 'always', ['foo']]}, - opts + "foo-bar", + { "type-enum": [2, "always", ["foo"]] }, + opts, ); console.log(report); // => { valid: true, errors: [], warnings: [] } @@ -107,18 +107,18 @@ console.log(report); ## Load configuration ```js -import load from '@commitlint/load'; -import lint from '@commitlint/lint'; +import load from "@commitlint/load"; +import lint from "@commitlint/lint"; const CONFIG = { - extends: ['@commitlint/config-conventional'], + extends: ["@commitlint/config-conventional"], }; const opts = await load(CONFIG); const report = await lint( - 'foo: bar', + "foo: bar", opts.rules, - opts.parserPreset ? {parserOpts: opts.parserPreset.parserOpts} : {} + opts.parserPreset ? { parserOpts: opts.parserPreset.parserOpts } : {}, ); console.log(report); /* => @@ -140,14 +140,14 @@ console.log(report); ## Read git history ```js -import lint from '@commitlint/lint'; -import read from '@commitlint/read'; +import lint from "@commitlint/lint"; +import read from "@commitlint/read"; const RULES = { - 'type-enum': [2, 'always', ['foo']], + "type-enum": [2, "always", ["foo"]], }; -const commits = await read({to: 'HEAD', from: 'HEAD~2'}); +const commits = await read({ to: "HEAD", from: "HEAD~2" }); console.info(commits.map((commit) => lint(commit, RULES))); ``` @@ -155,17 +155,17 @@ console.info(commits.map((commit) => lint(commit, RULES))); ## Simplified last-commit checker ```js -import load from '@commitlint/load'; -import read from '@commitlint/read'; -import lint from '@commitlint/lint'; +import load from "@commitlint/load"; +import read from "@commitlint/read"; +import lint from "@commitlint/lint"; -const {rules, parserPreset} = load(); -const [commit] = await read({from: 'HEAD~1'}); +const { rules, parserPreset } = load(); +const [commit] = await read({ from: "HEAD~1" }); const report = await lint( commit, rules, - parserPreset ? {parserOpts: parserPreset.parserOpts} : {} + parserPreset ? { parserOpts: parserPreset.parserOpts } : {}, ); console.log(JSON.stringify(result.valid)); diff --git a/docs/api/load.md b/docs/api/load.md index b8d917233a..87fa67a439 100644 --- a/docs/api/load.md +++ b/docs/api/load.md @@ -127,7 +127,7 @@ load(seed: Seed = {}, options?: LoadOptions = {cwd: process.cwd()}) => Promise<C ## Import ```js -import load from '@commitlint/load'; +import load from "@commitlint/load"; ``` ## Examples @@ -137,7 +137,7 @@ import load from '@commitlint/load'; ```js const config = await load({ rules: { - 'body-leading-blank': [2, 'always'], + "body-leading-blank": [2, "always"], }, }); console.log(config); @@ -147,7 +147,7 @@ console.log(config); ### Reference a file ```js -const config = await load({extends: ['./package']}); +const config = await load({ extends: ["./package"] }); console.log(config); // => { extends: ['./package', './package-b'], rules: {} } ``` @@ -155,7 +155,7 @@ console.log(config); ### Inline `parserPreset` ```js -const config = await load({parserPreset: './parser-preset.js'}); +const config = await load({ parserPreset: "./parser-preset.js" }); console.log(config); /* => { @@ -173,7 +173,10 @@ console.log(config); ### Config file with with current working directory ```js -const config = await load({}, {file: '.commitlintrc.yml', cwd: process.cwd()}); +const config = await load( + {}, + { file: ".commitlintrc.yml", cwd: process.cwd() }, +); console.log(config); /* => { diff --git a/docs/api/read.md b/docs/api/read.md index 6cfaab96e9..1c66452194 100644 --- a/docs/api/read.md +++ b/docs/api/read.md @@ -26,7 +26,7 @@ read(range: Range) => Promise<string[]> ## Import ```js -import read from '@commitlint/read'; +import read from "@commitlint/read"; ``` ## Examples @@ -39,7 +39,7 @@ Consider to have a repository with two commits: ### Using `edit: true` ```js -const result = await read({edit: true}); +const result = await read({ edit: true }); console.info(result); // => ['I did something\n\n'] ``` @@ -47,7 +47,7 @@ console.info(result); ### Read last two commits ```js -const result = await read({from: 'HEAD~2'}); +const result = await read({ from: "HEAD~2" }); console.info(result); // => ['I did something\n\n', 'Initial commit\n\n'] ``` @@ -55,7 +55,7 @@ console.info(result); ### Read commits within a range ```js -const result = await read({from: 'HEAD~2', to: 'HEAD~1'}); +const result = await read({ from: "HEAD~2", to: "HEAD~1" }); console.info(result); // => ['Initial commit\n\n'] ``` @@ -63,7 +63,7 @@ console.info(result); ### Read commit message from git gui file ```js -const result = await read({edit: './git/GITGUI_EDITMESSAGE'}); +const result = await read({ edit: "./git/GITGUI_EDITMESSAGE" }); console.info(result); // => ['I did something via git gui\n\n'] ``` diff --git a/docs/concepts/shareable-config.md b/docs/concepts/shareable-config.md index 95b2689a40..c94748a456 100644 --- a/docs/concepts/shareable-config.md +++ b/docs/concepts/shareable-config.md @@ -10,7 +10,7 @@ an object containing `.rules` as default. To use shared configuration you specif * @type {import('@commitlint/types').UserConfig} */ export default { - extends: ['example'], // => commitlint-config-example + extends: ["example"], // => commitlint-config-example }; ``` @@ -39,7 +39,7 @@ This must always start with a `.` (dot). ```js [commitlint.config.js] export default { - extends: ['./example'], // => ./example.js + extends: ["./example"], // => ./example.js }; ``` @@ -55,7 +55,7 @@ You can provide the full path of the package like: ```js [commitlint.config.js] export default { - extends: ['@commitlint/config-conventional'], // => @commitlint/config-conventional + extends: ["@commitlint/config-conventional"], // => @commitlint/config-conventional }; ``` @@ -70,7 +70,7 @@ Or just the scope/owner of the package. ```js [commitlint.config.js] export default { - extends: ['@coolcompany'], // => @coolcompany/commitlint-config + extends: ["@coolcompany"], // => @coolcompany/commitlint-config }; ``` diff --git a/docs/guides/ci-setup.md b/docs/guides/ci-setup.md index 2ebb948ed5..f05ac98022 100644 --- a/docs/guides/ci-setup.md +++ b/docs/guides/ci-setup.md @@ -15,30 +15,29 @@ name: CI on: [push, pull_request] +permissions: + contents: read + jobs: commitlint: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Install required dependencies - run: | - apt update - apt install -y sudo - sudo apt install -y git curl - curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - - sudo DEBIAN_FRONTEND=noninteractive apt install -y nodejs + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: npm + - name: Install commitlint + run: npm install -D @commitlint/cli @commitlint/config-conventional - name: Print versions run: | git --version node --version npm --version npx commitlint --version - - name: Install commitlint - run: | - npm install conventional-changelog-conventionalcommits - npm install commitlint@latest - name: Validate current commit (last commit) with commitlint if: github.event_name == 'push' @@ -133,7 +132,7 @@ lint:commit: - apk add --no-cache git - npm install --save-dev @commitlint/config-conventional @commitlint/cli script: - - echo "${CI_COMMIT_MESSAGE}" | npx commitlint + - npx commitlint --from ${CI_MERGE_REQUEST_DIFF_BASE_SHA} --to ${CI_COMMIT_SHA} ``` GitLab limits `git clone` depth to @@ -143,16 +142,16 @@ Setting `GIT_DEPTH: 0` removes this limitation, so `commitlint` can check larger ## GitLab CI with pre-build container ```yaml -stages: ['lint', 'build', 'test'] +stages: ["lint", "build", "test"] lint:commit: image: name: registry.hub.docker.com/commitlint/commitlint:latest - entrypoint: [''] + entrypoint: [""] stage: lint script: # Uncomment the next line if you are extending the @commitlint/config-nx-scopes in your commitlint configuration #- npm i -g nx@$(node -pe "require('./package.json').devDependencies.nx") - - echo "${CI_COMMIT_MESSAGE}" | commitlint + - commitlint --from ${CI_MERGE_REQUEST_DIFF_BASE_SHA} --to ${CI_COMMIT_SHA} ``` ## Jenkins X @@ -206,7 +205,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: '20.x' + versionSpec: "20.x" checkLatest: true - script: | diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index f701a63cfb..bf0404895a 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -7,23 +7,23 @@ Install `@commitlint/cli` and a `@commitlint/config-*` / `commitlint-config-*` o ::: code-group ```sh [npm] -npm install --save-dev @commitlint/{cli,config-conventional} +npm install -D @commitlint/cli @commitlint/config-conventional ``` ```sh [yarn] -yarn add --dev @commitlint/{cli,config-conventional} +yarn add -D @commitlint/cli @commitlint/config-conventional ``` -```sh [npm (Windows)] -npm install --save-dev @commitlint/config-conventional @commitlint/cli +```sh [pnpm] +pnpm add -D @commitlint/cli @commitlint/config-conventional ``` -```sh [pnpm] -pnpm add --save-dev @commitlint/{cli,config-conventional} +```sh [bun] +bun add -d @commitlint/cli @commitlint/config-conventional ``` ```sh [deno] -deno add --dev npm:@commitlint/cli npm:@commitlint/config-conventional +deno add -D npm:@commitlint/cli npm:@commitlint/config-conventional ``` ::: @@ -36,4 +36,10 @@ Configure commitlint to use conventional config echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js ``` +> [!WARNING] +> Node v24 changes the way that modules are loaded, and this includes the commitlint config file. If your project does not contain a `package.json`, commitlint may fail to load the config, resulting in a `Please add rules to your commitlint.config.js` error message. This can be fixed by doing either of the following: +> +> - Add a `package.json` file, declaring your project as an ES6 module. This can be done easily by running `npm init es6`. +> - Rename the config file from `commitlint.config.js` to `commitlint.config.mjs`. + Refer to [configuration documentation](/reference/configuration) for more information. diff --git a/docs/guides/local-setup.md b/docs/guides/local-setup.md index 2c53869b0f..af597d7367 100644 --- a/docs/guides/local-setup.md +++ b/docs/guides/local-setup.md @@ -31,12 +31,15 @@ You can find complete setup instructions on the [official documentation](https:/ ```sh npm install --save-dev husky +# husky@v9 npx husky init +# husky@v8 or lower +npx husky install # Add commit message linting to commit-msg hook echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg # Windows users should use ` to escape dollar signs -echo "npx --no commitlint --edit `$1" > .husky/commit-msg +echo "npx --no -- commitlint --edit `$1" > .husky/commit-msg ``` As an alternative you can create a script inside `package.json` @@ -51,7 +54,10 @@ echo "npm run commitlint \${1}" > .husky/commit-msg ```sh yarn add --dev husky +# husky@v9 yarn husky init +# husky@v8 or lower +yarn husky install # Add commit message linting to commit-msg hook echo "yarn commitlint --edit \$1" > .husky/commit-msg @@ -74,7 +80,10 @@ echo "yarn commitlint \${1}" > .husky/commit-msg ```sh pnpm add --save-dev husky +# husky@v9 pnpm husky init +# husky@v8 or lower +pnpm husky install # Add commit message linting to commit-msg hook echo "pnpm dlx commitlint --edit \$1" > .husky/commit-msg @@ -89,12 +98,31 @@ npm pkg set scripts.commitlint="commitlint --edit" echo "pnpm commitlint \${1}" > .husky/commit-msg ``` +== bun + +```sh +bun add --dev husky + +# husky@v9 +bunx husky init +# husky@v8 or lower +bunx husky install + +# Add commit message linting to commit-msg hook +echo "bunx commitlint --edit \$1" > .husky/commit-msg +# Windows users should use ` to escape dollar signs +echo "bunx commitlint --edit `$1" > .husky/commit-msg +``` + == deno ```sh deno add --dev husky +# husky@v9 deno task --eval husky init +# husky@v8 or lower +deno task --eval husky install # Add commit message linting to commit-msg hook echo "deno task --eval commitlint --edit \$1" > .husky/commit-msg @@ -119,10 +147,30 @@ Info about git hooks can be found on [Git documentation](https://git-scm.com/boo For a first simple usage test of commitlint you can do the following: -```bash +::: code-group + +```sh [npm] npx commitlint --from HEAD~1 --to HEAD --verbose ``` +```sh [yarn] +yarn commitlint --from HEAD~1 --to HEAD --verbose +``` + +```sh [pnpm] +pnpm commitlint --from HEAD~1 --to HEAD --verbose +``` + +```sh [bun] +bun commitlint --from HEAD~1 --to HEAD --verbose +``` + +```sh [deno] +deno task --eval commitlint --from HEAD~1 --to HEAD --verbose +``` + +::: + This will check your last commit and return an error if invalid or a positive output if valid. ### Test the hook @@ -152,4 +200,4 @@ No staged files match any of provided globs. # husky > commit-msg ``` -?> Local linting is fine for fast feedback but can easily be tinkered with. To ensure all commits are linted you'll want to check commits on an automated CI Server too. Learn how to in the [CI Setup guide](/guides/ci-setup). +Local linting is fine for fast feedback but can easily be tinkered with. To ensure all commits are linted you'll want to check commits on an automated CI Server too. Learn how to in the [CI Setup guide](/guides/ci-setup). diff --git a/docs/guides/use-prompt.md b/docs/guides/use-prompt.md index cd1bdda4d5..fcb86568db 100644 --- a/docs/guides/use-prompt.md +++ b/docs/guides/use-prompt.md @@ -12,18 +12,62 @@ 2. Create a package.json if needed - ```sh + ::: code-group + + ```sh [npm] npm init ``` + ```sh [yarn] + yarn init + ``` + + ```sh [pnpm] + pnpm init + ``` + + ```sh [bun] + bun init + ``` + + ::: + 3. Install and configure if needed - ```sh - npm install --save-dev @commitlint/{cli,config-conventional,prompt-cli} + ::: code-group + + ```sh [npm] + npm install --save-dev @commitlint/cli @commitlint/config-conventional @commitlint/prompt-cli + + echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js + ``` + + ```sh [yarn] + yarn add --dev @commitlint/cli @commitlint/config-conventional @commitlint/prompt-cli + + echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js + ``` + + ```sh [pnpm] + pnpm add --save-dev @commitlint/cli @commitlint/config-conventional @commitlint/prompt-cli + + echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js + ``` + + ```sh [bun] + bun add --dev @commitlint/cli @commitlint/config-conventional @commitlint/prompt-cli + + echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js + ``` + + ```sh [deno] + deno add --dev npm:@commitlint/cli npm:@commitlint/config-conventional npm:@commitlint/prompt-cli echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js ``` + ::: + ## Provide a shortcut To make prompt-cli easy to use, add a npm run-script to your `package.json` @@ -38,11 +82,35 @@ To make prompt-cli easy to use, add a npm run-script to your `package.json` Test the prompt by executing -```bash +::: code-group + +```sh [npm] git add . npm run commit ``` +```sh [yarn] +git add . +yarn commit +``` + +```sh [pnpm] +git add . +pnpm commit +``` + +```sh [bun] +git add . +bun commit +``` + +```sh [deno] +git add . +deno task commit +``` + +::: + ## An alternative to `@commitlint/prompt-cli`: commitizen Another way to author commit messages that adhere to the commit convention configured in `commitlint.config.js` is to use `commitizen`. diff --git a/docs/public/assets/cz-commitlint.png b/docs/public/assets/cz-commitlint.png index 35098c26f1..3c808656d7 100644 Binary files a/docs/public/assets/cz-commitlint.png and b/docs/public/assets/cz-commitlint.png differ diff --git a/docs/public/assets/vs-code-commit-msg.png b/docs/public/assets/vs-code-commit-msg.png new file mode 100644 index 0000000000..2c93243238 Binary files /dev/null and b/docs/public/assets/vs-code-commit-msg.png differ diff --git a/docs/public/assets/vs-code-emoji.png b/docs/public/assets/vs-code-emoji.png new file mode 100644 index 0000000000..fbea05cd9a Binary files /dev/null and b/docs/public/assets/vs-code-emoji.png differ diff --git a/docs/reference/cli.md b/docs/reference/cli.md index 1071966500..efc0656a62 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -1,9 +1,14 @@ +<script setup> + import packageJson from "../../@commitlint/cli/package.json" + const commitlintVersion = packageJson.version +</script> + # CLI -```sh +```sh-vue ❯ npx commitlint --help -@commitlint/cli@19.5.0 - Lint your commit messages +@commitlint/cli@{{ commitlintVersion }} - Lint your commit messages [input] reads from stdin if --edit, --env, --from and --to are omitted diff --git a/docs/reference/configuration.md b/docs/reference/configuration.md index f4364fedcd..b9a332202c 100644 --- a/docs/reference/configuration.md +++ b/docs/reference/configuration.md @@ -21,11 +21,11 @@ The file is expected -- to contain valid JavaScript / Typescript +- to contain valid JavaScript / TypeScript - export a configuration object - adhere to the schema outlined below -Configuration files are resolved using [cosmiconfig](https://github.com/cosmiconfig/cosmiconfig/tree/v8.2.0). +Configuration files are resolved using [cosmiconfig](https://github.com/cosmiconfig/cosmiconfig). ## Config via `package.json` @@ -43,22 +43,22 @@ const Configuration = { * Resolve and load @commitlint/config-conventional from node_modules. * Referenced packages must be installed */ - extends: ['@commitlint/config-conventional'], + extends: ["@commitlint/config-conventional"], /* * Resolve and load conventional-changelog-atom from node_modules. * Referenced packages must be installed */ - parserPreset: 'conventional-changelog-atom', + parserPreset: "conventional-changelog-atom", /* * Resolve and load @commitlint/format from node_modules. * Referenced package must be installed */ - formatter: '@commitlint/format', + formatter: "@commitlint/format", /* * Any rules defined here will override rules from @commitlint/config-conventional */ rules: { - 'type-enum': [2, 'always', ['foo']], + "type-enum": [2, "always", ["foo"]], }, /* * Array of functions that return true if commitlint should ignore the given message. @@ -72,7 +72,7 @@ const Configuration = { * To see full list, check https://github.com/conventional-changelog/commitlint/blob/master/%40commitlint/is-ignored/src/defaults.ts. * To disable those ignores and run rules always, set `defaultIgnores: false` as shown below. */ - ignores: [(commit) => commit === ''], + ignores: [(commit) => commit === ""], /* * Whether commitlint uses the default ignore rules, see the description above. */ @@ -81,7 +81,7 @@ const Configuration = { * Custom URL to show upon failure */ helpUrl: - 'https://github.com/conventional-changelog/commitlint/#what-is-commitlint', + "https://github.com/conventional-changelog/commitlint/#what-is-commitlint", /* * Custom prompt configs */ @@ -89,7 +89,7 @@ const Configuration = { messages: {}, questions: { type: { - description: 'please input type:', + description: "please input type:", }, }, }, @@ -105,25 +105,25 @@ export default Configuration; > module.exports = Configuration; > ``` -### Typescript configuration +### TypeScript configuration -Configuration can also be a typescript file. +Configuration can also be a TypeScript file. Relevant types and enums can be imported from `@commitlint/types`. Below you can see main changes from a standard js file: ```ts -import type {UserConfig} from '@commitlint/types'; // [!code focus] -import {RuleConfigSeverity} from '@commitlint/types'; // [!code focus] +import type { UserConfig } from "@commitlint/types"; // [!code focus] +import { RuleConfigSeverity } from "@commitlint/types"; // [!code focus] const Configuration: UserConfig = { // [!code focus] - extends: ['@commitlint/config-conventional'], - parserPreset: 'conventional-changelog-atom', - formatter: '@commitlint/format', + extends: ["@commitlint/config-conventional"], + parserPreset: "conventional-changelog-atom", + formatter: "@commitlint/format", rules: { - 'type-enum': [RuleConfigSeverity.Error, 'always', ['foo']], // [!code focus] + "type-enum": [RuleConfigSeverity.Error, "always", ["foo"]], // [!code focus] }, // ... }; @@ -163,7 +163,7 @@ export default { ```js [commitlint.config.js] export default { - extends: ['./commitlint.base.js', './commitlint.types.js'], + extends: ["./commitlint.base.js", "./commitlint.types.js"], }; ``` @@ -171,7 +171,7 @@ export default { // will be picked up by commitlint.config.js export default { rules: { - 'type-enum': [2, 'always', ['foo']], + "type-enum": [2, "always", ["foo"]], }, }; ``` @@ -179,8 +179,8 @@ export default { ```js [commitlint.base.js] // will be picked up by commitlint.config.js export default { - extends: ['@commitlint/config-conventional'], // extends can be nested - parserPreset: 'conventional-changelog-atom', + extends: ["@commitlint/config-conventional"], // extends can be nested + parserPreset: "conventional-changelog-atom", }; ``` @@ -206,7 +206,7 @@ npm install --save-dev conventional-changelog-atom ```js [commitlint.config.js] export default { - parserPreset: 'conventional-changelog-atom', + parserPreset: "conventional-changelog-atom", }; ``` @@ -216,7 +216,7 @@ export default { ```js [commitlint.config.js] export default { - parserPreset: './parser-preset', + parserPreset: "./parser-preset", }; ``` @@ -224,7 +224,7 @@ export default { export default { parserOpts: { headerPattern: /^(\w*)\((\w*)\)-(\w*)\s(.*)$/, - headerCorrespondence: ['type', 'scope', 'ticket', 'subject'], + headerCorrespondence: ["type", "scope", "ticket", "subject"], }, }; ``` @@ -238,7 +238,7 @@ Use ids resolvable by the node resolve algorithm. ```js export default { - formatter: '@commitlint/format', + formatter: "@commitlint/format", }; ``` diff --git a/docs/reference/examples.md b/docs/reference/examples.md index 3832adbb1f..4d80227b88 100644 --- a/docs/reference/examples.md +++ b/docs/reference/examples.md @@ -7,16 +7,147 @@ These examples show common usages of how commitlint can be configured. ::: code-group ```jsonc [package.json] +{ // ... - commitlint: { + "commitlint": { "rules": { - "references-empty": [2, "never"] + "references-empty": [2, "never"], }, "parserPreset": { "parserOpts": { - "issuePrefixes": ["PROJ-"] - } - } - } + "issuePrefixes": ["PROJ-"], + }, + }, + }, // ... +} +``` + +::: + +## Customizing Emojis and Alignment in VS Code + +Some terminals have trouble correctly calculating the width of Unicode emojis, which can cause a missing space after the emoji, leading to misaligned text in the commit prompt. + +![cz-commitlint questions](/assets/vs-code-emoji.png) + +To fix this issue in VS Code, you can specify an additional space after each emoji in your `commitlint.config.ts` file. + +::: code-group + +```ts [commitlint.config.ts] +import { type UserConfig } from "@commitlint/types"; + +export default { + // Use the conventional commit rules as a base. + extends: ["@commitlint/config-conventional"], + prompt: { + questions: { + type: { + enum: { + // Add a space to a few common types for better alignment. + build: { + emoji: "🛠️ ", // The extra space fixes the alignment. + }, + chore: { + emoji: "♻️ ", + }, + ci: { + emoji: "⚙️ ", + }, + revert: { + emoji: "🗑️ ", + }, + }, + }, + }, + }, +} satisfies UserConfig; +``` + +::: + +## Include Emojis in Commit Messages + +By default, emojis are only shown in the commit message prompt. To include them in the actual commit header, you need a custom parser and a setting to enable them. + +This configuration is based on the conventional commit rules and uses a _parser preset_ to validate commit headers that start with an emoji. + +::: code-group + +```ts [commitlint.config.ts] +import type { ParserPreset, UserConfig } from "@commitlint/types"; +import config from "@commitlint/config-conventional"; +import createPreset from "conventional-changelog-conventionalcommits"; +import { merge } from "lodash-es"; + +// A helper function to create the custom emoji parser preset. +async function createEmojiParser(): Promise<ParserPreset> { + // Generates the regex from the emojis defined in the conventional config. + const emojiRegexPart = Object.values(config.prompt.questions.type.enum) + .map((value) => value.emoji.trim()) + .join("|"); + + const parserOpts = { + // This regular expression validates commit headers with an emoji. + breakingHeaderPattern: new RegExp( + `^(?:${emojiRegexPart})\\s+(\\w*)(?:\\((.*)\\))?!:\\s+(.*)$`, + ), + headerPattern: new RegExp( + `^(?:${emojiRegexPart})\\s+(\\w*)(?:\\((.*)\\))?!?:\\s+(.*)$`, + ), + }; + + const emojiParser = merge({}, await createPreset(), { + conventionalChangelog: { parserOpts }, + parserOpts, + recommendedBumpOpts: { parserOpts }, + }); + + return emojiParser; +} + +const emojiParser = await createEmojiParser(); + +export default { + extends: ["@commitlint/config-conventional"], + parserPreset: emojiParser, + prompt: { + questions: { + type: { + enum: { + // Customize emojis and add the extra space for better alignment. + build: { emoji: "🛠️ " }, + chore: { emoji: "♻️ " }, + ci: { emoji: "⚙️ " }, + revert: { emoji: "🗑️ " }, + }, + // This setting includes the emoji in the final commit header. + headerWithEmoji: true, + }, + }, + }, +} satisfies UserConfig; ``` + +::: + +Although some emojis may appear without a trailing space in the terminal, the commit message itself is submitted with the correct formatting. + +![cz-commitlint questions](/assets/vs-code-commit-msg.png) + +You can verify this with `git log -4 --format=%B > commits.txt`. + +:::code-group + +```text [commits.txt] +⚙️ ci(scope): short + +🛠 build(scope): short + +🐛 fix(scope): short + +✨ feat(scope): short +``` + +::: diff --git a/docs/reference/plugins.md b/docs/reference/plugins.md index 2233107143..251eeb65c3 100644 --- a/docs/reference/plugins.md +++ b/docs/reference/plugins.md @@ -10,7 +10,7 @@ Plugins can expose additional rules for use in commitlint. To do so, the plugin ```js export default { rules: { - 'dollar-sign': function (parsed, when, value) { + "dollar-sign": function (parsed, when, value) { // rule implementation ... }, }, @@ -54,13 +54,13 @@ In case you want to develop your plugins locally without the need to publish to ```js [commitlint.config.js] export default { rules: { - 'hello-world-rule': [2, 'always'], + "hello-world-rule": [2, "always"], }, plugins: [ { rules: { - 'hello-world-rule': ({subject}) => { - const HELLO_WORLD = 'Hello World'; + "hello-world-rule": ({ subject }) => { + const HELLO_WORLD = "Hello World"; return [ subject.includes(HELLO_WORLD), `Your subject should contain ${HELLO_WORLD} message`, diff --git a/docs/reference/rules-configuration.md b/docs/reference/rules-configuration.md index f991de5f5e..09494a12b9 100644 --- a/docs/reference/rules-configuration.md +++ b/docs/reference/rules-configuration.md @@ -16,7 +16,7 @@ Rule configurations are either of type `array` residing on a key with the rule's export default { // ... rules: { - 'header-max-length': [0, 'always', 72], // [!code focus] + "header-max-length": [0, "always", 72], // [!code focus] }, // ... }; @@ -32,7 +32,7 @@ export default { export default { // ... rules: { - 'header-max-length': () => [0, 'always', 72], // [!code focus] + "header-max-length": () => [0, "always", 72], // [!code focus] }, // ... }; @@ -48,7 +48,7 @@ export default { export default { // ... rules: { - 'header-max-length': async () => [0, 'always', 72], // [!code focus] + "header-max-length": async () => [0, "always", 72], // [!code focus] }, // ... }; diff --git a/docs/reference/rules.md b/docs/reference/rules.md index 18ad59a7b3..7c76fafcd7 100644 --- a/docs/reference/rules.md +++ b/docs/reference/rules.md @@ -1,5 +1,35 @@ # Rules +## body-case + +- **condition**: `body` is in case `value` +- **rule**: `always` +- **value** + + ```text + 'lower-case' + ``` + +- **possible values** + + ```js + [ + "lower-case", // default + "upper-case", // UPPERCASE + "camel-case", // camelCase + "kebab-case", // kebab-case + "pascal-case", // PascalCase + "sentence-case", // Sentence case + "snake-case", // snake_case + "start-case", // Start Case + ]; + ``` + +## body-empty + +- **condition**: `body` is empty +- **rule**: `never` + ## body-full-stop - **condition**: `body` ends with `value` @@ -15,11 +45,6 @@ - **condition**: `body` begins with blank line - **rule**: `always` -## body-empty - -- **condition**: `body` is empty -- **rule**: `never` - ## body-max-length - **condition**: `body` has `value` or less characters @@ -32,7 +57,7 @@ ## body-max-line-length -- **condition**: `body` lines has `value` or less characters +- **condition**: `body` lines have `value` or less characters, or contain a URL - **rule**: `always` - **value** @@ -50,41 +75,30 @@ 0 ``` -## body-case +## breaking-change-exclamation-mark -- **condition**: `body` is in case `value` +- **condition**: Either both or neither `header` has an exclamation mark before the `:` marker + and a line in `footer` matches the regular expression `^BREAKING[ -]CHANGE:` - **rule**: `always` -- **value** - ```text - 'lower-case' - ``` +> [!NOTE] +> +> This rule enforces that breaking changes are marked by both a `!` in the header +> and `BREAKING CHANGE` in the footer. The behavior is that of an XNOR operation: +> +> - It passes when either both are present or both are not. +> - It fails when one is present and the other is not. -- **possible values** +## footer-empty - ```js - [ - 'lower-case', // default - 'upper-case', // UPPERCASE - 'camel-case', // camelCase - 'kebab-case', // kebab-case - 'pascal-case', // PascalCase - 'sentence-case', // Sentence case - 'snake-case', // snake_case - 'start-case', // Start Case - ]; - ``` +- **condition**: `footer` is empty +- **rule**: `never` ## footer-leading-blank - **condition**: `footer` begins with blank line - **rule**: `always` -## footer-empty - -- **condition**: `footer` is empty -- **rule**: `never` - ## footer-max-length - **condition**: `footer` has `value` or less characters @@ -97,7 +111,7 @@ ## footer-max-line-length -- **condition**: `footer` lines has `value` or less characters +- **condition**: `footer` lines have `value` or less characters - **rule**: `always` - **value** @@ -129,14 +143,14 @@ ```js [ - 'lower-case', // default - 'upper-case', // UPPERCASE - 'camel-case', // camelCase - 'kebab-case', // kebab-case - 'pascal-case', // PascalCase - 'sentence-case', // Sentence case - 'snake-case', // snake_case - 'start-case', // Start Case + "lower-case", // default + "upper-case", // UPPERCASE + "camel-case", // camelCase + "kebab-case", // kebab-case + "pascal-case", // PascalCase + "sentence-case", // Sentence case + "snake-case", // snake_case + "start-case", // Start Case ]; ``` @@ -172,7 +186,7 @@ ## header-trim -- **condition**: `header` must not have initial and / or trailing whitespaces +- **condition**: `header` must not have initial or trailing whitespaces - **rule**: `always` ## references-empty @@ -180,6 +194,36 @@ - **condition**: `references` has at least one entry - **rule**: `never` +## scope-case + +- **condition**: `scope` is in case `value` +- **rule**: `always` +- **value** + + ```text + 'lower-case' + ``` + +- **possible values** + + ```js + [ + "lower-case", // default + "upper-case", // UPPERCASE + "camel-case", // camelCase + "kebab-case", // kebab-case + "pascal-case", // PascalCase + "sentence-case", // Sentence case + "snake-case", // snake_case + "start-case", // Start Case + ]; + ``` + +## scope-empty + +- **condition**: `scope` is empty +- **rule**: `never` + ## scope-enum - **condition**: `scope` is found in value @@ -196,55 +240,35 @@ > - When set to `always`, all message scopes must be found in the value. > - When set to `never`, none of the message scopes can be found in the value. -## scope-case +## scope-max-length -- **condition**: `scope` is in case `value` +- **condition**: `scope` has `value` or less characters - **rule**: `always` - **value** ```text - 'lower-case' + Infinity ``` -- **possible values** - -```js -[ - 'lower-case', // default - 'upper-case', // UPPERCASE - 'camel-case', // camelCase - 'kebab-case', // kebab-case - 'pascal-case', // PascalCase - 'sentence-case', // Sentence case - 'snake-case', // snake_case - 'start-case', // Start Case -]; -``` - -## scope-empty - -- **condition**: `scope` is empty -- **rule**: `never` - -## scope-max-length +## scope-min-length -- **condition**: `scope` has `value` or less characters +- **condition**: `scope` has `value` or more characters - **rule**: `always` - **value** -```text -Infinity -``` + ```text + 0 + ``` -## scope-min-length +## signed-off-by -- **condition**: `scope` has `value` or more characters +- **condition**: `message` has `value` - **rule**: `always` - **value** -```text -0 -``` + ```text + 'Signed-off-by:' + ``` ## subject-case @@ -252,39 +276,44 @@ Infinity - **rule**: `always` - **value** -```js -['sentence-case', 'start-case', 'pascal-case', 'upper-case']; -``` + ```js + ["sentence-case", "start-case", "pascal-case", "upper-case"]; + ``` - **possible values** -```js -[ - 'lower-case', // lower case - 'upper-case', // UPPERCASE - 'camel-case', // camelCase - 'kebab-case', // kebab-case - 'pascal-case', // PascalCase - 'sentence-case', // Sentence case - 'snake-case', // snake_case - 'start-case', // Start Case -]; -``` + ```js + [ + "lower-case", // lower case + "upper-case", // UPPERCASE + "camel-case", // camelCase + "kebab-case", // kebab-case + "pascal-case", // PascalCase + "sentence-case", // Sentence case + "snake-case", // snake_case + "start-case", // Start Case + ]; + ``` ## subject-empty - **condition**: `subject` is empty - **rule**: `never` +## subject-exclamation-mark + +- **condition**: `subject` has exclamation before the `:` marker +- **rule**: `never` + ## subject-full-stop - **condition**: `subject` ends with `value` - **rule**: `never` - **value** -```text -'.' -``` + ```text + '.' + ``` ## subject-max-length @@ -292,9 +321,9 @@ Infinity - **rule**: `always` - **value** -```text -Infinity -``` + ```text + Infinity + ``` ## subject-min-length @@ -302,35 +331,18 @@ Infinity - **rule**: `always` - **value** -```text -0 -``` - -## subject-exclamation-mark - -- **condition**: `subject` has exclamation before the `:` marker -- **rule**: `never` + ```text + 0 + ``` -## type-enum +## trailer-exists -- **condition**: `type` is found in value +- **condition**: `message` has trailer `value` - **rule**: `always` - **value** - ```js - [ - 'build', - 'chore', - 'ci', - 'docs', - 'feat', - 'fix', - 'perf', - 'refactor', - 'revert', - 'style', - 'test', - ]; + ```text + 'Signed-off-by:' ``` ## type-case @@ -347,14 +359,14 @@ Infinity ```js [ - 'lower-case', // default - 'upper-case', // UPPERCASE - 'camel-case', // camelCase - 'kebab-case', // kebab-case - 'pascal-case', // PascalCase - 'sentence-case', // Sentence case - 'snake-case', // snake_case - 'start-case', // Start Case + "lower-case", // default + "upper-case", // UPPERCASE + "camel-case", // camelCase + "kebab-case", // kebab-case + "pascal-case", // PascalCase + "sentence-case", // Sentence case + "snake-case", // snake_case + "start-case", // Start Case ]; ``` @@ -363,42 +375,44 @@ Infinity - **condition**: `type` is empty - **rule**: `never` -## type-max-length - -- **condition**: `type` has `value` or less characters -- **rule**: `always` -- **value** - - ```text - Infinity - ``` - -## type-min-length +## type-enum -- **condition**: `type` has `value` or more characters +- **condition**: `type` is found in value - **rule**: `always` - **value** - ```text - 0 + ```js + [ + "build", + "chore", + "ci", + "docs", + "feat", + "fix", + "perf", + "refactor", + "revert", + "style", + "test", + ]; ``` -## signed-off-by +## type-max-length -- **condition**: `message` has `value` +- **condition**: `type` has `value` or less characters - **rule**: `always` - **value** ```text - 'Signed-off-by:' + Infinity ``` -## trailer-exists +## type-min-length -- **condition**: `message` has trailer `value` +- **condition**: `type` has `value` or more characters - **rule**: `always` - **value** ```text - 'Signed-off-by:' + 0 ``` diff --git a/docs/support/upgrade.md b/docs/support/upgrade.md index ad455b5b79..ec54313e83 100644 --- a/docs/support/upgrade.md +++ b/docs/support/upgrade.md @@ -62,10 +62,10 @@ npm install --save-dev husky ```js module.exports = { - extends: ['@commitlint/config-conventional'], + extends: ["@commitlint/config-conventional"], rules: { // Place your rules here - 'scope-enum': [2, 'always', ['a', 'b']], // error if scope is given but not in provided list + "scope-enum": [2, "always", ["a", "b"]], // error if scope is given but not in provided list }, }; ``` diff --git a/eslint.config.mjs b/eslint.config.mjs index 033e7d042a..679b906c09 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,13 +1,13 @@ import typescriptEslint from '@typescript-eslint/eslint-plugin'; -import jest from 'eslint-plugin-jest'; -import _import from 'eslint-plugin-import'; -import {fixupPluginRules} from '@eslint/compat'; +import { createTypeScriptImportResolver } from 'eslint-import-resolver-typescript'; +import vitest from '@vitest/eslint-plugin'; +import { importX } from 'eslint-plugin-import-x'; import globals from 'globals'; import tsParser from '@typescript-eslint/parser'; import path from 'node:path'; -import {fileURLToPath} from 'node:url'; +import { fileURLToPath } from 'node:url'; import js from '@eslint/js'; -import {FlatCompat} from '@eslint/eslintrc'; +import { FlatCompat } from '@eslint/eslintrc'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -19,21 +19,22 @@ const compat = new FlatCompat({ export default [ { - ignores: ['**/lib/', '**/coverage/', '**/node_modules/', '**/fixtures/'], + ignores: ['**/lib/', '**/coverage/', '**/node_modules/', '**/fixtures/', '**/dist/'], }, + importX.flatConfigs.typescript, ...compat.extends('eslint:recommended', 'prettier'), { plugins: { '@typescript-eslint': typescriptEslint, - jest, - import: fixupPluginRules(_import), }, - + settings: { + 'import-x/resolver-next': createTypeScriptImportResolver(), + }, languageOptions: { globals: { ...globals.node, + ...vitest.environments.env.globals }, - ecmaVersion: 11, sourceType: 'module', @@ -43,16 +44,14 @@ export default [ }, }, }, - rules: { - 'import/first': 'error', - 'import/no-absolute-path': 'error', - 'import/no-amd': 'error', - 'import/no-mutable-exports': 'error', - 'import/no-named-default': 'error', - 'import/no-self-import': 'error', - - 'import/no-extraneous-dependencies': [ + 'import-x/first': 'error', + 'import-x/no-absolute-path': 'error', + 'import-x/no-amd': 'error', + 'import-x/no-mutable-exports': 'error', + 'import-x/no-named-default': 'error', + 'import-x/no-self-import': 'error', + 'import-x/no-extraneous-dependencies': [ 'error', { devDependencies: true, @@ -72,11 +71,9 @@ export default [ })), { files: ['**/*.cts', '**/*.ts'], - languageOptions: { parser: tsParser, }, - rules: { '@typescript-eslint/no-unused-vars': 'off', '@typescript-eslint/no-use-before-define': 'off', @@ -90,19 +87,18 @@ export default [ 'no-var': 'off', }, }, - ...compat.extends('plugin:jest/recommended').map((config) => ({ - ...config, - files: ['**/*.test.ts', '**/*.test.js'], - })), { files: ['**/*.test.ts', '**/*.test.js'], - + plugins: { + vitest, + }, rules: { + ...vitest.configs.recommended.rules, + 'vitest/max-nested-describe': ['error', { max: 3 }], '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-var-requires': 'off', - 'import/first': 'off', - 'import/no-extraneous-dependencies': 'off', - 'jest/no-deprecated-functions': 'off', + 'import-x/first': 'off', + 'import-x/no-extraneous-dependencies': 'off', }, }, ]; diff --git a/lerna.json b/lerna.json index 76c6e3daef..b007de9a8f 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,4 @@ { - "lerna": "4", "npmClient": "yarn", - "useWorkspaces": true, - "version": "19.6.1" + "version": "20.1.0" } diff --git a/package.json b/package.json index a29c5b2a4e..52b962b4e0 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "lint": "eslint", "lint-fix": "eslint --fix", "format": "prettier **/*.{ts,js,json,yml,md} --check", - "format-fix": "prettier **/*.{ts,js,json,yml,md} --write", + "format-fix": "prettier \"**/*.{ts,js,json,yml,md}\" --write", "publish": "lerna publish --conventional-commits", "reinstall": "yarn clean && yarn install", "start": "yarn watch", @@ -28,13 +28,9 @@ "commitlint": { "extends": [ "@commitlint/config-conventional", - "@commitlint/config-lerna-scopes" + "@commitlint/config-workspace-scopes" ] }, - "prettier": { - "singleQuote": true, - "bracketSpacing": false - }, "lint-staged": { "*.{ts,js,json,yml,md}": [ "prettier --write" @@ -62,7 +58,8 @@ "@packages/*" ], "engines": { - "node": ">=v18" + "node": ">=v18", + "npm": ">=7" }, "repository": { "type": "git", @@ -85,28 +82,27 @@ "email": "hello@herebecode.com" }, "devDependencies": { - "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.16.0", - "@lerna/project": "^6.0.0", "@swc/core": "^1.10.1", "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", - "@vitest/coverage-istanbul": "^2.1.8", + "@vitest/coverage-istanbul": "^3.0.0", + "@vitest/eslint-plugin": "^1.3.4", "cross-env": "^7.0.3", "eslint": "^9.16.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.30.0", - "eslint-plugin-jest": "^28.8.2", - "globals": "^15.13.0", + "eslint-config-prettier": "^10.0.0", + "eslint-import-resolver-typescript": "^4.4.3", + "eslint-plugin-import-x": "^4.15.2", + "globals": "^16.0.0", "husky": "^9.1.5", - "lerna": "^6.0.0", - "lint-staged": "15.2.11", - "prettier": "^2.8.8", + "lerna": "^8.2.0", + "lint-staged": "16.1.2", + "prettier": "^3.5.3", "typescript": "^5.2.2", "vitepress": "^1.3.4", - "vitepress-plugin-tabs": "^0.5.0", - "vitest": "^2.1.8", + "vitepress-plugin-tabs": "^0.7.0", + "vitest": "^3.0.0", "vue": "^3.5.0" } } diff --git a/tsconfig.json b/tsconfig.json index b8dc904d8d..305b3ae79a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,27 +7,28 @@ "noEmit": true }, "references": [ - {"path": "@packages/test-environment"}, - {"path": "@packages/test"}, - {"path": "@commitlint/config-validator"}, - {"path": "@commitlint/ensure"}, - {"path": "@commitlint/execute-rule"}, - {"path": "@commitlint/format"}, - {"path": "@commitlint/is-ignored"}, - {"path": "@commitlint/load"}, - {"path": "@commitlint/message"}, - {"path": "@commitlint/parse"}, - {"path": "@commitlint/resolve-extends"}, - {"path": "@commitlint/to-lines"}, - {"path": "@commitlint/top-level"}, - {"path": "@commitlint/read"}, - {"path": "@commitlint/rules"}, - {"path": "@commitlint/lint"}, - {"path": "@commitlint/core"}, - {"path": "@commitlint/cli"}, - {"path": "@commitlint/travis-cli"}, - {"path": "@commitlint/prompt"}, - {"path": "@commitlint/cz-commitlint"}, - {"path": "@commitlint/config-conventional"} + { "path": "@packages/test-environment" }, + { "path": "@packages/test" }, + { "path": "@commitlint/config-validator" }, + { "path": "@commitlint/ensure" }, + { "path": "@commitlint/execute-rule" }, + { "path": "@commitlint/format" }, + { "path": "@commitlint/is-ignored" }, + { "path": "@commitlint/load" }, + { "path": "@commitlint/message" }, + { "path": "@commitlint/parse" }, + { "path": "@commitlint/resolve-extends" }, + { "path": "@commitlint/to-lines" }, + { "path": "@commitlint/top-level" }, + { "path": "@commitlint/read" }, + { "path": "@commitlint/rules" }, + { "path": "@commitlint/lint" }, + { "path": "@commitlint/core" }, + { "path": "@commitlint/cli" }, + { "path": "@commitlint/travis-cli" }, + { "path": "@commitlint/prompt" }, + { "path": "@commitlint/cz-commitlint" }, + { "path": "@commitlint/config-conventional" }, + { "path": "@commitlint/config-pnpm-scopes" } ] } diff --git a/vitest.config.ts b/vitest.config.ts index c1b94cdba0..cd76172eba 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,12 +1,12 @@ -import {defineConfig} from 'vitest/config'; +import { defineConfig } from "vitest/config"; export default defineConfig({ test: { - exclude: ['**/node_modules/**', '**/lib/*.test.js'], - environment: 'commitlint', + exclude: ["**/node_modules/**", "**/lib/*.test.js"], + environment: "commitlint", coverage: { - provider: 'istanbul', - include: ['**/@commitlint/*/src/**'], + provider: "istanbul", + include: ["**/@commitlint/*/src/**"], }, }, }); diff --git a/yarn.lock b/yarn.lock index d90d05bed0..ee8f87e867 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,121 +29,121 @@ resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz#105e84ad9d1a31d3fb86ba20dc890eefe1a313a0" integrity sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg== -"@algolia/client-abtesting@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.14.2.tgz#bc1ceded86279e53b1f5f34c35d043974e76affe" - integrity sha512-7fq1tWIy1aNJEaNHxWy3EwDkuo4k22+NBnxq9QlYVSLLXtr6HqmAm6bQgNNzGT3vm21iKqWO9efk+HIhEM1SzQ== - dependencies: - "@algolia/client-common" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" - -"@algolia/client-analytics@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.14.2.tgz#6265c6c9904ccfeac7267de8237abe2ec1ee9fbf" - integrity sha512-5Nm5cOOyAGcY+hKNJVmR2jgoGn1nvoANS8W5EfB8yAaUqUxL3lFNUHSkFafAMTCOcVKNDkZQYjUDbOOfdYJLqw== - dependencies: - "@algolia/client-common" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" - -"@algolia/client-common@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.14.2.tgz#659e5a78b3563b628a982f3d3054c424d8a3d2c9" - integrity sha512-BW1Qzhh9tMKEsWSQQsiOEcHAd6g7zxq9RpPVmyxbDO/O4eA4vyN+Qz5Jzo686kuYdIQKqIPCEtob/JM89tk57g== - -"@algolia/client-insights@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.14.2.tgz#6a3b231ac18b1e105a5af50b2fd1c59e92859c64" - integrity sha512-17zg6pqifKORvvrMIqW6HhwUry9RKRXLgADrgFjZ6PZvGB4oVs12dwRG2/HMrIlpxd9cjeQfdlEgHj6lbAf6QA== - dependencies: - "@algolia/client-common" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" - -"@algolia/client-personalization@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.14.2.tgz#810eb67875ab1f776ffb73d0165f7f33011d1ce8" - integrity sha512-5IYt8vbmTA52xyuaZKFwiRoDPeh7hiOC9aBZqqp9fVs6BU01djI/T8pGJXawvwczltCPYzNsdbllV3rqiDbxmQ== - dependencies: - "@algolia/client-common" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" - -"@algolia/client-query-suggestions@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.14.2.tgz#669bdd977f74e0c28e81388d2d4a2209f5d93c72" - integrity sha512-gvCX/cczU76Bu1sGcxxTdoIwxe+FnuC1IlW9SF/gzxd3ZzsgzBpzD2puIJqt9fHQsjLxVGkJqKev2FtExnJYZg== - dependencies: - "@algolia/client-common" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" - -"@algolia/client-search@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.14.2.tgz#7e7b7eaa66cea90ba645cb8739e2739d38ec733a" - integrity sha512-0imdBZDjqxrshw0+eyJUgnkRAbS2W93UQ3BVj8VjN4xQylIMf0fWs72W7MZFdHlH78JJYydevgzqvGMcV0Z1CA== - dependencies: - "@algolia/client-common" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" - -"@algolia/ingestion@1.14.2": - version "1.14.2" - resolved "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.14.2.tgz#aea1f01c704ef02a8af53973c093bdbd9ebc1959" - integrity sha512-/p4rBNkW0fgCpCwrwre+jHfzlFQsLemgaAQqyui8NPxw95Wgf3p+DKxYzcmh8dygT7ub7FwztTW+uURLX1uqIQ== - dependencies: - "@algolia/client-common" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" - -"@algolia/monitoring@1.14.2": - version "1.14.2" - resolved "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.14.2.tgz#a8fb4dc135ba2ba6885a512257445e81a607d4c8" - integrity sha512-81R57Y/mS0uNhWpu6cNEfkbkADLW4bP0BNjuPpxAypobv7WzYycUnbMvv1YkN6OsociB4+3M7HfsVzj4Nc09vA== - dependencies: - "@algolia/client-common" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" - -"@algolia/recommend@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.14.2.tgz#e667cc48d30e153c263ff99f6a525e3e7f5cff5f" - integrity sha512-OwELnAZxCUyfjYjqsrFmC7Vfa12kqwbDdLUV0oi4j+4pxDsfPgkiZ6iCH2uPw6X8VK88Hl3InPt+RPaZvcrCWg== - dependencies: - "@algolia/client-common" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" - -"@algolia/requester-browser-xhr@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.14.2.tgz#aa2ba4aaa2d8e83e8a546f4a1363339f932c827d" - integrity sha512-irUvkK+TGBhyivtNCIIbVgNUgbUoHOSk8m/kFX4ddto/PUPmLFRRNNnMHtJ1+OzrJ/uD3Am4FUK2Yt+xgQr05w== - dependencies: - "@algolia/client-common" "5.14.2" - -"@algolia/requester-fetch@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.14.2.tgz#d0bcfce9f48efc0bedd40e5579832edbdee5d00a" - integrity sha512-UNBg5mM4MIYdxPuVjyDL22BC6P87g7WuM91Z1Ky0J19aEGvCSF+oR+9autthROFXdRnAa1rACOjuqn95iBbKpw== - dependencies: - "@algolia/client-common" "5.14.2" - -"@algolia/requester-node-http@5.14.2": - version "5.14.2" - resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.14.2.tgz#186631bcb1047c6a352036fb8dcc713c2a2777a7" - integrity sha512-CTFA03YiLcnpP+JoLRqjHt5pqDHuKWJpLsIBY/60Gmw8pjALZ3TwvbAquRX4Vy+yrin178NxMuU+ilZ54f2IrQ== - dependencies: - "@algolia/client-common" "5.14.2" +"@algolia/client-abtesting@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.20.3.tgz#e4120919292c57270546cdf8f7030ac8f035c9a2" + integrity sha512-wPOzHYSsW+H97JkBLmnlOdJSpbb9mIiuNPycUCV5DgzSkJFaI/OFxXfZXAh1gqxK+hf0miKue1C9bltjWljrNA== + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + +"@algolia/client-analytics@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.20.3.tgz#242d448ee34667a52bf1efe5c39b58546d71201f" + integrity sha512-XE3iduH9lA7iTQacDGofBQyIyIgaX8qbTRRdj1bOCmfzc9b98CoiMwhNwdTifmmMewmN0EhVF3hP8KjKWwX7Yw== + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + +"@algolia/client-common@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.3.tgz#7eec522ca18ae446b775092d17d47eecf97c6af9" + integrity sha512-IYRd/A/R3BXeaQVT2805lZEdWo54v39Lqa7ABOxIYnUvX2vvOMW1AyzCuT0U7Q+uPdD4UW48zksUKRixShcWxA== + +"@algolia/client-insights@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.20.3.tgz#1bcd9e3090512d3f32e64c2c0b839c7ebfd40574" + integrity sha512-QGc/bmDUBgzB71rDL6kihI2e1Mx6G6PxYO5Ks84iL3tDcIel1aFuxtRF14P8saGgdIe1B6I6QkpkeIddZ6vWQw== + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + +"@algolia/client-personalization@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.20.3.tgz#ca1fe559112bd9aedefa38ca712d69b0bc2bfddf" + integrity sha512-zuM31VNPDJ1LBIwKbYGz/7+CSm+M8EhlljDamTg8AnDilnCpKjBebWZR5Tftv/FdWSro4tnYGOIz1AURQgZ+tQ== + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + +"@algolia/client-query-suggestions@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.3.tgz#fed613ab3c7e0be1cb5dcca09fdab65de17e2800" + integrity sha512-Nn872PuOI8qzi1bxMMhJ0t2AzVBqN01jbymBQOkypvZHrrjZPso3iTpuuLLo9gi3yc/08vaaWTAwJfPhxPwJUw== + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + +"@algolia/client-search@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.20.3.tgz#d8ce41dea173112d4a971d697f34145a1354befd" + integrity sha512-9+Fm1ahV8/2goSIPIqZnVitV5yHW5E5xTdKy33xnqGd45A9yVv5tTkudWzEXsbfBB47j9Xb3uYPZjAvV5RHbKA== + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + +"@algolia/ingestion@1.20.3": + version "1.20.3" + resolved "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.20.3.tgz#32283c2cde45d47b6731bbaaa170703ddf9c3874" + integrity sha512-5GHNTiZ3saLjTNyr6WkP5hzDg2eFFAYWomvPcm9eHWskjzXt8R0IOiW9kkTS6I6hXBwN5H9Zna5mZDSqqJdg+g== + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + +"@algolia/monitoring@1.20.3": + version "1.20.3" + resolved "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.20.3.tgz#8165d8fbb89134876e9055f3432a3de72dc150bc" + integrity sha512-KUWQbTPoRjP37ivXSQ1+lWMfaifCCMzTnEcEnXwAmherS5Tp7us6BAqQDMGOD4E7xyaS2I8pto6WlOzxH+CxmA== + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + +"@algolia/recommend@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.20.3.tgz#bfe36b49287cdf07ad5369640dd65f4b12117e30" + integrity sha512-oo/gG77xTTTclkrdFem0Kmx5+iSRFiwuRRdxZETDjwzCI7svutdbwBgV/Vy4D4QpYaX4nhY/P43k84uEowCE4Q== + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + +"@algolia/requester-browser-xhr@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.3.tgz#7bc054eb70669e601e0b1ab034d360eb44c900b6" + integrity sha512-BkkW7otbiI/Er1AiEPZs1h7lxbtSO9p09jFhv3/iT8/0Yz0CY79VJ9iq+Wv1+dq/l0OxnMpBy8mozrieGA3mXQ== + dependencies: + "@algolia/client-common" "5.20.3" + +"@algolia/requester-fetch@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.3.tgz#e280a3bd142984a31b172743119f21a3ccef576b" + integrity sha512-eAVlXz7UNzTsA1EDr+p0nlIH7WFxo7k3NMxYe8p38DH8YVWLgm2MgOVFUMNg9HCi6ZNOi/A2w/id2ZZ4sKgUOw== + dependencies: + "@algolia/client-common" "5.20.3" + +"@algolia/requester-node-http@5.20.3": + version "5.20.3" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.3.tgz#cf06a8568efd7f3ad02414e13f2fa94c15edfc37" + integrity sha512-FqR3pQPfHfQyX1wgcdK6iyqu86yP76MZd4Pzj1y/YLMj9rRmRCY0E0AffKr//nrOFEwv6uY8BQY4fd9/6b0ZCg== + dependencies: + "@algolia/client-common" "5.20.3" "@ampproject/remapping@^2.2.0": version "2.3.0" @@ -153,305 +153,449 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": - version "7.23.5" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" - picocolors "^1.0.0" + picocolors "^1.1.1" -"@babel/compat-data@^7.25.9": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" - integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== +"@babel/compat-data@^7.27.2": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz#7d0658ec1a8420fc866d1df1b03bea0e79934c82" + integrity sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg== "@babel/core@^7.23.9": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" - integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + version "7.27.4" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz#cc1fc55d0ce140a1828d1dd2a2eba285adbfb3ce" + integrity sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.0" - "@babel/parser" "^7.26.0" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.4" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.27.4" + "@babel/types" "^7.27.3" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.27.3": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz#3eb01866b345ba261b04911020cbe22dd4be8c8c" + integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.27.5" + "@babel/types" "^7.27.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" - integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== +"@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: - "@babel/compat-data" "^7.25.9" - "@babel/helper-validator-option" "^7.25.9" + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.24.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== - -"@babel/helpers@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" - integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== - dependencies: - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.0" - -"@babel/highlight@^7.23.4": - version "7.24.2" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" - integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.25.4", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== - dependencies: - "@babel/types" "^7.26.0" - -"@babel/template@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.3": + version "7.27.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.27.4": + version "7.27.6" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz#6456fed15b2cb669d2d1fabe84b66b34991d812c" + integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.6" + +"@babel/parser@^7.23.9", "@babel/parser@^7.25.4", "@babel/parser@^7.27.2", "@babel/parser@^7.27.4", "@babel/parser@^7.27.5": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz#ed22f871f110aa285a6fd934a0efed621d118826" + integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg== + dependencies: + "@babel/types" "^7.27.3" + +"@babel/parser@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== + dependencies: + "@babel/types" "^7.28.0" + +"@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.27.4": + version "7.27.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz#b0045ac7023c8472c3d35effd7cc9ebd638da6ea" + integrity sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.3" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.25.4", "@babel/types@^7.25.9", "@babel/types@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@babel/types@^7.25.4", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6": + version "7.27.6" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz#a434ca7add514d4e646c80f7375c0aa2befc5535" + integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@babel/types@^7.28.0": + version "7.28.1" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz#2aaf3c10b31ba03a77ac84f52b3912a0edef4cf9" + integrity sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ== dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" -"@docsearch/css@3.8.0", "@docsearch/css@^3.6.2": - version "3.8.0" - resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.8.0.tgz#c70a1a326249d878ab7c630d7a908c6769a38db3" - integrity sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA== +"@docsearch/css@3.8.2": + version "3.8.2" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz#7973ceb6892c30f154ba254cd05c562257a44977" + integrity sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ== -"@docsearch/js@^3.6.2": - version "3.8.0" - resolved "https://registry.npmjs.org/@docsearch/js/-/js-3.8.0.tgz#978853b44909f0d82782f3af72bb995b68349c00" - integrity sha512-PVuV629f5UcYRtBWqK7ID6vNL5647+2ADJypwTjfeBIrJfwPuHtzLy39hMGMfFK+0xgRyhTR0FZ83EkdEraBlg== +"@docsearch/js@3.8.2": + version "3.8.2" + resolved "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz#bdcfc9837700eb38453b88e211ab5cc5a3813cc6" + integrity sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ== dependencies: - "@docsearch/react" "3.8.0" + "@docsearch/react" "3.8.2" preact "^10.0.0" -"@docsearch/react@3.8.0": - version "3.8.0" - resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.8.0.tgz#c32165e34fadea8a0283c8b61cd73e6e1844797d" - integrity sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q== +"@docsearch/react@3.8.2": + version "3.8.2" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz#7b11d39b61c976c0aa9fbde66e6b73b30f3acd42" + integrity sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg== dependencies: "@algolia/autocomplete-core" "1.17.7" "@algolia/autocomplete-preset-algolia" "1.17.7" - "@docsearch/css" "3.8.0" - algoliasearch "^5.12.0" + "@docsearch/css" "3.8.2" + algoliasearch "^5.14.2" + +"@emnapi/core@^1.1.0", "@emnapi/core@^1.4.3": + version "1.4.3" + resolved "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz#9ac52d2d5aea958f67e52c40a065f51de59b77d6" + integrity sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g== + dependencies: + "@emnapi/wasi-threads" "1.0.2" + tslib "^2.4.0" + +"@emnapi/runtime@^1.1.0", "@emnapi/runtime@^1.4.3": + version "1.4.3" + resolved "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz#c0564665c80dc81c448adac23f9dfbed6c838f7d" + integrity sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz#977f44f844eac7d6c138a415a123818c655f874c" + integrity sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA== + dependencies: + tslib "^2.4.0" "@esbuild/aix-ppc64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== +"@esbuild/aix-ppc64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz#bef96351f16520055c947aba28802eede3c9e9a9" + integrity sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA== + "@esbuild/android-arm64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== +"@esbuild/android-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz#d2e70be7d51a529425422091e0dcb90374c1546c" + integrity sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg== + "@esbuild/android-arm@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== +"@esbuild/android-arm@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz#d2a753fe2a4c73b79437d0ba1480e2d760097419" + integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ== + "@esbuild/android-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== +"@esbuild/android-x64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz#5278836e3c7ae75761626962f902a0d55352e683" + integrity sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw== + "@esbuild/darwin-arm64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== +"@esbuild/darwin-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz#f1513eaf9ec8fa15dcaf4c341b0f005d3e8b47ae" + integrity sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg== + "@esbuild/darwin-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== +"@esbuild/darwin-x64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz#e27dbc3b507b3a1cea3b9280a04b8b6b725f82be" + integrity sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ== + "@esbuild/freebsd-arm64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== +"@esbuild/freebsd-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz#364e3e5b7a1fd45d92be08c6cc5d890ca75908ca" + integrity sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q== + "@esbuild/freebsd-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== +"@esbuild/freebsd-x64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz#7c869b45faeb3df668e19ace07335a0711ec56ab" + integrity sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg== + "@esbuild/linux-arm64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== +"@esbuild/linux-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz#48d42861758c940b61abea43ba9a29b186d6cb8b" + integrity sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw== + "@esbuild/linux-arm@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== +"@esbuild/linux-arm@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz#6ce4b9cabf148274101701d112b89dc67cc52f37" + integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw== + "@esbuild/linux-ia32@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== +"@esbuild/linux-ia32@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz#207e54899b79cac9c26c323fc1caa32e3143f1c4" + integrity sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A== + "@esbuild/linux-loong64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== +"@esbuild/linux-loong64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz#0ba48a127159a8f6abb5827f21198b999ffd1fc0" + integrity sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ== + "@esbuild/linux-mips64el@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== +"@esbuild/linux-mips64el@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz#a4d4cc693d185f66a6afde94f772b38ce5d64eb5" + integrity sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA== + "@esbuild/linux-ppc64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== +"@esbuild/linux-ppc64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz#0f5805c1c6d6435a1dafdc043cb07a19050357db" + integrity sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w== + "@esbuild/linux-riscv64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== +"@esbuild/linux-riscv64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz#6776edece0f8fca79f3386398b5183ff2a827547" + integrity sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg== + "@esbuild/linux-s390x@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== +"@esbuild/linux-s390x@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz#3f6f29ef036938447c2218d309dc875225861830" + integrity sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA== + "@esbuild/linux-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== +"@esbuild/linux-x64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz#831fe0b0e1a80a8b8391224ea2377d5520e1527f" + integrity sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg== + +"@esbuild/netbsd-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz#06f99d7eebe035fbbe43de01c9d7e98d2a0aa548" + integrity sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q== + "@esbuild/netbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== +"@esbuild/netbsd-x64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz#db99858e6bed6e73911f92a88e4edd3a8c429a52" + integrity sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g== + +"@esbuild/openbsd-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz#afb886c867e36f9d86bb21e878e1185f5d5a0935" + integrity sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ== + "@esbuild/openbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== +"@esbuild/openbsd-x64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz#30855c9f8381fac6a0ef5b5f31ac6e7108a66ecf" + integrity sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA== + +"@esbuild/openharmony-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz#2f2144af31e67adc2a8e3705c20c2bd97bd88314" + integrity sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg== + "@esbuild/sunos-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== +"@esbuild/sunos-x64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz#69b99a9b5bd226c9eb9c6a73f990fddd497d732e" + integrity sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw== + "@esbuild/win32-arm64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== +"@esbuild/win32-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz#d789330a712af916c88325f4ffe465f885719c6b" + integrity sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ== + "@esbuild/win32-ia32@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== +"@esbuild/win32-ia32@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz#52fc735406bd49688253e74e4e837ac2ba0789e3" + integrity sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww== + "@esbuild/win32-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.1" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" - integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== +"@esbuild/win32-x64@0.25.9": + version "0.25.9" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz#585624dc829cfb6e7c0aa6c3ca7d7e6daa87e34f" + integrity sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": + version "4.7.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== dependencies: eslint-visitor-keys "^3.4.3" @@ -460,31 +604,31 @@ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== -"@eslint/compat@^1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.4.tgz#b69b0d76ce73fe66d7f8633c406acea151f5c559" - integrity sha512-S8ZdQj/N69YAtuqFt7653jwcvuUj131+6qGLUyDqfDg1OIoBQ66OCuXC473YQfO2AaxITTutiRQiDwoo7ZLYyg== - -"@eslint/config-array@^0.19.0": - version "0.19.1" - resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" - integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== +"@eslint/config-array@^0.21.0": + version "0.21.0" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636" + integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ== dependencies: - "@eslint/object-schema" "^2.1.5" + "@eslint/object-schema" "^2.1.6" debug "^4.3.1" minimatch "^3.1.2" -"@eslint/core@^0.9.0": - version "0.9.1" - resolved "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz#31763847308ef6b7084a4505573ac9402c51f9d1" - integrity sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q== +"@eslint/config-helpers@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz#3e09a90dfb87e0005c7694791e58e97077271286" + integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw== + +"@eslint/core@^0.15.0", "@eslint/core@^0.15.1": + version "0.15.1" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz#d530d44209cbfe2f82ef86d6ba08760196dd3b60" + integrity sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA== dependencies: "@types/json-schema" "^7.0.15" -"@eslint/eslintrc@^3.1.0", "@eslint/eslintrc@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" - integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== +"@eslint/eslintrc@^3.1.0", "@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -496,31 +640,27 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.17.0", "@eslint/js@^9.16.0": - version "9.17.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz#1523e586791f80376a6f8398a3964455ecc651ec" - integrity sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w== +"@eslint/js@9.32.0", "@eslint/js@^9.16.0": + version "9.32.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz#a02916f58bd587ea276876cb051b579a3d75d091" + integrity sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg== -"@eslint/object-schema@^2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" - integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== -"@eslint/plugin-kit@^0.2.3": - version "0.2.4" - resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz#2b78e7bb3755784bb13faa8932a1d994d6537792" - integrity sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg== +"@eslint/plugin-kit@^0.3.4": + version "0.3.4" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz#c6b9f165e94bf4d9fdd493f1c028a94aaf5fc1cc" + integrity sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw== dependencies: + "@eslint/core" "^0.15.1" levn "^0.4.1" -"@gar/promisify@^1.1.3": - version "1.1.3" - resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - "@gwhitney/detect-indent@7.0.1": version "7.0.1" - resolved "https://registry.npmjs.org/@gwhitney/detect-indent/-/detect-indent-7.0.1.tgz" + resolved "https://registry.npmjs.org/@gwhitney/detect-indent/-/detect-indent-7.0.1.tgz#db16d7fe6d13b26dc792442e5156677b44cc428e" integrity sha512-7bQW+gkKa2kKZPeJf6+c6gFK9ARxQfn+FKy9ScTBppyKRWH2KzsmweXUoklqeEiHiNVWaeP5csIdsNq6w7QhzA== "@humanfs/core@^0.19.1": @@ -546,20 +686,20 @@ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== -"@humanwhocodes/retry@^0.4.1": - version "0.4.1" - resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" - integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== +"@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" - resolved "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz" + resolved "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== -"@iconify-json/simple-icons@^1.2.10": - version "1.2.11" - resolved "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.11.tgz#076096af7dd95ae09f09bc23fadb261f4e3978ce" - integrity sha512-AHCGDtBRqP+JzAbBzgO8uN/08CXxEmuaC6lQQZ3b5burKhRU12AJnJczwbUw2K5Mb/U85EpSUNhYMG3F28b8NA== +"@iconify-json/simple-icons@^1.2.21": + version "1.2.27" + resolved "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.27.tgz#c0293aa2a2a6ba84d02489931c7101ff3cd6094f" + integrity sha512-FtZwp/H7ih5rY9FPfDR+k6toOo/cuwpHWY8faNhxLs5O5uW6Q8TeqdNWfjVfgFtrs5tUUzWysjqNGL234v8EMA== dependencies: "@iconify/types" "*" @@ -569,9 +709,21 @@ integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== "@inquirer/figures@^1.0.3": - version "1.0.5" - resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz#57f9a996d64d3e3345d2a3ca04d36912e94f8790" - integrity sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA== + version "1.0.10" + resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz#e3676a51c9c51aaabcd6ba18a28e82b98417db37" + integrity sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw== + +"@isaacs/balanced-match@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" + integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== + +"@isaacs/brace-expansion@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3" + integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== + dependencies: + "@isaacs/balanced-match" "^4.0.1" "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -587,7 +739,7 @@ "@isaacs/string-locale-compare@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz" + resolved "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": @@ -595,28 +747,6 @@ resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -624,22 +754,10 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + version "0.3.8" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -655,11 +773,16 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.4" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" + integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== + "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" @@ -668,690 +791,99 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@lerna/add@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/add/-/add-6.4.1.tgz" - integrity sha512-YSRnMcsdYnQtQQK0NSyrS9YGXvB3jzvx183o+JTH892MKzSlBqwpBHekCknSibyxga1HeZ0SNKQXgsHAwWkrRw== - dependencies: - "@lerna/bootstrap" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/filter-options" "6.4.1" - "@lerna/npm-conf" "6.4.1" - "@lerna/validation-error" "6.4.1" - dedent "^0.7.0" - npm-package-arg "8.1.1" - p-map "^4.0.0" - pacote "^13.6.1" - semver "^7.3.4" - -"@lerna/bootstrap@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-6.4.1.tgz" - integrity sha512-64cm0mnxzxhUUjH3T19ZSjPdn28vczRhhTXhNAvOhhU0sQgHrroam1xQC1395qbkV3iosSertlu8e7xbXW033w== - dependencies: - "@lerna/command" "6.4.1" - "@lerna/filter-options" "6.4.1" - "@lerna/has-npm-version" "6.4.1" - "@lerna/npm-install" "6.4.1" - "@lerna/package-graph" "6.4.1" - "@lerna/pulse-till-done" "6.4.1" - "@lerna/rimraf-dir" "6.4.1" - "@lerna/run-lifecycle" "6.4.1" - "@lerna/run-topologically" "6.4.1" - "@lerna/symlink-binary" "6.4.1" - "@lerna/symlink-dependencies" "6.4.1" - "@lerna/validation-error" "6.4.1" - "@npmcli/arborist" "5.3.0" - dedent "^0.7.0" - get-port "^5.1.1" - multimatch "^5.0.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - p-map "^4.0.0" - p-map-series "^2.1.0" - p-waterfall "^2.1.1" - semver "^7.3.4" - -"@lerna/changed@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/changed/-/changed-6.4.1.tgz" - integrity sha512-Z/z0sTm3l/iZW0eTSsnQpcY5d6eOpNO0g4wMOK+hIboWG0QOTc8b28XCnfCUO+33UisKl8PffultgoaHMKkGgw== - dependencies: - "@lerna/collect-updates" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/listable" "6.4.1" - "@lerna/output" "6.4.1" - -"@lerna/check-working-tree@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-6.4.1.tgz" - integrity sha512-EnlkA1wxaRLqhJdn9HX7h+JYxqiTK9aWEFOPqAE8lqjxHn3RpM9qBp1bAdL7CeUk3kN1lvxKwDEm0mfcIyMbPA== - dependencies: - "@lerna/collect-uncommitted" "6.4.1" - "@lerna/describe-ref" "6.4.1" - "@lerna/validation-error" "6.4.1" - -"@lerna/child-process@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/child-process/-/child-process-6.4.1.tgz" - integrity sha512-dvEKK0yKmxOv8pccf3I5D/k+OGiLxQp5KYjsrDtkes2pjpCFfQAMbmpol/Tqx6w/2o2rSaRrLsnX8TENo66FsA== - dependencies: - chalk "^4.1.0" - execa "^5.0.0" - strong-log-transformer "^2.1.0" - -"@lerna/clean@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/clean/-/clean-6.4.1.tgz" - integrity sha512-FuVyW3mpos5ESCWSkQ1/ViXyEtsZ9k45U66cdM/HnteHQk/XskSQw0sz9R+whrZRUDu6YgYLSoj1j0YAHVK/3A== - dependencies: - "@lerna/command" "6.4.1" - "@lerna/filter-options" "6.4.1" - "@lerna/prompt" "6.4.1" - "@lerna/pulse-till-done" "6.4.1" - "@lerna/rimraf-dir" "6.4.1" - p-map "^4.0.0" - p-map-series "^2.1.0" - p-waterfall "^2.1.1" - -"@lerna/cli@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/cli/-/cli-6.4.1.tgz" - integrity sha512-2pNa48i2wzFEd9LMPKWI3lkW/3widDqiB7oZUM1Xvm4eAOuDWc9I3RWmAUIVlPQNf3n4McxJCvsZZ9BpQN50Fg== - dependencies: - "@lerna/global-options" "6.4.1" - dedent "^0.7.0" - npmlog "^6.0.2" - yargs "^16.2.0" - -"@lerna/collect-uncommitted@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-6.4.1.tgz" - integrity sha512-5IVQGhlLrt7Ujc5ooYA1Xlicdba/wMcDSnbQwr8ufeqnzV2z4729pLCVk55gmi6ZienH/YeBPHxhB5u34ofE0Q== - dependencies: - "@lerna/child-process" "6.4.1" - chalk "^4.1.0" - npmlog "^6.0.2" - -"@lerna/collect-updates@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-6.4.1.tgz" - integrity sha512-pzw2/FC+nIqYkknUHK9SMmvP3MsLEjxI597p3WV86cEDN3eb1dyGIGuHiKShtjvT08SKSwpTX+3bCYvLVxtC5Q== - dependencies: - "@lerna/child-process" "6.4.1" - "@lerna/describe-ref" "6.4.1" - minimatch "^3.0.4" - npmlog "^6.0.2" - slash "^3.0.0" - -"@lerna/command@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/command/-/command-6.4.1.tgz" - integrity sha512-3Lifj8UTNYbRad8JMP7IFEEdlIyclWyyvq/zvNnTS9kCOEymfmsB3lGXr07/AFoi6qDrvN64j7YSbPZ6C6qonw== - dependencies: - "@lerna/child-process" "6.4.1" - "@lerna/package-graph" "6.4.1" - "@lerna/project" "6.4.1" - "@lerna/validation-error" "6.4.1" - "@lerna/write-log-file" "6.4.1" - clone-deep "^4.0.1" - dedent "^0.7.0" - execa "^5.0.0" - is-ci "^2.0.0" - npmlog "^6.0.2" - -"@lerna/conventional-commits@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-6.4.1.tgz" - integrity sha512-NIvCOjStjQy5O8VojB7/fVReNNDEJOmzRG2sTpgZ/vNS4AzojBQZ/tobzhm7rVkZZ43R9srZeuhfH9WgFsVUSA== - dependencies: - "@lerna/validation-error" "6.4.1" - conventional-changelog-angular "^5.0.12" - conventional-changelog-core "^4.2.4" - conventional-recommended-bump "^6.1.0" - fs-extra "^9.1.0" - get-stream "^6.0.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - pify "^5.0.0" - semver "^7.3.4" - -"@lerna/create-symlink@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-6.4.1.tgz" - integrity sha512-rNivHFYV1GAULxnaTqeGb2AdEN2OZzAiZcx5CFgj45DWXQEGwPEfpFmCSJdXhFZbyd3K0uiDlAXjAmV56ov3FQ== - dependencies: - cmd-shim "^5.0.0" - fs-extra "^9.1.0" - npmlog "^6.0.2" - -"@lerna/create@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/create/-/create-6.4.1.tgz" - integrity sha512-qfQS8PjeGDDlxEvKsI/tYixIFzV2938qLvJohEKWFn64uvdLnXCamQ0wvRJST8p1ZpHWX4AXrB+xEJM3EFABrA== - dependencies: - "@lerna/child-process" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/npm-conf" "6.4.1" - "@lerna/validation-error" "6.4.1" - dedent "^0.7.0" - fs-extra "^9.1.0" - init-package-json "^3.0.2" - npm-package-arg "8.1.1" +"@lerna/create@8.2.3": + version "8.2.3" + resolved "https://registry.npmjs.org/@lerna/create/-/create-8.2.3.tgz#8e88fedb60eb699f2f5057e7344d9f980b7f9554" + integrity sha512-f+68+iojcQ0tZRMfCgQyJdsdz+YPu3/d+0Zo1RJz92bgBxTCiEU+dHACVq1n3sEjm/YWPnFGdag8U5EYYmP3WA== + dependencies: + "@npmcli/arborist" "7.5.4" + "@npmcli/package-json" "5.2.0" + "@npmcli/run-script" "8.1.0" + "@nx/devkit" ">=17.1.2 < 21" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "20.1.2" + aproba "2.0.0" + byte-size "8.1.1" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "6.0.3" + color-support "1.1.3" + columnify "1.6.0" + console-control-strings "^1.1.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "9.0.0" + dedent "1.5.3" + execa "5.0.0" + fs-extra "^11.2.0" + get-stream "6.0.0" + git-url-parse "14.0.0" + glob-parent "6.0.2" + graceful-fs "4.2.11" + has-unicode "2.0.1" + ini "^1.3.8" + init-package-json "6.0.3" + inquirer "^8.2.4" + is-ci "3.0.1" + is-stream "2.0.0" + js-yaml "4.1.0" + libnpmpublish "9.0.9" + load-json-file "6.2.0" + lodash "^4.17.21" + make-dir "4.0.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "11.0.2" + npm-packlist "8.0.2" + npm-registry-fetch "^17.1.0" + nx ">=17.1.2 < 21" + p-map "4.0.0" + p-map-series "2.1.0" + p-queue "6.6.2" p-reduce "^2.1.0" - pacote "^13.6.1" - pify "^5.0.0" + pacote "^18.0.6" + pify "5.0.0" + read-cmd-shim "4.0.0" + resolve-from "5.0.0" + rimraf "^4.4.1" semver "^7.3.4" + set-blocking "^2.0.0" + signal-exit "3.0.7" slash "^3.0.0" + ssri "^10.0.6" + string-width "^4.2.3" + tar "6.2.1" + temp-dir "1.0.0" + through "2.3.8" + tinyglobby "0.2.12" + upath "2.0.1" + uuid "^10.0.0" validate-npm-package-license "^3.0.4" - validate-npm-package-name "^4.0.0" - yargs-parser "20.2.4" - -"@lerna/describe-ref@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-6.4.1.tgz" - integrity sha512-MXGXU8r27wl355kb1lQtAiu6gkxJ5tAisVJvFxFM1M+X8Sq56icNoaROqYrvW6y97A9+3S8Q48pD3SzkFv31Xw== - dependencies: - "@lerna/child-process" "6.4.1" - npmlog "^6.0.2" - -"@lerna/diff@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/diff/-/diff-6.4.1.tgz" - integrity sha512-TnzJsRPN2fOjUrmo5Boi43fJmRtBJDsVgwZM51VnLoKcDtO1kcScXJ16Od2Xx5bXbp5dES5vGDLL/USVVWfeAg== - dependencies: - "@lerna/child-process" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/validation-error" "6.4.1" - npmlog "^6.0.2" - -"@lerna/exec@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/exec/-/exec-6.4.1.tgz" - integrity sha512-KAWfuZpoyd3FMejHUORd0GORMr45/d9OGAwHitfQPVs4brsxgQFjbbBEEGIdwsg08XhkDb4nl6IYVASVTq9+gA== - dependencies: - "@lerna/child-process" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/filter-options" "6.4.1" - "@lerna/profiler" "6.4.1" - "@lerna/run-topologically" "6.4.1" - "@lerna/validation-error" "6.4.1" - p-map "^4.0.0" - -"@lerna/filter-options@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-6.4.1.tgz" - integrity sha512-efJh3lP2T+9oyNIP2QNd9EErf0Sm3l3Tz8CILMsNJpjSU6kO43TYWQ+L/ezu2zM99KVYz8GROLqDcHRwdr8qUA== - dependencies: - "@lerna/collect-updates" "6.4.1" - "@lerna/filter-packages" "6.4.1" - dedent "^0.7.0" - npmlog "^6.0.2" - -"@lerna/filter-packages@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-6.4.1.tgz" - integrity sha512-LCMGDGy4b+Mrb6xkcVzp4novbf5MoZEE6ZQF1gqG0wBWqJzNcKeFiOmf352rcDnfjPGZP6ct5+xXWosX/q6qwg== - dependencies: - "@lerna/validation-error" "6.4.1" - multimatch "^5.0.0" - npmlog "^6.0.2" - -"@lerna/get-npm-exec-opts@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-6.4.1.tgz" - integrity sha512-IvN/jyoklrWcjssOf121tZhOc16MaFPOu5ii8a+Oy0jfTriIGv929Ya8MWodj75qec9s+JHoShB8yEcMqZce4g== - dependencies: - npmlog "^6.0.2" - -"@lerna/get-packed@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-6.4.1.tgz" - integrity sha512-uaDtYwK1OEUVIXn84m45uPlXShtiUcw6V9TgB3rvHa3rrRVbR7D4r+JXcwVxLGrAS7LwxVbYWEEO/Z/bX7J/Lg== - dependencies: - fs-extra "^9.1.0" - ssri "^9.0.1" - tar "^6.1.0" - -"@lerna/github-client@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/github-client/-/github-client-6.4.1.tgz" - integrity sha512-ridDMuzmjMNlcDmrGrV9mxqwUKzt9iYqCPwVYJlRYrnE3jxyg+RdooquqskVFj11djcY6xCV2Q2V1lUYwF+PmA== - dependencies: - "@lerna/child-process" "6.4.1" - "@octokit/plugin-enterprise-rest" "^6.0.1" - "@octokit/rest" "^19.0.3" - git-url-parse "^13.1.0" - npmlog "^6.0.2" - -"@lerna/gitlab-client@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-6.4.1.tgz" - integrity sha512-AdLG4d+jbUvv0jQyygQUTNaTCNSMDxioJso6aAjQ/vkwyy3fBJ6FYzX74J4adSfOxC2MQZITFyuG+c9ggp7pyQ== - dependencies: - node-fetch "^2.6.1" - npmlog "^6.0.2" - -"@lerna/global-options@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/global-options/-/global-options-6.4.1.tgz" - integrity sha512-UTXkt+bleBB8xPzxBPjaCN/v63yQdfssVjhgdbkQ//4kayaRA65LyEtJTi9rUrsLlIy9/rbeb+SAZUHg129fJg== - -"@lerna/has-npm-version@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-6.4.1.tgz" - integrity sha512-vW191w5iCkwNWWWcy4542ZOpjKYjcP/pU3o3+w6NM1J3yBjWZcNa8lfzQQgde2QkGyNi+i70o6wIca1o0sdKwg== - dependencies: - "@lerna/child-process" "6.4.1" - semver "^7.3.4" - -"@lerna/import@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/import/-/import-6.4.1.tgz" - integrity sha512-oDg8g1PNrCM1JESLsG3rQBtPC+/K9e4ohs0xDKt5E6p4l7dc0Ib4oo0oCCT/hGzZUlNwHxrc2q9JMRzSAn6P/Q== - dependencies: - "@lerna/child-process" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/prompt" "6.4.1" - "@lerna/pulse-till-done" "6.4.1" - "@lerna/validation-error" "6.4.1" - dedent "^0.7.0" - fs-extra "^9.1.0" - p-map-series "^2.1.0" - -"@lerna/info@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/info/-/info-6.4.1.tgz" - integrity sha512-Ks4R7IndIr4vQXz+702gumPVhH6JVkshje0WKA3+ew2qzYZf68lU1sBe1OZsQJU3eeY2c60ax+bItSa7aaIHGw== - dependencies: - "@lerna/command" "6.4.1" - "@lerna/output" "6.4.1" - envinfo "^7.7.4" - -"@lerna/init@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/init/-/init-6.4.1.tgz" - integrity sha512-CXd/s/xgj0ZTAoOVyolOTLW2BG7uQOhWW4P/ktlwwJr9s3c4H/z+Gj36UXw3q5X1xdR29NZt7Vc6fvROBZMjUQ== - dependencies: - "@lerna/child-process" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/project" "6.4.1" - fs-extra "^9.1.0" - p-map "^4.0.0" - write-json-file "^4.3.0" - -"@lerna/link@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/link/-/link-6.4.1.tgz" - integrity sha512-O8Rt7MAZT/WT2AwrB/+HY76ktnXA9cDFO9rhyKWZGTHdplbzuJgfsGzu8Xv0Ind+w+a8xLfqtWGPlwiETnDyrw== - dependencies: - "@lerna/command" "6.4.1" - "@lerna/package-graph" "6.4.1" - "@lerna/symlink-dependencies" "6.4.1" - "@lerna/validation-error" "6.4.1" - p-map "^4.0.0" - slash "^3.0.0" - -"@lerna/list@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/list/-/list-6.4.1.tgz" - integrity sha512-7a6AKgXgC4X7nK6twVPNrKCiDhrCiAhL/FE4u9HYhHqw9yFwyq8Qe/r1RVOkAOASNZzZ8GuBvob042bpunupCw== - dependencies: - "@lerna/command" "6.4.1" - "@lerna/filter-options" "6.4.1" - "@lerna/listable" "6.4.1" - "@lerna/output" "6.4.1" - -"@lerna/listable@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/listable/-/listable-6.4.1.tgz" - integrity sha512-L8ANeidM10aoF8aL3L/771Bb9r/TRkbEPzAiC8Iy2IBTYftS87E3rT/4k5KBEGYzMieSKJaskSFBV0OQGYV1Cw== - dependencies: - "@lerna/query-graph" "6.4.1" - chalk "^4.1.0" - columnify "^1.6.0" - -"@lerna/log-packed@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-6.4.1.tgz" - integrity sha512-Pwv7LnIgWqZH4vkM1rWTVF+pmWJu7d0ZhVwyhCaBJUsYbo+SyB2ZETGygo3Z/A+vZ/S7ImhEEKfIxU9bg5lScQ== - dependencies: - byte-size "^7.0.0" - columnify "^1.6.0" - has-unicode "^2.0.1" - npmlog "^6.0.2" - -"@lerna/npm-conf@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-6.4.1.tgz" - integrity sha512-Q+83uySGXYk3n1pYhvxtzyGwBGijYgYecgpiwRG1YNyaeGy+Mkrj19cyTWubT+rU/kM5c6If28+y9kdudvc7zQ== - dependencies: - config-chain "^1.1.12" - pify "^5.0.0" - -"@lerna/npm-dist-tag@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-6.4.1.tgz" - integrity sha512-If1Hn4q9fn0JWuBm455iIZDWE6Fsn4Nv8Tpqb+dYf0CtoT5Hn+iT64xSiU5XJw9Vc23IR7dIujkEXm2MVbnvZw== - dependencies: - "@lerna/otplease" "6.4.1" - npm-package-arg "8.1.1" - npm-registry-fetch "^13.3.0" - npmlog "^6.0.2" - -"@lerna/npm-install@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-6.4.1.tgz" - integrity sha512-7gI1txMA9qTaT3iiuk/8/vL78wIhtbbOLhMf8m5yQ2G+3t47RUA8MNgUMsq4Zszw9C83drayqesyTf0u8BzVRg== - dependencies: - "@lerna/child-process" "6.4.1" - "@lerna/get-npm-exec-opts" "6.4.1" - fs-extra "^9.1.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - signal-exit "^3.0.3" - write-pkg "^4.0.0" - -"@lerna/npm-publish@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-6.4.1.tgz" - integrity sha512-lbNEg+pThPAD8lIgNArm63agtIuCBCF3umxvgTQeLzyqUX6EtGaKJFyz/6c2ANcAuf8UfU7WQxFFbOiolibXTQ== - dependencies: - "@lerna/otplease" "6.4.1" - "@lerna/run-lifecycle" "6.4.1" - fs-extra "^9.1.0" - libnpmpublish "^6.0.4" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - pify "^5.0.0" - read-package-json "^5.0.1" - -"@lerna/npm-run-script@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-6.4.1.tgz" - integrity sha512-HyvwuyhrGqDa1UbI+pPbI6v+wT6I34R0PW3WCADn6l59+AyqLOCUQQr+dMW7jdYNwjO6c/Ttbvj4W58EWsaGtQ== - dependencies: - "@lerna/child-process" "6.4.1" - "@lerna/get-npm-exec-opts" "6.4.1" - npmlog "^6.0.2" - -"@lerna/otplease@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/otplease/-/otplease-6.4.1.tgz" - integrity sha512-ePUciFfFdythHNMp8FP5K15R/CoGzSLVniJdD50qm76c4ATXZHnGCW2PGwoeAZCy4QTzhlhdBq78uN0wAs75GA== - dependencies: - "@lerna/prompt" "6.4.1" - -"@lerna/output@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/output/-/output-6.4.1.tgz" - integrity sha512-A1yRLF0bO+lhbIkrryRd6hGSD0wnyS1rTPOWJhScO/Zyv8vIPWhd2fZCLR1gI2d/Kt05qmK3T/zETTwloK7Fww== - dependencies: - npmlog "^6.0.2" - -"@lerna/pack-directory@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-6.4.1.tgz" - integrity sha512-kBtDL9bPP72/Nl7Gqa2CA3Odb8CYY1EF2jt801f+B37TqRLf57UXQom7yF3PbWPCPmhoU+8Fc4RMpUwSbFC46Q== - dependencies: - "@lerna/get-packed" "6.4.1" - "@lerna/package" "6.4.1" - "@lerna/run-lifecycle" "6.4.1" - "@lerna/temp-write" "6.4.1" - npm-packlist "^5.1.1" - npmlog "^6.0.2" - tar "^6.1.0" - -"@lerna/package-graph@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-6.4.1.tgz" - integrity sha512-fQvc59stRYOqxT3Mn7g/yI9/Kw5XetJoKcW5l8XeqKqcTNDURqKnN0qaNBY6lTTLOe4cR7gfXF2l1u3HOz0qEg== - dependencies: - "@lerna/prerelease-id-from-version" "6.4.1" - "@lerna/validation-error" "6.4.1" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - semver "^7.3.4" - -"@lerna/package@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/package/-/package-6.4.1.tgz" - integrity sha512-TrOah58RnwS9R8d3+WgFFTu5lqgZs7M+e1dvcRga7oSJeKscqpEK57G0xspvF3ycjfXQwRMmEtwPmpkeEVLMzA== - dependencies: - load-json-file "^6.2.0" - npm-package-arg "8.1.1" - write-pkg "^4.0.0" - -"@lerna/prerelease-id-from-version@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-6.4.1.tgz" - integrity sha512-uGicdMFrmfHXeC0FTosnUKRgUjrBJdZwrmw7ZWMb5DAJGOuTzrvJIcz5f0/eL3XqypC/7g+9DoTgKjX3hlxPZA== - dependencies: - semver "^7.3.4" - -"@lerna/profiler@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/profiler/-/profiler-6.4.1.tgz" - integrity sha512-dq2uQxcu0aq6eSoN+JwnvHoAnjtZAVngMvywz5bTAfzz/sSvIad1v8RCpJUMBQHxaPtbfiNvOIQgDZOmCBIM4g== - dependencies: - fs-extra "^9.1.0" - npmlog "^6.0.2" - upath "^2.0.1" - -"@lerna/project@6.4.1", "@lerna/project@^6.0.0": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/project/-/project-6.4.1.tgz" - integrity sha512-BPFYr4A0mNZ2jZymlcwwh7PfIC+I6r52xgGtJ4KIrIOB6mVKo9u30dgYJbUQxmSuMRTOnX7PJZttQQzSda4gEg== - dependencies: - "@lerna/package" "6.4.1" - "@lerna/validation-error" "6.4.1" - cosmiconfig "^7.0.0" - dedent "^0.7.0" - dot-prop "^6.0.1" - glob-parent "^5.1.1" - globby "^11.0.2" - js-yaml "^4.1.0" - load-json-file "^6.2.0" - npmlog "^6.0.2" - p-map "^4.0.0" - resolve-from "^5.0.0" - write-json-file "^4.3.0" - -"@lerna/prompt@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/prompt/-/prompt-6.4.1.tgz" - integrity sha512-vMxCIgF9Vpe80PnargBGAdS/Ib58iYEcfkcXwo7mYBCxEVcaUJFKZ72FEW8rw+H5LkxBlzrBJyfKRoOe0ks9gQ== - dependencies: - inquirer "^8.2.4" - npmlog "^6.0.2" - -"@lerna/publish@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/publish/-/publish-6.4.1.tgz" - integrity sha512-/D/AECpw2VNMa1Nh4g29ddYKRIqygEV1ftV8PYXVlHpqWN7VaKrcbRU6pn0ldgpFlMyPtESfv1zS32F5CQ944w== - dependencies: - "@lerna/check-working-tree" "6.4.1" - "@lerna/child-process" "6.4.1" - "@lerna/collect-updates" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/describe-ref" "6.4.1" - "@lerna/log-packed" "6.4.1" - "@lerna/npm-conf" "6.4.1" - "@lerna/npm-dist-tag" "6.4.1" - "@lerna/npm-publish" "6.4.1" - "@lerna/otplease" "6.4.1" - "@lerna/output" "6.4.1" - "@lerna/pack-directory" "6.4.1" - "@lerna/prerelease-id-from-version" "6.4.1" - "@lerna/prompt" "6.4.1" - "@lerna/pulse-till-done" "6.4.1" - "@lerna/run-lifecycle" "6.4.1" - "@lerna/run-topologically" "6.4.1" - "@lerna/validation-error" "6.4.1" - "@lerna/version" "6.4.1" - fs-extra "^9.1.0" - libnpmaccess "^6.0.3" - npm-package-arg "8.1.1" - npm-registry-fetch "^13.3.0" - npmlog "^6.0.2" - p-map "^4.0.0" - p-pipe "^3.1.0" - pacote "^13.6.1" - semver "^7.3.4" - -"@lerna/pulse-till-done@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-6.4.1.tgz" - integrity sha512-efAkOC1UuiyqYBfrmhDBL6ufYtnpSqAG+lT4d/yk3CzJEJKkoCwh2Hb692kqHHQ5F74Uusc8tcRB7GBcfNZRWA== - dependencies: - npmlog "^6.0.2" - -"@lerna/query-graph@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-6.4.1.tgz" - integrity sha512-gBGZLgu2x6L4d4ZYDn4+d5rxT9RNBC+biOxi0QrbaIq83I+JpHVmFSmExXK3rcTritrQ3JT9NCqb+Yu9tL9adQ== - dependencies: - "@lerna/package-graph" "6.4.1" - -"@lerna/resolve-symlink@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-6.4.1.tgz" - integrity sha512-gnqltcwhWVLUxCuwXWe/ch9WWTxXRI7F0ZvCtIgdfOpbosm3f1g27VO1LjXeJN2i6ks03qqMowqy4xB4uMR9IA== - dependencies: - fs-extra "^9.1.0" - npmlog "^6.0.2" - read-cmd-shim "^3.0.0" - -"@lerna/rimraf-dir@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-6.4.1.tgz" - integrity sha512-5sDOmZmVj0iXIiEgdhCm0Prjg5q2SQQKtMd7ImimPtWKkV0IyJWxrepJFbeQoFj5xBQF7QB5jlVNEfQfKhD6pQ== - dependencies: - "@lerna/child-process" "6.4.1" - npmlog "^6.0.2" - path-exists "^4.0.0" - rimraf "^3.0.2" - -"@lerna/run-lifecycle@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-6.4.1.tgz" - integrity sha512-42VopI8NC8uVCZ3YPwbTycGVBSgukJltW5Saein0m7TIqFjwSfrcP0n7QJOr+WAu9uQkk+2kBstF5WmvKiqgEA== - dependencies: - "@lerna/npm-conf" "6.4.1" - "@npmcli/run-script" "^4.1.7" - npmlog "^6.0.2" - p-queue "^6.6.2" - -"@lerna/run-topologically@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-6.4.1.tgz" - integrity sha512-gXlnAsYrjs6KIUGDnHM8M8nt30Amxq3r0lSCNAt+vEu2sMMEOh9lffGGaJobJZ4bdwoXnKay3uER/TU8E9owMw== - dependencies: - "@lerna/query-graph" "6.4.1" - p-queue "^6.6.2" - -"@lerna/run@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/run/-/run-6.4.1.tgz" - integrity sha512-HRw7kS6KNqTxqntFiFXPEeBEct08NjnL6xKbbOV6pXXf+lXUQbJlF8S7t6UYqeWgTZ4iU9caIxtZIY+EpW93mQ== - dependencies: - "@lerna/command" "6.4.1" - "@lerna/filter-options" "6.4.1" - "@lerna/npm-run-script" "6.4.1" - "@lerna/output" "6.4.1" - "@lerna/profiler" "6.4.1" - "@lerna/run-topologically" "6.4.1" - "@lerna/timer" "6.4.1" - "@lerna/validation-error" "6.4.1" - fs-extra "^9.1.0" - nx ">=15.4.2 < 16" - p-map "^4.0.0" - -"@lerna/symlink-binary@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-6.4.1.tgz" - integrity sha512-poZX90VmXRjL/JTvxaUQPeMDxFUIQvhBkHnH+dwW0RjsHB/2Tu4QUAsE0OlFnlWQGsAtXF4FTtW8Xs57E/19Kw== - dependencies: - "@lerna/create-symlink" "6.4.1" - "@lerna/package" "6.4.1" - fs-extra "^9.1.0" - p-map "^4.0.0" - -"@lerna/symlink-dependencies@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-6.4.1.tgz" - integrity sha512-43W2uLlpn3TTYuHVeO/2A6uiTZg6TOk/OSKi21ujD7IfVIYcRYCwCV+8LPP12R3rzyab0JWkWnhp80Z8A2Uykw== - dependencies: - "@lerna/create-symlink" "6.4.1" - "@lerna/resolve-symlink" "6.4.1" - "@lerna/symlink-binary" "6.4.1" - fs-extra "^9.1.0" - p-map "^4.0.0" - p-map-series "^2.1.0" + validate-npm-package-name "5.0.1" + wide-align "1.1.5" + write-file-atomic "5.0.1" + write-pkg "4.0.0" + yargs "17.7.2" + yargs-parser "21.1.1" -"@lerna/temp-write@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/temp-write/-/temp-write-6.4.1.tgz" - integrity sha512-7uiGFVoTyos5xXbVQg4bG18qVEn9dFmboXCcHbMj5mc/+/QmU9QeNz/Cq36O5TY6gBbLnyj3lfL5PhzERWKMFg== +"@napi-rs/wasm-runtime@0.2.4": + version "0.2.4" + resolved "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz#d27788176f250d86e498081e3c5ff48a17606918" + integrity sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ== dependencies: - graceful-fs "^4.1.15" - is-stream "^2.0.0" - make-dir "^3.0.0" - temp-dir "^1.0.0" - uuid "^8.3.2" - -"@lerna/timer@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/timer/-/timer-6.4.1.tgz" - integrity sha512-ogmjFTWwRvevZr76a2sAbhmu3Ut2x73nDIn0bcwZwZ3Qc3pHD8eITdjs/wIKkHse3J7l3TO5BFJPnrvDS7HLnw== - -"@lerna/validation-error@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-6.4.1.tgz" - integrity sha512-fxfJvl3VgFd7eBfVMRX6Yal9omDLs2mcGKkNYeCEyt4Uwlz1B5tPAXyk/sNMfkKV2Aat/mlK5tnY13vUrMKkyA== - dependencies: - npmlog "^6.0.2" - -"@lerna/version@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/version/-/version-6.4.1.tgz" - integrity sha512-1/krPq0PtEqDXtaaZsVuKev9pXJCkNC1vOo2qCcn6PBkODw/QTAvGcUi0I+BM2c//pdxge9/gfmbDo1lC8RtAQ== - dependencies: - "@lerna/check-working-tree" "6.4.1" - "@lerna/child-process" "6.4.1" - "@lerna/collect-updates" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/conventional-commits" "6.4.1" - "@lerna/github-client" "6.4.1" - "@lerna/gitlab-client" "6.4.1" - "@lerna/output" "6.4.1" - "@lerna/prerelease-id-from-version" "6.4.1" - "@lerna/prompt" "6.4.1" - "@lerna/run-lifecycle" "6.4.1" - "@lerna/run-topologically" "6.4.1" - "@lerna/temp-write" "6.4.1" - "@lerna/validation-error" "6.4.1" - "@nrwl/devkit" ">=15.4.2 < 16" - chalk "^4.1.0" - dedent "^0.7.0" - load-json-file "^6.2.0" - minimatch "^3.0.4" - npmlog "^6.0.2" - p-map "^4.0.0" - p-pipe "^3.1.0" - p-reduce "^2.1.0" - p-waterfall "^2.1.1" - semver "^7.3.4" - slash "^3.0.0" - write-json-file "^4.3.0" + "@emnapi/core" "^1.1.0" + "@emnapi/runtime" "^1.1.0" + "@tybys/wasm-util" "^0.9.0" -"@lerna/write-log-file@6.4.1": - version "6.4.1" - resolved "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-6.4.1.tgz" - integrity sha512-LE4fueQSDrQo76F4/gFXL0wnGhqdG7WHVH8D8TrKouF2Afl4NHltObCm4WsSMPjcfciVnZQFfx1ruxU4r/enHQ== +"@napi-rs/wasm-runtime@^0.2.11": + version "0.2.11" + resolved "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz#192c1610e1625048089ab4e35bc0649ce478500e" + integrity sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA== dependencies: - npmlog "^6.0.2" - write-file-atomic "^4.0.1" + "@emnapi/core" "^1.4.3" + "@emnapi/runtime" "^1.4.3" + "@tybys/wasm-util" "^0.9.0" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1374,285 +906,339 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/arborist@5.3.0": - version "5.3.0" - resolved "https://registry.npmjs.org/@npmcli/arborist/-/arborist-5.3.0.tgz" - integrity sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A== +"@npmcli/agent@^2.0.0": + version "2.2.2" + resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz#967604918e62f620a648c7975461c9c9e74fc5d5" + integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.3" + +"@npmcli/arborist@7.5.4": + version "7.5.4" + resolved "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz#3dd9e531d6464ef6715e964c188e0880c471ac9b" + integrity sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g== dependencies: "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/map-workspaces" "^2.0.3" - "@npmcli/metavuln-calculator" "^3.0.1" - "@npmcli/move-file" "^2.0.0" - "@npmcli/name-from-folder" "^1.0.1" - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/package-json" "^2.0.0" - "@npmcli/run-script" "^4.1.3" - bin-links "^3.0.0" - cacache "^16.0.6" + "@npmcli/fs" "^3.1.1" + "@npmcli/installed-package-contents" "^2.1.0" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^7.1.1" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.1.0" + "@npmcli/query" "^3.1.0" + "@npmcli/redact" "^2.0.0" + "@npmcli/run-script" "^8.1.0" + bin-links "^4.0.4" + cacache "^18.0.3" common-ancestor-path "^1.0.1" - json-parse-even-better-errors "^2.3.1" + hosted-git-info "^7.0.2" + json-parse-even-better-errors "^3.0.2" json-stringify-nice "^1.1.4" - mkdirp "^1.0.4" - mkdirp-infer-owner "^2.0.0" - nopt "^5.0.0" - npm-install-checks "^5.0.0" - npm-package-arg "^9.0.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.0" - npmlog "^6.0.2" - pacote "^13.6.1" - parse-conflict-json "^2.0.1" - proc-log "^2.0.0" + lru-cache "^10.2.2" + minimatch "^9.0.4" + nopt "^7.2.1" + npm-install-checks "^6.2.0" + npm-package-arg "^11.0.2" + npm-pick-manifest "^9.0.1" + npm-registry-fetch "^17.0.1" + pacote "^18.0.6" + parse-conflict-json "^3.0.0" + proc-log "^4.2.0" + proggy "^2.0.0" promise-all-reject-late "^1.0.0" - promise-call-limit "^1.0.1" - read-package-json-fast "^2.0.2" - readdir-scoped-modules "^1.1.0" - rimraf "^3.0.2" + promise-call-limit "^3.0.1" + read-package-json-fast "^3.0.2" semver "^7.3.7" - ssri "^9.0.0" - treeverse "^2.0.0" - walk-up-path "^1.0.0" + ssri "^10.0.6" + treeverse "^3.0.0" + walk-up-path "^3.0.1" -"@npmcli/fs@^2.1.0": - version "2.1.2" - resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz" - integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== +"@npmcli/fs@^3.1.0", "@npmcli/fs@^3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== dependencies: - "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/git@^3.0.0": - version "3.0.2" - resolved "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz" - integrity sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w== - dependencies: - "@npmcli/promise-spawn" "^3.0.0" - lru-cache "^7.4.4" - mkdirp "^1.0.4" - npm-pick-manifest "^7.0.0" - proc-log "^2.0.0" +"@npmcli/git@^5.0.0": + version "5.0.8" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz#8ba3ff8724192d9ccb2735a2aa5380a992c5d3d1" + integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== + dependencies: + "@npmcli/promise-spawn" "^7.0.0" + ini "^4.1.3" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" + proc-log "^4.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" - which "^2.0.2" + which "^4.0.0" -"@npmcli/installed-package-contents@^1.0.7": - version "1.0.7" - resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz" - integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== +"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz#63048e5f6e40947a3a88dcbcb4fd9b76fdd37c17" + integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== dependencies: - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" -"@npmcli/map-workspaces@^2.0.3": - version "2.0.4" - resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz" - integrity sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg== +"@npmcli/map-workspaces@^3.0.2": + version "3.0.6" + resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz#27dc06c20c35ef01e45a08909cab9cb3da08cea6" + integrity sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA== dependencies: - "@npmcli/name-from-folder" "^1.0.1" - glob "^8.0.1" - minimatch "^5.0.1" - read-package-json-fast "^2.0.3" + "@npmcli/name-from-folder" "^2.0.0" + glob "^10.2.2" + minimatch "^9.0.0" + read-package-json-fast "^3.0.0" -"@npmcli/metavuln-calculator@^3.0.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz" - integrity sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA== +"@npmcli/metavuln-calculator@^7.1.1": + version "7.1.1" + resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz#4d3b6c3192f72bc8ad59476de0da939c33877fcf" + integrity sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g== dependencies: - cacache "^16.0.0" - json-parse-even-better-errors "^2.3.1" - pacote "^13.0.3" + cacache "^18.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^18.0.0" + proc-log "^4.1.0" semver "^7.3.5" -"@npmcli/move-file@^2.0.0": - version "2.0.1" - resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz" - integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== -"@npmcli/name-from-folder@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz" - integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA== +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== -"@npmcli/node-gyp@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz" - integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== +"@npmcli/package-json@5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz#a1429d3111c10044c7efbfb0fce9f2c501f4cfad" + integrity sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ== + dependencies: + "@npmcli/git" "^5.0.0" + glob "^10.2.2" + hosted-git-info "^7.0.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^4.0.0" + semver "^7.5.3" -"@npmcli/package-json@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-2.0.0.tgz" - integrity sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA== +"@npmcli/package-json@^5.0.0", "@npmcli/package-json@^5.1.0": + version "5.2.1" + resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz#df69477b1023b81ff8503f2b9db4db4faea567ed" + integrity sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ== dependencies: - json-parse-even-better-errors "^2.3.1" + "@npmcli/git" "^5.0.0" + glob "^10.2.2" + hosted-git-info "^7.0.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^4.0.0" + semver "^7.5.3" -"@npmcli/promise-spawn@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz" - integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== +"@npmcli/promise-spawn@^7.0.0": + version "7.0.2" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz#1d53d34ffeb5d151bfa8ec661bcccda8bbdfd532" + integrity sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ== dependencies: - infer-owner "^1.0.4" + which "^4.0.0" -"@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3", "@npmcli/run-script@^4.1.7": - version "4.2.1" - resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz" - integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== +"@npmcli/query@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz#bc202c59e122a06cf8acab91c795edda2cdad42c" + integrity sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ== dependencies: - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/promise-spawn" "^3.0.0" - node-gyp "^9.0.0" - read-package-json-fast "^2.0.3" - which "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@npmcli/redact@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz#95432fd566e63b35c04494621767a4312c316762" + integrity sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw== -"@nrwl/cli@15.4.8": - version "15.4.8" - resolved "https://registry.npmjs.org/@nrwl/cli/-/cli-15.4.8.tgz" - integrity sha512-6QxrgGYvD5cxzYVH0hn6U0SzabeFdzBspdk8WcBYuOYNd57NUTbxDY9YnB9LQ1Rgs32EWtX3kg3mzYpub4Ra/w== +"@npmcli/run-script@8.1.0", "@npmcli/run-script@^8.0.0", "@npmcli/run-script@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz#a563e5e29b1ca4e648a6b1bbbfe7220b4bfe39fc" + integrity sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== dependencies: - nx "15.4.8" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.0.0" + "@npmcli/promise-spawn" "^7.0.0" + node-gyp "^10.0.0" + proc-log "^4.0.0" + which "^4.0.0" -"@nrwl/devkit@>=15.4.2 < 16": - version "15.4.8" - resolved "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.4.8.tgz" - integrity sha512-m53JBLPmj4fFsZQw8yWFhtmwqMnEDGApGv0Xm8VzVOfYL7HcinylZi9RNxYlRzWC8fqD/gF0yNn/gOmCK7IWWw== +"@nx/devkit@>=17.1.2 < 21": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.2.tgz#4bed032a06ac37910fae5e231849283b8ac415fb" + integrity sha512-rr9p2/tZDQivIpuBUpZaFBK6bZ+b5SAjZk75V4tbCUqGW3+5OPuVvBPm+X+7PYwUF6rwSpewxkjWNeGskfCe+Q== dependencies: - "@phenomnomnominal/tsquery" "4.1.1" ejs "^3.1.7" + enquirer "~2.3.6" ignore "^5.0.4" - semver "7.3.4" + minimatch "9.0.3" + semver "^7.5.3" + tmp "~0.2.1" tslib "^2.3.0" + yargs-parser "21.1.1" -"@nrwl/tao@15.4.8": - version "15.4.8" - resolved "https://registry.npmjs.org/@nrwl/tao/-/tao-15.4.8.tgz" - integrity sha512-XajgVKDWHW4NcMxpBg7hC9nMkyujnmVNLZvBfURFPNY2wetFWz8xpyvflq3oLm+veGm7M/TbnPLOLuHI2223nA== - dependencies: - nx "15.4.8" - -"@octokit/auth-token@^3.0.0": - version "3.0.2" - resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz" - integrity sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q== - dependencies: - "@octokit/types" "^8.0.0" +"@nx/nx-darwin-arm64@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.2.tgz#16b20a4aac4228f30124551a1eceb03d5f8330e7" + integrity sha512-t+bmCn6sRPNGU6hnSyWNvbQYA/KgsxGZKYlaCLRwkNhI2akModcBUqtktJzCKd1XHDqs6EkEFBWjFr8/kBEkSg== + +"@nx/nx-darwin-x64@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.2.tgz#06a203a695509e4a6f05a82cb40cc00438a19b3a" + integrity sha512-pt/wmDLM31Es8/EzazlyT5U+ou2l60rfMNFGCLqleHEQ0JUTc0KWnOciBLbHIQFiPsCQZJFEKyfV5V/ncePmmw== + +"@nx/nx-freebsd-x64@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.2.tgz#c7c9ae6e331ca97571f6a048c0f69aa6c5fd2479" + integrity sha512-joZxFbgJfkHkB9uMIJr73Gpnm9pnpvr0XKGbWC409/d2x7q1qK77tKdyhGm+A3+kaZFwstNVPmCUtUwJYyU6LA== + +"@nx/nx-linux-arm-gnueabihf@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.2.tgz#a6ae89115efb7601baa4c3421649ee785d6aa3a9" + integrity sha512-98O/qsxn4vIMPY/FyzvmVrl7C5yFhCUVk0/4PF+PA2SvtQ051L1eMRY6bq/lb69qfN6szJPZ41PG5mPx0NeLZw== + +"@nx/nx-linux-arm64-gnu@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.2.tgz#e9a4676d830783ecad5d5bfaf7bf2579c519321c" + integrity sha512-h6a+HxwfSpxsi4KpxGgPh9GDBmD2E+XqGCdfYpobabxqEBvlnIlJyuDhlRR06cTWpuNXHpRdrVogmV6m/YbtDg== + +"@nx/nx-linux-arm64-musl@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.2.tgz#621657dc85c1cb042102f4ed4976cc5823fccea1" + integrity sha512-4Ev+jM0VAxDHV/dFgMXjQTCXS4I8W4oMe7FSkXpG8RUn6JK659DC8ExIDPoGIh+Cyqq6r6mw1CSia+ciQWICWQ== + +"@nx/nx-linux-x64-gnu@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.2.tgz#2b7b893a931b26a8688304d5352bdef0a2431194" + integrity sha512-nR0ev+wxu+nQYRd7bhqggOxK7UfkV6h+Ko1mumUFyrM5GvPpz/ELhjJFSnMcOkOMcvH0b6G5uTBJvN1XWCkbmg== + +"@nx/nx-linux-x64-musl@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.2.tgz#4188df5b222d6f42fff1e436d494a46af1d30b0b" + integrity sha512-ost41l5yc2aq2Gc9bMMpaPi/jkXqbXEMEPHrxWKuKmaek3K2zbVDQzvBBNcQKxf/mlCsrqN4QO0mKYSRRqag5A== + +"@nx/nx-win32-arm64-msvc@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.2.tgz#6d2122a1c827c100e89698f4a878410833911748" + integrity sha512-0SEOqT/daBG5WtM9vOGilrYaAuf1tiALdrFavY62+/arXYxXemUKmRI5qoKDTnvoLMBGkJs6kxhMO5b7aUXIvQ== + +"@nx/nx-win32-x64-msvc@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.2.tgz#60f4c381ad62369ff7ede9336d92262352514bc1" + integrity sha512-iIsY+tVqes/NOqTbJmggL9Juie/iaDYlWgXA9IUv88FE9thqWKhVj4/tCcPjsOwzD+1SVna3YISEEFsx5UV4ew== + +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== -"@octokit/core@^4.1.0": - version "4.1.0" - resolved "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz" - integrity sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ== - dependencies: - "@octokit/auth-token" "^3.0.0" - "@octokit/graphql" "^5.0.0" - "@octokit/request" "^6.0.0" - "@octokit/request-error" "^3.0.0" - "@octokit/types" "^8.0.0" +"@octokit/core@^5.0.2": + version "5.2.1" + resolved "https://registry.npmjs.org/@octokit/core/-/core-5.2.1.tgz#58c21a5f689ee81e0b883b5aa77573a7ff1b4ea1" + integrity sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.1.0" + "@octokit/request" "^8.4.1" + "@octokit/request-error" "^5.1.1" + "@octokit/types" "^13.0.0" before-after-hook "^2.2.0" universal-user-agent "^6.0.0" -"@octokit/endpoint@^7.0.0": - version "7.0.3" - resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz" - integrity sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw== +"@octokit/endpoint@^9.0.6": + version "9.0.6" + resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz#114d912108fe692d8b139cfe7fc0846dfd11b6c0" + integrity sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw== dependencies: - "@octokit/types" "^8.0.0" - is-plain-object "^5.0.0" + "@octokit/types" "^13.1.0" universal-user-agent "^6.0.0" -"@octokit/graphql@^5.0.0": - version "5.0.4" - resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz" - integrity sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A== +"@octokit/graphql@^7.1.0": + version "7.1.1" + resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz#79d9f3d0c96a8fd13d64186fe5c33606d48b79cc" + integrity sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g== dependencies: - "@octokit/request" "^6.0.0" - "@octokit/types" "^8.0.0" + "@octokit/request" "^8.4.1" + "@octokit/types" "^13.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^14.0.0": - version "14.0.0" - resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz" - integrity sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw== +"@octokit/openapi-types@^24.2.0": + version "24.2.0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz#3d55c32eac0d38da1a7083a9c3b0cca77924f7d3" + integrity sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg== -"@octokit/plugin-enterprise-rest@^6.0.1": +"@octokit/plugin-enterprise-rest@6.0.1": version "6.0.1" - resolved "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz" + resolved "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== -"@octokit/plugin-paginate-rest@^5.0.0": - version "5.0.1" - resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz" - integrity sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw== +"@octokit/plugin-paginate-rest@11.4.4-cjs.2": + version "11.4.4-cjs.2" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz#979a10d577bce7a393e8e65953887e42b0a05000" + integrity sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/types" "^13.7.0" -"@octokit/plugin-request-log@^1.0.4": - version "1.0.4" - resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz" - integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== +"@octokit/plugin-request-log@^4.0.0": + version "4.0.1" + resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958" + integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== -"@octokit/plugin-rest-endpoint-methods@^6.7.0": - version "6.7.0" - resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz" - integrity sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw== +"@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1": + version "13.3.2-cjs.1" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz#d0a142ff41d8f7892b6ccef45979049f51ecaa8d" + integrity sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ== dependencies: - "@octokit/types" "^8.0.0" - deprecation "^2.3.1" + "@octokit/types" "^13.8.0" -"@octokit/request-error@^3.0.0": - version "3.0.2" - resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz" - integrity sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg== +"@octokit/request-error@^5.1.1": + version "5.1.1" + resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz#b9218f9c1166e68bb4d0c89b638edc62c9334805" + integrity sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/types" "^13.1.0" deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^6.0.0": - version "6.2.2" - resolved "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz" - integrity sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw== - dependencies: - "@octokit/endpoint" "^7.0.0" - "@octokit/request-error" "^3.0.0" - "@octokit/types" "^8.0.0" - is-plain-object "^5.0.0" - node-fetch "^2.6.7" - universal-user-agent "^6.0.0" - -"@octokit/rest@^19.0.3": - version "19.0.5" - resolved "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz" - integrity sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow== +"@octokit/request@^8.4.1": + version "8.4.1" + resolved "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz#715a015ccf993087977ea4365c44791fc4572486" + integrity sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw== dependencies: - "@octokit/core" "^4.1.0" - "@octokit/plugin-paginate-rest" "^5.0.0" - "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "^6.7.0" - -"@octokit/types@^8.0.0": - version "8.1.0" - resolved "https://registry.npmjs.org/@octokit/types/-/types-8.1.0.tgz" - integrity sha512-N4nLjzkiWBqVQqljTTsCrbvHGoWdWfcCeZjbHdggw7a9HbJMnxbK8A+UWdqwR4out30JarlSa3eqKyVK0n5aBg== - dependencies: - "@octokit/openapi-types" "^14.0.0" + "@octokit/endpoint" "^9.0.6" + "@octokit/request-error" "^5.1.1" + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" -"@parcel/watcher@2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz" - integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== +"@octokit/rest@20.1.2": + version "20.1.2" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz#1d74d0c72ade0d64f7c5416448d5c885f5e3ccc4" + integrity sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA== dependencies: - node-addon-api "^3.2.1" - node-gyp-build "^4.3.0" + "@octokit/core" "^5.0.2" + "@octokit/plugin-paginate-rest" "11.4.4-cjs.2" + "@octokit/plugin-request-log" "^4.0.0" + "@octokit/plugin-rest-endpoint-methods" "13.3.2-cjs.1" -"@phenomnomnominal/tsquery@4.1.1": - version "4.1.1" - resolved "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz" - integrity sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ== +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.7.0", "@octokit/types@^13.8.0": + version "13.10.0" + resolved "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz#3e7c6b19c0236c270656e4ea666148c2b51fd1a3" + integrity sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA== dependencies: - esquery "^1.0.1" + "@octokit/openapi-types" "^24.2.0" "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -1721,254 +1307,433 @@ write-file-atomic "^5.0.1" write-yaml-file "^5.0.0" -"@rollup/rollup-android-arm-eabi@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz#e3c9cc13f144ba033df4d2c3130a214dc8e3473e" - integrity sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw== - -"@rollup/rollup-android-arm64@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz#0474250fcb5871aca952e249a0c3270fc4310b55" - integrity sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA== - -"@rollup/rollup-darwin-arm64@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz#77c29b4f9c430c1624f1a6835f2a7e82be3d16f2" - integrity sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q== - -"@rollup/rollup-darwin-x64@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz#7d87711f641a458868758cbf110fb32eabd6a25a" - integrity sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ== - -"@rollup/rollup-freebsd-arm64@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz#662f808d2780e4e91021ac9ee7ed800862bb9a57" - integrity sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw== - -"@rollup/rollup-freebsd-x64@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz#71e5a7bcfcbe51d8b65d158675acec1307edea79" - integrity sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA== - -"@rollup/rollup-linux-arm-gnueabihf@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz#08f67fcec61ee18f8b33b3f403a834ab8f3aa75d" - integrity sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w== - -"@rollup/rollup-linux-arm-musleabihf@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz#2e1ad4607f86475b1731556359c6070eb8f4b109" - integrity sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A== - -"@rollup/rollup-linux-arm64-gnu@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz#c65d559dcb0d3dabea500cf7b8215959ae6cccf8" - integrity sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg== - -"@rollup/rollup-linux-arm64-musl@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz#6739f7eb33e20466bb88748519c98ce8dee23922" - integrity sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA== - -"@rollup/rollup-linux-powerpc64le-gnu@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz#8d9fe9471c256e55278cb1f7b1c977cd8fe6df20" - integrity sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ== - -"@rollup/rollup-linux-riscv64-gnu@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz#9a467f7ad5b61c9d66b24e79a3c57cb755d02c35" - integrity sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw== - -"@rollup/rollup-linux-s390x-gnu@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz#efaddf22df27b87a267a731fbeb9539e92cd4527" - integrity sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg== - -"@rollup/rollup-linux-x64-gnu@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz#a959eccb04b07fd1591d7ff745a6865faa7042cd" - integrity sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q== - -"@rollup/rollup-linux-x64-musl@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz#927764f1da1f2dd50943716dec93796d10cb6e99" - integrity sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw== - -"@rollup/rollup-win32-arm64-msvc@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz#030b6cc607d845da23dced624e47fb45de105840" - integrity sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A== - -"@rollup/rollup-win32-ia32-msvc@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz#3457a3f44a84f51d8097c3606429e01f0d2d0ec2" - integrity sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ== - -"@rollup/rollup-win32-x64-msvc@4.27.4": - version "4.27.4" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz#67d516613c9f2fe42e2d8b78e252d0003179d92c" - integrity sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug== - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@shikijs/core@1.23.1", "@shikijs/core@^1.22.2": - version "1.23.1" - resolved "https://registry.npmjs.org/@shikijs/core/-/core-1.23.1.tgz#911473e672e4f2d15ca36b28b28179c0959aa7af" - integrity sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA== - dependencies: - "@shikijs/engine-javascript" "1.23.1" - "@shikijs/engine-oniguruma" "1.23.1" - "@shikijs/types" "1.23.1" - "@shikijs/vscode-textmate" "^9.3.0" +"@rollup/rollup-android-arm-eabi@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.43.0.tgz#9241b59af721beb7e3587a56c6c245d6c465753d" + integrity sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw== + +"@rollup/rollup-android-arm-eabi@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz#7d41dc45adcfcb272504ebcea9c8a5b2c659e963" + integrity sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag== + +"@rollup/rollup-android-arm64@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.43.0.tgz#f70ee53ba991fdd65c277b0716c559736d490a58" + integrity sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA== + +"@rollup/rollup-android-arm64@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz#6c708fae2c9755e994c42d56c34a94cb77020650" + integrity sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw== + +"@rollup/rollup-darwin-arm64@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.43.0.tgz#9f59000e817cf5760d87515ce899f8b93fe8756a" + integrity sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A== + +"@rollup/rollup-darwin-arm64@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz#85ccf92ab114e434c83037a175923a525635cbb4" + integrity sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw== + +"@rollup/rollup-darwin-x64@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.43.0.tgz#c92aebd02725ae1b88bdce40f08f7823e8055c78" + integrity sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg== + +"@rollup/rollup-darwin-x64@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz#0af089f3d658d05573208dabb3a392b44d7f4630" + integrity sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw== + +"@rollup/rollup-freebsd-arm64@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.43.0.tgz#b128dbe7b353922ddd729a4fc4e408ddcbf338b5" + integrity sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ== + +"@rollup/rollup-freebsd-arm64@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz#46c22a16d18180e99686647543335567221caa9c" + integrity sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA== + +"@rollup/rollup-freebsd-x64@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.43.0.tgz#88297a0ddfadddd61d7d9b73eb42b3f227301d30" + integrity sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg== + +"@rollup/rollup-freebsd-x64@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz#819ffef2f81891c266456952962a13110c8e28b5" + integrity sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.43.0.tgz#a59afc092523ebe43d3899f33da9cdd2ec01fb87" + integrity sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw== + +"@rollup/rollup-linux-arm-gnueabihf@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz#7fe283c14793e607e653a3214b09f8973f08262a" + integrity sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg== + +"@rollup/rollup-linux-arm-musleabihf@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.43.0.tgz#3095c1327b794bd187d03e372e633717fb69b4c0" + integrity sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw== + +"@rollup/rollup-linux-arm-musleabihf@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz#066e92eb22ea30560414ec800a6d119ba0b435ac" + integrity sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw== + +"@rollup/rollup-linux-arm64-gnu@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.43.0.tgz#e43bb77df3a6de85312e991d1e3ad352d1abb00d" + integrity sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA== + +"@rollup/rollup-linux-arm64-gnu@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz#480d518ea99a8d97b2a174c46cd55164f138cc37" + integrity sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw== + +"@rollup/rollup-linux-arm64-musl@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.43.0.tgz#34873a437bcd87618f702dc66f0cbce170aebf9f" + integrity sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA== + +"@rollup/rollup-linux-arm64-musl@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz#ed7db3b8999b60dd20009ddf71c95f3af49423c8" + integrity sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w== + +"@rollup/rollup-linux-loongarch64-gnu@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.43.0.tgz#224ff524349e365baa56f1f512822548c2d76910" + integrity sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg== + +"@rollup/rollup-linux-loongarch64-gnu@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz#16a6927a35f5dbc505ff874a4e1459610c0c6f46" + integrity sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q== + +"@rollup/rollup-linux-powerpc64le-gnu@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.43.0.tgz#43c3c053b26ace18a1d3dab204596a466c1b0e34" + integrity sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw== + +"@rollup/rollup-linux-ppc64-gnu@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz#a006700469be0041846c45b494c35754e6a04eea" + integrity sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q== + +"@rollup/rollup-linux-riscv64-gnu@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.43.0.tgz#e7df825d71daefa7037605015455aa58be43cd7a" + integrity sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g== + +"@rollup/rollup-linux-riscv64-gnu@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz#0fcc45b2ec8a0e54218ca48849ea6d596f53649c" + integrity sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ== + +"@rollup/rollup-linux-riscv64-musl@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.43.0.tgz#d76ad93a7f4c0b2855a024d8d859196acf38acf5" + integrity sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q== + +"@rollup/rollup-linux-riscv64-musl@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz#d6e617eec9fe6f5859ee13fad435a16c42b469f2" + integrity sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg== + +"@rollup/rollup-linux-s390x-gnu@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.43.0.tgz#0852608843d05852af3f447bf43bb63d80d62b6a" + integrity sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw== + +"@rollup/rollup-linux-s390x-gnu@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz#b147760d63c6f35b4b18e6a25a2a760dd3ea0c05" + integrity sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg== + +"@rollup/rollup-linux-x64-gnu@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.43.0.tgz#d16a57f86357a4e697142bee244afed59b24e6c5" + integrity sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ== + +"@rollup/rollup-linux-x64-gnu@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz#fc0be1da374f85e7e85dccaf1ff12d7cfc9fbe3d" + integrity sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA== + +"@rollup/rollup-linux-x64-musl@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.43.0.tgz#51cbc8b1eb46ebc0e284725418b6fbf48686e4e2" + integrity sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ== + +"@rollup/rollup-linux-x64-musl@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz#54c79932e0f9a3c992b034c82325be3bcde0d067" + integrity sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg== + +"@rollup/rollup-openharmony-arm64@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz#fc48e74d413623ac02c1d521bec3e5e784488fdc" + integrity sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA== + +"@rollup/rollup-win32-arm64-msvc@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.43.0.tgz#d6d84aace2b211119bf0ab1c586e29d01e32aa01" + integrity sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw== + +"@rollup/rollup-win32-arm64-msvc@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz#8ce3d1181644406362cf1e62c90e88ab083e02bb" + integrity sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ== + +"@rollup/rollup-win32-ia32-msvc@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.43.0.tgz#4af33168de2f65b97a8f36bd1d8d21cea34d3ccb" + integrity sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw== + +"@rollup/rollup-win32-ia32-msvc@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz#dd2dfc896eac4b2689d55f01c6d51c249263f805" + integrity sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A== + +"@rollup/rollup-win32-x64-msvc@4.43.0": + version "4.43.0" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz#42a88207659e404e8ffa655cae763cbad94906ab" + integrity sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw== + +"@rollup/rollup-win32-x64-msvc@4.50.1": + version "4.50.1" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz#13f758c97b9fbbac56b6928547a3ff384e7cfb3e" + integrity sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA== + +"@shikijs/core@2.5.0", "@shikijs/core@^2.1.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz#e14d33961dfa3141393d4a76fc8923d0d1c4b62f" + integrity sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg== + dependencies: + "@shikijs/engine-javascript" "2.5.0" + "@shikijs/engine-oniguruma" "2.5.0" + "@shikijs/types" "2.5.0" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" - hast-util-to-html "^9.0.3" + hast-util-to-html "^9.0.4" + +"@shikijs/engine-javascript@2.5.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz#e045c6ecfbda6c99137547b0a482e0b87f1053fc" + integrity sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w== + dependencies: + "@shikijs/types" "2.5.0" + "@shikijs/vscode-textmate" "^10.0.2" + oniguruma-to-es "^3.1.0" -"@shikijs/engine-javascript@1.23.1": - version "1.23.1" - resolved "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.23.1.tgz#0f634bea22cb14f471835b7b5f1da66bc34bd359" - integrity sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg== +"@shikijs/engine-oniguruma@2.5.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz#230de5693cc1da6c9d59c7ad83593c2027274817" + integrity sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw== dependencies: - "@shikijs/types" "1.23.1" - "@shikijs/vscode-textmate" "^9.3.0" - oniguruma-to-es "0.4.1" + "@shikijs/types" "2.5.0" + "@shikijs/vscode-textmate" "^10.0.2" -"@shikijs/engine-oniguruma@1.23.1": - version "1.23.1" - resolved "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.23.1.tgz#c6c34c9152cf90c1ee75fcdbd124253c8ad0635f" - integrity sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ== +"@shikijs/langs@2.5.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz#97ab50c495922cc1ca06e192985b28dc73de5d50" + integrity sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w== + dependencies: + "@shikijs/types" "2.5.0" + +"@shikijs/themes@2.5.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz#8c6aecf73f5455681c8bec15797cf678162896cb" + integrity sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw== dependencies: - "@shikijs/types" "1.23.1" - "@shikijs/vscode-textmate" "^9.3.0" + "@shikijs/types" "2.5.0" -"@shikijs/transformers@^1.22.2": - version "1.23.1" - resolved "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.23.1.tgz#44fe7bef7064da9e5d79df73c6a1d48cc6d75072" - integrity sha512-yQ2Cn0M9i46p30KwbyIzLvKDk+dQNU+lj88RGO0XEj54Hn4Cof1bZoDb9xBRWxFE4R8nmK63w7oHnJwvOtt0NQ== +"@shikijs/transformers@^2.1.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz#190c84786ff06c417580ab79177338a947168c55" + integrity sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg== dependencies: - shiki "1.23.1" + "@shikijs/core" "2.5.0" + "@shikijs/types" "2.5.0" -"@shikijs/types@1.23.1", "@shikijs/types@^1.22.2": - version "1.23.1" - resolved "https://registry.npmjs.org/@shikijs/types/-/types-1.23.1.tgz#2386d49258be03e7b40fea1f28fda952739ad93d" - integrity sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g== +"@shikijs/types@2.5.0", "@shikijs/types@^2.1.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz#e949c7384802703a48b9d6425dd41673c164df69" + integrity sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw== dependencies: - "@shikijs/vscode-textmate" "^9.3.0" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" -"@shikijs/vscode-textmate@^9.3.0": - version "9.3.0" - resolved "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz#b2f1776e488c1d6c2b6cd129bab62f71bbc9c7ab" - integrity sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA== +"@shikijs/vscode-textmate@^10.0.2": + version "10.0.2" + resolved "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== + +"@sigstore/bundle@^2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz#ad4dbb95d665405fd4a7a02c8a073dbd01e4e95e" + integrity sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + +"@sigstore/core@^1.0.0", "@sigstore/core@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz#5583d8f7ffe599fa0a89f2bf289301a5af262380" + integrity sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg== + +"@sigstore/protobuf-specs@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz#7dd46d68b76c322873a2ef7581ed955af6f4dcde" + integrity sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ== + +"@sigstore/sign@^2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz#d3d01e56d03af96fd5c3a9b9897516b1233fc1c4" + integrity sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + make-fetch-happen "^13.0.1" + proc-log "^4.2.0" + promise-retry "^2.0.1" + +"@sigstore/tuf@^2.3.4": + version "2.3.4" + resolved "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz#da1d2a20144f3b87c0172920cbc8dcc7851ca27c" + integrity sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + tuf-js "^2.2.1" + +"@sigstore/verify@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz#c7e60241b432890dcb8bd8322427f6062ef819e1" + integrity sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.1.0" + "@sigstore/protobuf-specs" "^0.3.2" "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@swc/core-darwin-arm64@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.1.tgz#faaaab19b4a039ae67ef661c0144a6f20fe8a78e" - integrity sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q== - -"@swc/core-darwin-x64@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.1.tgz#754600f453abd24471c202d48836f1161d798f49" - integrity sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA== - -"@swc/core-linux-arm-gnueabihf@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.1.tgz#b0f43c482d0d1819b382a4eb4a0733ce2e386257" - integrity sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw== - -"@swc/core-linux-arm64-gnu@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.1.tgz#e02a9e22c25ba85ef00335742e549e06284cf33a" - integrity sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ== - -"@swc/core-linux-arm64-musl@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.1.tgz#3a0530af8f8bd3717f2f1bd8a2f5183fc58d4cf1" - integrity sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ== - -"@swc/core-linux-x64-gnu@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.1.tgz#5eb4d282b047a22896ab1d4627403be4c3e4fa6a" - integrity sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA== - -"@swc/core-linux-x64-musl@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.1.tgz#890f2eda3e67ccc6817cdd04eff91e6ad9e761c4" - integrity sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA== - -"@swc/core-win32-arm64-msvc@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.1.tgz#4ea7b2a2fab47f801d31ea8b001a141efaa5e6bf" - integrity sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ== - -"@swc/core-win32-ia32-msvc@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.1.tgz#729102669ccdb72e69884cce58e3686ac63d6f36" - integrity sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA== - -"@swc/core-win32-x64-msvc@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.1.tgz#7d665a7c69642861aed850ecb0cdf5d87197edda" - integrity sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA== +"@swc/core-darwin-arm64@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.2.tgz#654ea490dbcada542d74f234dcf7e8658a1e5772" + integrity sha512-44p7ivuLSGFJ15Vly4ivLJjg3ARo4879LtEBAabcHhSZygpmkP8eyjyWxrH3OxkY1eRZSIJe8yRZPFw4kPXFPw== + +"@swc/core-darwin-x64@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.13.2.tgz#46f56d4053867c3531166aaaafc02e1248aa5e15" + integrity sha512-Lb9EZi7X2XDAVmuUlBm2UvVAgSCbD3qKqDCxSI4jEOddzVOpNCnyZ/xEampdngUIyDDhhJLYU9duC+Mcsv5Y+A== + +"@swc/core-linux-arm-gnueabihf@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.2.tgz#724eb4f763b3e87db3d22c58a1d40e144db0d406" + integrity sha512-9TDe/92ee1x57x+0OqL1huG4BeljVx0nWW4QOOxp8CCK67Rpc/HHl2wciJ0Kl9Dxf2NvpNtkPvqj9+BUmM9WVA== + +"@swc/core-linux-arm64-gnu@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.2.tgz#d01a0a65838a0fd5035ae088ad351f8cfb7289e3" + integrity sha512-KJUSl56DBk7AWMAIEcU83zl5mg3vlQYhLELhjwRFkGFMvghQvdqQ3zFOYa4TexKA7noBZa3C8fb24rI5sw9Exg== + +"@swc/core-linux-arm64-musl@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.2.tgz#a2812e3728970a3918502ab3adc337b45761bdd4" + integrity sha512-teU27iG1oyWpNh9CzcGQ48ClDRt/RCem7mYO7ehd2FY102UeTws2+OzLESS1TS1tEZipq/5xwx3FzbVgiolCiQ== + +"@swc/core-linux-x64-gnu@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.2.tgz#91553462484d8135703888c55d0d02dce2a8a7c5" + integrity sha512-dRPsyPyqpLD0HMRCRpYALIh4kdOir8pPg4AhNQZLehKowigRd30RcLXGNVZcc31Ua8CiPI4QSgjOIxK+EQe4LQ== + +"@swc/core-linux-x64-musl@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.2.tgz#b8c8dc71eea56e56903dc3bfc5ca507199f469d1" + integrity sha512-CCxETW+KkYEQDqz1SYC15YIWYheqFC+PJVOW76Maa/8yu8Biw+HTAcblKf2isrlUtK8RvrQN94v3UXkC2NzCEw== + +"@swc/core-win32-arm64-msvc@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.2.tgz#2ac8ebdfc8ebaed404893879b239df2bad3601ef" + integrity sha512-Wv/QTA6PjyRLlmKcN6AmSI4jwSMRl0VTLGs57PHTqYRwwfwd7y4s2fIPJVBNbAlXd795dOEP6d/bGSQSyhOX3A== + +"@swc/core-win32-ia32-msvc@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.2.tgz#1e13ec7e8c2367b75e529dc8d47c2c42d5cd803f" + integrity sha512-PuCdtNynEkUNbUXX/wsyUC+t4mamIU5y00lT5vJcAvco3/r16Iaxl5UCzhXYaWZSNVZMzPp9qN8NlSL8M5pPxw== + +"@swc/core-win32-x64-msvc@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.2.tgz#8b8841f6676bc7f8c4a2ac44eba42e7be655e606" + integrity sha512-qlmMkFZJus8cYuBURx1a3YAG2G7IW44i+FEYV5/32ylKkzGNAr9tDJSA53XNnNXkAB5EXSPsOz7bn5C3JlEtdQ== "@swc/core@^1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@swc/core/-/core-1.10.1.tgz#16b3b8284bafb0ecabb253925796883971e5a761" - integrity sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w== + version "1.13.2" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.13.2.tgz#962b34dae61fa1ff604d20c1b9100a9277a16f83" + integrity sha512-YWqn+0IKXDhqVLKoac4v2tV6hJqB/wOh8/Br8zjqeqBkKa77Qb0Kw2i7LOFzjFNZbZaPH6AlMGlBwNrxaauaAg== dependencies: "@swc/counter" "^0.1.3" - "@swc/types" "^0.1.17" + "@swc/types" "^0.1.23" optionalDependencies: - "@swc/core-darwin-arm64" "1.10.1" - "@swc/core-darwin-x64" "1.10.1" - "@swc/core-linux-arm-gnueabihf" "1.10.1" - "@swc/core-linux-arm64-gnu" "1.10.1" - "@swc/core-linux-arm64-musl" "1.10.1" - "@swc/core-linux-x64-gnu" "1.10.1" - "@swc/core-linux-x64-musl" "1.10.1" - "@swc/core-win32-arm64-msvc" "1.10.1" - "@swc/core-win32-ia32-msvc" "1.10.1" - "@swc/core-win32-x64-msvc" "1.10.1" + "@swc/core-darwin-arm64" "1.13.2" + "@swc/core-darwin-x64" "1.13.2" + "@swc/core-linux-arm-gnueabihf" "1.13.2" + "@swc/core-linux-arm64-gnu" "1.13.2" + "@swc/core-linux-arm64-musl" "1.13.2" + "@swc/core-linux-x64-gnu" "1.13.2" + "@swc/core-linux-x64-musl" "1.13.2" + "@swc/core-win32-arm64-msvc" "1.13.2" + "@swc/core-win32-ia32-msvc" "1.13.2" + "@swc/core-win32-x64-msvc" "1.13.2" "@swc/counter@^0.1.3": version "0.1.3" resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/types@^0.1.17": - version "0.1.17" - resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz#bd1d94e73497f27341bf141abdf4c85230d41e7c" - integrity sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ== +"@swc/types@^0.1.23": + version "0.1.23" + resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz#7eabf88b9cfd929253859c562ae95982ee04b4e8" + integrity sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw== dependencies: "@swc/counter" "^0.1.3" -"@tootallnate/once@2": +"@tufjs/canonical-json@2.0.0": version "2.0.0" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + resolved "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a" + integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== + +"@tufjs/models@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz#e429714e753b6c2469af3212e7f320a6973c2812" + integrity sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg== + dependencies: + "@tufjs/canonical-json" "2.0.0" + minimatch "^9.0.4" + +"@tybys/wasm-util@^0.9.0": + version "0.9.0" + resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355" + integrity sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== + dependencies: + tslib "^2.4.0" + +"@types/chai@^5.2.2": + version "5.2.2" + resolved "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" + integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== + dependencies: + "@types/deep-eql" "*" "@types/conventional-commits-parser@^5.0.0": version "5.0.1" @@ -1977,14 +1742,24 @@ dependencies: "@types/node" "*" -"@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6": - version "1.0.6" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/estree@1.0.7", "@types/estree@^1.0.0": + version "1.0.7" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + +"@types/estree@1.0.8", "@types/estree@^1.0.6": + version "1.0.8" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/fs-extra@^11.0.3": version "11.0.4" - resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz" + resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz#e16a863bb8843fba8c5004362b5a73e17becca45" integrity sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ== dependencies: "@types/jsonfile" "*" @@ -1992,14 +1767,14 @@ "@types/git-raw-commits@^2.0.3": version "2.0.4" - resolved "https://registry.npmjs.org/@types/git-raw-commits/-/git-raw-commits-2.0.4.tgz" + resolved "https://registry.npmjs.org/@types/git-raw-commits/-/git-raw-commits-2.0.4.tgz#29a77a82043b7baaba823f8b34ab10191df138e9" integrity sha512-PYmTK156j6TilbwtnO2JErH4TCC1izpgP3kRE3KUX35bjBOD2A+syCGeercqHXBcM6wL+DU0WbJB2Gz8fPR+8A== dependencies: "@types/node" "*" "@types/glob@^8.1.0": version "8.1.0" - resolved "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz" + resolved "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== dependencies: "@types/minimatch" "^5.1.2" @@ -2007,52 +1782,28 @@ "@types/hast@^3.0.0", "@types/hast@^3.0.4": version "3.0.4" - resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/inquirer@^9.0.7": - version "9.0.7" - resolved "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz#61bb8d0e42f038b9a1738b08fba7fa98ad9b4b24" - integrity sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g== - dependencies: - "@types/through" "*" - rxjs "^7.2.0" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.6" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: - "@types/istanbul-lib-coverage" "*" + "@types/unist" "*" -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== +"@types/inquirer@^9.0.7": + version "9.0.8" + resolved "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.8.tgz#09d39cc6435ab7b0597f527ff5e2d6ccdf6b14be" + integrity sha512-CgPD5kFGWsb8HJ5K7rfWlifao87m4ph8uioU7OTncJevmE/VLIqAAjfQtko578JZg7/f69K4FgqYym3gNr7DeA== dependencies: - "@types/istanbul-lib-report" "*" + "@types/through" "*" + rxjs "^7.2.0" "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - "@types/jsonfile@*": - version "6.1.1" - resolved "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz" - integrity sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png== + version "6.1.4" + resolved "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz#614afec1a1164e7d670b4a7ad64df3e7beb7b702" + integrity sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ== dependencies: "@types/node" "*" @@ -2063,78 +1814,78 @@ "@types/lodash.camelcase@^4.3.8": version "4.3.9" - resolved "https://registry.npmjs.org/@types/lodash.camelcase/-/lodash.camelcase-4.3.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.camelcase/-/lodash.camelcase-4.3.9.tgz#da7b65013d6914fecb8759d5220a6ca9b658ee23" integrity sha512-ys9/hGBfsKxzmFI8hckII40V0ASQ83UM2pxfQRghHAwekhH4/jWtjz/3/9YDy7ZpUd/H0k2STSqmPR28dnj7Zg== dependencies: "@types/lodash" "*" "@types/lodash.isfunction@^3.0.8": version "3.0.9" - resolved "https://registry.npmjs.org/@types/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#527e51ab6638b38c65a03ec218232b1a787cc9bc" integrity sha512-BLaDvlY09jnPND1wxlGXPrPl2CN4M7qGRah7Tb/rtB1vnLyZmtcw3FRPSUkDsd5n4e+2E5BBrr0ICfYR+S4hZQ== dependencies: "@types/lodash" "*" "@types/lodash.isplainobject@^4.0.8": version "4.0.9" - resolved "https://registry.npmjs.org/@types/lodash.isplainobject/-/lodash.isplainobject-4.0.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.isplainobject/-/lodash.isplainobject-4.0.9.tgz#3e0159c1598d96af2372151ed65f2792b61787e4" integrity sha512-QC8nKcap5hRrbtIaPRjUMlcXXnLeayqQZPSaWJDx3xeuN17+2PW5wkmEJ4+lZgNnQRlSPzxjTYKCfV1uTnPaEg== dependencies: "@types/lodash" "*" "@types/lodash.kebabcase@^4.1.8": version "4.1.9" - resolved "https://registry.npmjs.org/@types/lodash.kebabcase/-/lodash.kebabcase-4.1.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.kebabcase/-/lodash.kebabcase-4.1.9.tgz#48d3df753b89499e75eba5e017979b560d69df85" integrity sha512-kPrrmcVOhSsjAVRovN0lRfrbuidfg0wYsrQa5IYuoQO1fpHHGSme66oyiYA/5eQPVl8Z95OA3HG0+d2SvYC85w== dependencies: "@types/lodash" "*" "@types/lodash.merge@^4.6.8": version "4.6.9" - resolved "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.9.tgz#93e94796997ed9a3ebe9ccf071ccaec4c6bc8fb8" integrity sha512-23sHDPmzd59kUgWyKGiOMO2Qb9YtqRO/x4IhkgNUiPQ1+5MUVqi6bCZeq9nBJ17msjIMbEIO5u+XW4Kz6aGUhQ== dependencies: "@types/lodash" "*" "@types/lodash.mergewith@^4.6.8": version "4.6.9" - resolved "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.9.tgz#7093028a36de3cae4495d03b9d92c351cab1f8bf" integrity sha512-fgkoCAOF47K7sxrQ7Mlud2TH023itugZs2bUg8h/KzT+BnZNrR2jAOmaokbLunHNnobXVWOezAeNn/lZqwxkcw== dependencies: "@types/lodash" "*" "@types/lodash.snakecase@^4.1.8": version "4.1.9" - resolved "https://registry.npmjs.org/@types/lodash.snakecase/-/lodash.snakecase-4.1.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.snakecase/-/lodash.snakecase-4.1.9.tgz#2d2b3313a44500cb6d8a1c598e0353778d4420d2" integrity sha512-emBZJUiNlo+QPXr1junMKXwzHJK9zbFvTVdyAoorFcm1YRsbzkZCYPTVMM9AW+dlnA6utG7vpfvOs8alxv/TMw== dependencies: "@types/lodash" "*" "@types/lodash.startcase@^4.4.8": version "4.4.9" - resolved "https://registry.npmjs.org/@types/lodash.startcase/-/lodash.startcase-4.4.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.startcase/-/lodash.startcase-4.4.9.tgz#fba0daa4bb5f279e05628c03193ae1d5e32c438d" integrity sha512-C0M4DlN1pnn2vEEhLHkTHxiRZ+3GlTegpoAEHHGXnuJkSOXyJMHGiSc+SLRzBlFZWHsBkixe6FqvEAEU04g14g== dependencies: "@types/lodash" "*" "@types/lodash.uniq@^4.5.8": version "4.5.9" - resolved "https://registry.npmjs.org/@types/lodash.uniq/-/lodash.uniq-4.5.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.uniq/-/lodash.uniq-4.5.9.tgz#9a5390422c003ca6d0219207ed6c9c38e37a783f" integrity sha512-2Vd5avnDMNLbDSnUwwgwExKXvX9W3CN72rodT+ikGqGHXn7gVK6BM6Z+kHonbpGgCI2BzM+QDMHrkgKoofOi6A== dependencies: "@types/lodash" "*" "@types/lodash.upperfirst@^4.3.8": version "4.3.9" - resolved "https://registry.npmjs.org/@types/lodash.upperfirst/-/lodash.upperfirst-4.3.9.tgz" + resolved "https://registry.npmjs.org/@types/lodash.upperfirst/-/lodash.upperfirst-4.3.9.tgz#66e150885a67866ed8bc4331c8c305ab682a198c" integrity sha512-bYhT1QEsk9/ggrFjK86Pb5bnKJgTBbpVA77Ygbb1aW1oiWJNGRbVjSlQ9We/ihB9vVpX5WqDJvbISXlukGR+dQ== dependencies: "@types/lodash" "*" "@types/lodash@*": - version "4.14.188" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.188.tgz" - integrity sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w== + version "4.17.16" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz#94ae78fab4a38d73086e962d0b65c30d816bfb0a" + integrity sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g== "@types/markdown-it@^14.1.2": version "14.1.2" @@ -2158,57 +1909,47 @@ "@types/minimatch@^3.0.3": version "3.0.5" - resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/minimatch@^5.1.2": version "5.1.2" - resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0", "@types/minimist@^1.2.4": version "1.2.5" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/node@*": - version "22.10.1" - resolved "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" - integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== + version "24.0.7" + resolved "https://registry.npmjs.org/@types/node/-/node-24.0.7.tgz#ee580f7850c7eabaeef61ef96b8d8c04fdf94f53" + integrity sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw== dependencies: - undici-types "~6.20.0" + undici-types "~7.8.0" "@types/node@^18.19.17": - version "18.19.68" - resolved "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz#f4f10d9927a7eaf3568c46a6d739cc0967ccb701" - integrity sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw== + version "18.19.120" + resolved "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz#07b3bd73875956d5281fa27e6d77a66415f7d455" + integrity sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA== dependencies: undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz" - integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== - -"@types/parse-json@^4.0.0": - version "4.0.1" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz" - integrity sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng== + version "2.4.4" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/require-from-string@^1.2.3": version "1.2.3" - resolved "https://registry.npmjs.org/@types/require-from-string/-/require-from-string-1.2.3.tgz" + resolved "https://registry.npmjs.org/@types/require-from-string/-/require-from-string-1.2.3.tgz#454ffa447f6556d7641d86684407d7b62e4430bd" integrity sha512-kxLU5xvefySGpp1Z7VCt4m5AhQJUZ8HjW8ADdeS7GieqFPHLAde007fd9bxeXEsFXyaA0LeWIoQXyXP17mGpIg== "@types/semver@^7.5.7": - version "7.5.8" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + version "7.7.0" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e" + integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== "@types/tar-fs@^2.0.4": version "2.0.4" @@ -2220,21 +1961,21 @@ "@types/tar-stream@*": version "3.1.3" - resolved "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-3.1.3.tgz" + resolved "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-3.1.3.tgz#f61427229691eda1b7d5719f34acdc4fc8a558ce" integrity sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ== dependencies: "@types/node" "*" "@types/through@*": - version "0.0.32" - resolved "https://registry.npmjs.org/@types/through/-/through-0.0.32.tgz" - integrity sha512-7XsfXIsjdfJM2wFDRAtEWp3zb2aVPk5QeyZxGlVK57q4u26DczMHhJmlhr0Jqv0THwxam/L8REXkj8M2I/lcvw== + version "0.0.33" + resolved "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz#14ebf599320e1c7851e7d598149af183c6b9ea56" + integrity sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ== dependencies: "@types/node" "*" "@types/tmp@^0.2.5": version "0.2.6" - resolved "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz" + resolved "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz#d785ee90c52d7cc020e249c948c36f7b32d1e217" integrity sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA== "@types/unist@*", "@types/unist@^3.0.0": @@ -2259,111 +2000,284 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== - dependencies: - "@types/yargs-parser" "*" - "@typescript-eslint/eslint-plugin@^8.18.0": - version "8.18.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz#992e5ac1553ce20d0d46aa6eccd79dc36dedc805" - integrity sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ== + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz#6e5220d16f2691ab6d983c1737dd5b36e17641b7" + integrity sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.18.1" - "@typescript-eslint/type-utils" "8.18.1" - "@typescript-eslint/utils" "8.18.1" - "@typescript-eslint/visitor-keys" "8.18.1" + "@typescript-eslint/scope-manager" "8.38.0" + "@typescript-eslint/type-utils" "8.38.0" + "@typescript-eslint/utils" "8.38.0" + "@typescript-eslint/visitor-keys" "8.38.0" graphemer "^1.4.0" - ignore "^5.3.1" + ignore "^7.0.0" natural-compare "^1.4.0" - ts-api-utils "^1.3.0" + ts-api-utils "^2.1.0" "@typescript-eslint/parser@^8.18.0": - version "8.18.1" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz#c258bae062778b7696793bc492249027a39dfb95" - integrity sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA== - dependencies: - "@typescript-eslint/scope-manager" "8.18.1" - "@typescript-eslint/types" "8.18.1" - "@typescript-eslint/typescript-estree" "8.18.1" - "@typescript-eslint/visitor-keys" "8.18.1" + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz#6723a5ea881e1777956b1045cba30be5ea838293" + integrity sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ== + dependencies: + "@typescript-eslint/scope-manager" "8.38.0" + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/typescript-estree" "8.38.0" + "@typescript-eslint/visitor-keys" "8.38.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.18.1": - version "8.18.1" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz#52cedc3a8178d7464a70beffed3203678648e55b" - integrity sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ== +"@typescript-eslint/project-service@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz#4900771f943163027fd7d2020a062892056b5e2f" + integrity sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg== dependencies: - "@typescript-eslint/types" "8.18.1" - "@typescript-eslint/visitor-keys" "8.18.1" + "@typescript-eslint/tsconfig-utils" "^8.38.0" + "@typescript-eslint/types" "^8.38.0" + debug "^4.3.4" -"@typescript-eslint/type-utils@8.18.1": - version "8.18.1" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz#10f41285475c0bdee452b79ff7223f0e43a7781e" - integrity sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ== +"@typescript-eslint/project-service@8.41.0": + version "8.41.0" + resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz#08ebf882d413a038926e73fda36e00c3dba84882" + integrity sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ== dependencies: - "@typescript-eslint/typescript-estree" "8.18.1" - "@typescript-eslint/utils" "8.18.1" + "@typescript-eslint/tsconfig-utils" "^8.41.0" + "@typescript-eslint/types" "^8.41.0" debug "^4.3.4" - ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.18.1": - version "8.18.1" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz#d7f4f94d0bba9ebd088de840266fcd45408a8fff" - integrity sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw== +"@typescript-eslint/scope-manager@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz#5a0efcb5c9cf6e4121b58f87972f567c69529226" + integrity sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ== + dependencies: + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/visitor-keys" "8.38.0" + +"@typescript-eslint/scope-manager@8.41.0": + version "8.41.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz#c8aba12129cb9cead1f1727f58e6a0fcebeecdb5" + integrity sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ== + dependencies: + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" + +"@typescript-eslint/tsconfig-utils@8.38.0", "@typescript-eslint/tsconfig-utils@^8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz#6de4ce224a779601a8df667db56527255c42c4d0" + integrity sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ== -"@typescript-eslint/typescript-estree@8.18.1": - version "8.18.1" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz#2a86cd64b211a742f78dfa7e6f4860413475367e" - integrity sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg== +"@typescript-eslint/tsconfig-utils@8.41.0", "@typescript-eslint/tsconfig-utils@^8.41.0": + version "8.41.0" + resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz#134dee36eb16cdd78095a20bca0516d10b5dda75" + integrity sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw== + +"@typescript-eslint/type-utils@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz#a56cd84765fa6ec135fe252b5db61e304403a85b" + integrity sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg== dependencies: - "@typescript-eslint/types" "8.18.1" - "@typescript-eslint/visitor-keys" "8.18.1" + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/typescript-estree" "8.38.0" + "@typescript-eslint/utils" "8.38.0" + debug "^4.3.4" + ts-api-utils "^2.1.0" + +"@typescript-eslint/types@8.38.0", "@typescript-eslint/types@^8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz#297351c994976b93c82ac0f0e206c8143aa82529" + integrity sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw== + +"@typescript-eslint/types@8.41.0", "@typescript-eslint/types@^8.41.0": + version "8.41.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz#9935afeaae65e535abcbcee95383fa649c64d16d" + integrity sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag== + +"@typescript-eslint/types@^8.35.0": + version "8.35.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.0.tgz#e60d062907930e30008d796de5c4170f02618a93" + integrity sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ== + +"@typescript-eslint/typescript-estree@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz#82262199eb6778bba28a319e25ad05b1158957df" + integrity sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ== + dependencies: + "@typescript-eslint/project-service" "8.38.0" + "@typescript-eslint/tsconfig-utils" "8.38.0" + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/visitor-keys" "8.38.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" minimatch "^9.0.4" semver "^7.6.0" - ts-api-utils "^1.3.0" + ts-api-utils "^2.1.0" -"@typescript-eslint/utils@8.18.1", "@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": - version "8.18.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz#c4199ea23fc823c736e2c96fd07b1f7235fa92d5" - integrity sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ== +"@typescript-eslint/typescript-estree@8.41.0": + version "8.41.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz#7c9cff8b4334ce96f14e9689692e8cf426ce4d59" + integrity sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ== dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.18.1" - "@typescript-eslint/types" "8.18.1" - "@typescript-eslint/typescript-estree" "8.18.1" + "@typescript-eslint/project-service" "8.41.0" + "@typescript-eslint/tsconfig-utils" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.1.0" -"@typescript-eslint/visitor-keys@8.18.1": - version "8.18.1" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz#344b4f6bc83f104f514676facf3129260df7610a" - integrity sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ== +"@typescript-eslint/utils@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz#5f10159899d30eb92ba70e642ca6f754bddbf15a" + integrity sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg== dependencies: - "@typescript-eslint/types" "8.18.1" - eslint-visitor-keys "^4.2.0" + "@eslint-community/eslint-utils" "^4.7.0" + "@typescript-eslint/scope-manager" "8.38.0" + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/typescript-estree" "8.38.0" -"@ungap/structured-clone@^1.0.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@typescript-eslint/utils@^8.24.1": + version "8.41.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz#17cb3b766c1626311004ea41ffd8c27eb226b953" + integrity sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A== + dependencies: + "@eslint-community/eslint-utils" "^4.7.0" + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" -"@vitejs/plugin-vue@^5.1.4": - version "5.2.0" - resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.0.tgz#994f3b4f12d3590c5a6895df4cbd270d9a6d5e17" - integrity sha512-7n7KdUEtx/7Yl7I/WVAMZ1bEb0eVvXF3ummWTeLcs/9gvo9pJhuLdouSXGjdZ/MKD1acf1I272+X0RMua4/R3g== +"@typescript-eslint/visitor-keys@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz#a9765a527b082cb8fc60fd8a16e47c7ad5b60ea5" + integrity sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g== + dependencies: + "@typescript-eslint/types" "8.38.0" + eslint-visitor-keys "^4.2.1" + +"@typescript-eslint/visitor-keys@8.41.0": + version "8.41.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz#16eb99b55d207f6688002a2cf425e039579aa9a9" + integrity sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg== + dependencies: + "@typescript-eslint/types" "8.41.0" + eslint-visitor-keys "^4.2.1" + +"@ungap/structured-clone@^1.0.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +"@unrs/resolver-binding-android-arm-eabi@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.2.tgz#6cb01dde20bef06397ffd4924f502596cb458851" + integrity sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A== + +"@unrs/resolver-binding-android-arm64@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.2.tgz#1672b533f01f98119095860683496def93929a2e" + integrity sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q== + +"@unrs/resolver-binding-darwin-arm64@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.2.tgz#dad66a21553b1ba4088c6eb922332846550bd9b2" + integrity sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ== + +"@unrs/resolver-binding-darwin-x64@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.2.tgz#bfaedca218078862f3d536d44269fed94a6158e2" + integrity sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ== + +"@unrs/resolver-binding-freebsd-x64@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.2.tgz#bdab0e754c45831522b16df0b6fe4b0ffde22628" + integrity sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw== + +"@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.2.tgz#2bac9c19599888d4ba4787b437b0273ac7a7a9f2" + integrity sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw== + +"@unrs/resolver-binding-linux-arm-musleabihf@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.2.tgz#49d27d5d63e5f26cf7b93a0731334b302b9b7fec" + integrity sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg== + +"@unrs/resolver-binding-linux-arm64-gnu@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.2.tgz#95ba5d1654a04b1049d944871e165d786e8da68f" + integrity sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA== + +"@unrs/resolver-binding-linux-arm64-musl@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.2.tgz#23f90a48b1d343189b1c20c89b694140e2d5a210" + integrity sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA== + +"@unrs/resolver-binding-linux-ppc64-gnu@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.2.tgz#076f2c2e95dbcd4824cc9929bc504151b402ac11" + integrity sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw== + +"@unrs/resolver-binding-linux-riscv64-gnu@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.2.tgz#f7de54d45df430c74bbd12794946a55805bed6dd" + integrity sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ== + +"@unrs/resolver-binding-linux-riscv64-musl@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.2.tgz#ad1fcdcf5f112d7432fcfe38269a084bdccad266" + integrity sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg== + +"@unrs/resolver-binding-linux-s390x-gnu@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.2.tgz#d914a4f12b9048e1a4de0040f64d73274104e301" + integrity sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ== + +"@unrs/resolver-binding-linux-x64-gnu@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.2.tgz#d8f8cddc42ae267ef45ed4b61ff72b9e22aa3b82" + integrity sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w== + +"@unrs/resolver-binding-linux-x64-musl@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.2.tgz#7bfce67acb51b3f4a7cff8383f46600f7b055a96" + integrity sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw== + +"@unrs/resolver-binding-wasm32-wasi@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.2.tgz#b133c9b6941aba54eea007ca2f27ff6ce917ae55" + integrity sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ== + dependencies: + "@napi-rs/wasm-runtime" "^0.2.11" + +"@unrs/resolver-binding-win32-arm64-msvc@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.2.tgz#5f95f590f06c1e9ba15b24292c956c21a6294b30" + integrity sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw== + +"@unrs/resolver-binding-win32-ia32-msvc@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.2.tgz#aac6595c6de6b26e5314372ab977b0f6a869c903" + integrity sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA== + +"@unrs/resolver-binding-win32-x64-msvc@1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.2.tgz#f755c5229f1401bbff7307d037c6e38fa169ad1d" + integrity sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg== + +"@vitejs/plugin-vue@^5.2.1": + version "5.2.1" + resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz#d1491f678ee3af899f7ae57d9c21dc52a65c7133" + integrity sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ== -"@vitest/coverage-istanbul@^2.1.8": - version "2.1.8" - resolved "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.1.8.tgz#72fed37ad79d256209a8fc8678039422a94eadc3" - integrity sha512-cSaCd8KcWWvgDwEJSXm0NEWZ1YTiJzjicKHy+zOEbUm0gjbbkz+qJf1p8q71uBzSlS7vdnZA8wRLeiwVE3fFTA== +"@vitest/coverage-istanbul@^3.0.0": + version "3.2.4" + resolved "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-3.2.4.tgz#a622802975935a2357d890b367fffd0dfd7a5a99" + integrity sha512-IDlpuFJiWU9rhcKLkpzj8mFu/lpe64gVgnV15ZOrYx1iFzxxrxCzbExiUEKtwwXRvEiEMUS6iZeYgnMxgbqbxQ== dependencies: "@istanbuljs/schema" "^0.1.3" - debug "^4.3.7" + debug "^4.4.1" istanbul-lib-coverage "^3.2.2" istanbul-lib-instrument "^6.0.3" istanbul-lib-report "^3.0.1" @@ -2371,122 +2285,131 @@ istanbul-reports "^3.1.7" magicast "^0.3.5" test-exclude "^7.0.1" - tinyrainbow "^1.2.0" + tinyrainbow "^2.0.0" + +"@vitest/eslint-plugin@^1.3.4": + version "1.3.4" + resolved "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.4.tgz#010f99ecfdcf349eb6d9c1f29c31ebcc8f5e18f8" + integrity sha512-EOg8d0jn3BAiKnR55WkFxmxfWA3nmzrbIIuOXyTe6A72duryNgyU+bdBEauA97Aab3ho9kLmAwgPX63Ckj4QEg== + dependencies: + "@typescript-eslint/utils" "^8.24.1" -"@vitest/expect@2.1.8": - version "2.1.8" - resolved "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz#13fad0e8d5a0bf0feb675dcf1d1f1a36a1773bc1" - integrity sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== +"@vitest/expect@3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" + integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== dependencies: - "@vitest/spy" "2.1.8" - "@vitest/utils" "2.1.8" - chai "^5.1.2" - tinyrainbow "^1.2.0" + "@types/chai" "^5.2.2" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + tinyrainbow "^2.0.0" -"@vitest/mocker@2.1.8": - version "2.1.8" - resolved "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz#51dec42ac244e949d20009249e033e274e323f73" - integrity sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== +"@vitest/mocker@3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz#4471c4efbd62db0d4fa203e65cc6b058a85cabd3" + integrity sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ== dependencies: - "@vitest/spy" "2.1.8" + "@vitest/spy" "3.2.4" estree-walker "^3.0.3" - magic-string "^0.30.12" + magic-string "^0.30.17" -"@vitest/pretty-format@2.1.8", "@vitest/pretty-format@^2.1.8": - version "2.1.8" - resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz#88f47726e5d0cf4ba873d50c135b02e4395e2bca" - integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== +"@vitest/pretty-format@3.2.4", "@vitest/pretty-format@^3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz#3c102f79e82b204a26c7a5921bf47d534919d3b4" + integrity sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== dependencies: - tinyrainbow "^1.2.0" + tinyrainbow "^2.0.0" -"@vitest/runner@2.1.8": - version "2.1.8" - resolved "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz#b0e2dd29ca49c25e9323ea2a45a5125d8729759f" - integrity sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== +"@vitest/runner@3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz#5ce0274f24a971f6500f6fc166d53d8382430766" + integrity sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ== dependencies: - "@vitest/utils" "2.1.8" - pathe "^1.1.2" + "@vitest/utils" "3.2.4" + pathe "^2.0.3" + strip-literal "^3.0.0" -"@vitest/snapshot@2.1.8": - version "2.1.8" - resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz#d5dc204f4b95dc8b5e468b455dfc99000047d2de" - integrity sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== +"@vitest/snapshot@3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz#40a8bc0346ac0aee923c0eefc2dc005d90bc987c" + integrity sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ== dependencies: - "@vitest/pretty-format" "2.1.8" - magic-string "^0.30.12" - pathe "^1.1.2" + "@vitest/pretty-format" "3.2.4" + magic-string "^0.30.17" + pathe "^2.0.3" -"@vitest/spy@2.1.8": - version "2.1.8" - resolved "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz#bc41af3e1e6a41ae3b67e51f09724136b88fa447" - integrity sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== +"@vitest/spy@3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz#cc18f26f40f3f028da6620046881f4e4518c2599" + integrity sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== dependencies: - tinyspy "^3.0.2" + tinyspy "^4.0.3" -"@vitest/utils@2.1.8": - version "2.1.8" - resolved "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz#f8ef85525f3362ebd37fd25d268745108d6ae388" - integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== +"@vitest/utils@3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz#c0813bc42d99527fb8c5b138c7a88516bca46fea" + integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== dependencies: - "@vitest/pretty-format" "2.1.8" - loupe "^3.1.2" - tinyrainbow "^1.2.0" + "@vitest/pretty-format" "3.2.4" + loupe "^3.1.4" + tinyrainbow "^2.0.0" -"@vue/compiler-core@3.5.13": - version "3.5.13" - resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05" - integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== +"@vue/compiler-core@3.5.18": + version "3.5.18" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz#521a138cdd970d9bfd27e42168d12f77a04b2074" + integrity sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw== dependencies: - "@babel/parser" "^7.25.3" - "@vue/shared" "3.5.13" + "@babel/parser" "^7.28.0" + "@vue/shared" "3.5.18" entities "^4.5.0" estree-walker "^2.0.2" - source-map-js "^1.2.0" + source-map-js "^1.2.1" -"@vue/compiler-dom@3.5.13": - version "3.5.13" - resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58" - integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== +"@vue/compiler-dom@3.5.18": + version "3.5.18" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz#e13504492c3061ec5bbe6a2e789f15261d4f03a7" + integrity sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A== dependencies: - "@vue/compiler-core" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/compiler-core" "3.5.18" + "@vue/shared" "3.5.18" -"@vue/compiler-sfc@3.5.13": - version "3.5.13" - resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46" - integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== +"@vue/compiler-sfc@3.5.18": + version "3.5.18" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz#ba1e849561337d809937994cdaf900539542eeca" + integrity sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA== dependencies: - "@babel/parser" "^7.25.3" - "@vue/compiler-core" "3.5.13" - "@vue/compiler-dom" "3.5.13" - "@vue/compiler-ssr" "3.5.13" - "@vue/shared" "3.5.13" + "@babel/parser" "^7.28.0" + "@vue/compiler-core" "3.5.18" + "@vue/compiler-dom" "3.5.18" + "@vue/compiler-ssr" "3.5.18" + "@vue/shared" "3.5.18" estree-walker "^2.0.2" - magic-string "^0.30.11" - postcss "^8.4.48" - source-map-js "^1.2.0" + magic-string "^0.30.17" + postcss "^8.5.6" + source-map-js "^1.2.1" -"@vue/compiler-ssr@3.5.13": - version "3.5.13" - resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba" - integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA== +"@vue/compiler-ssr@3.5.18": + version "3.5.18" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz#aecde0b0bff268a9c9014ba66799307c4a784328" + integrity sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g== dependencies: - "@vue/compiler-dom" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/compiler-dom" "3.5.18" + "@vue/shared" "3.5.18" -"@vue/devtools-api@^7.5.4": - version "7.6.4" - resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.6.4.tgz#024bf0ecf543395844f4d97cff0a84f8f759b29d" - integrity sha512-5AaJ5ELBIuevmFMZYYLuOO9HUuY/6OlkOELHE7oeDhy4XD/hSODIzktlsvBOsn+bto3aD0psj36LGzwVu5Ip8w== +"@vue/devtools-api@^7.7.0": + version "7.7.2" + resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.2.tgz#49837eae6f61fc43a09f5d6c2d3210f9f73a0d09" + integrity sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA== dependencies: - "@vue/devtools-kit" "^7.6.4" + "@vue/devtools-kit" "^7.7.2" -"@vue/devtools-kit@^7.6.4": - version "7.6.4" - resolved "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.6.4.tgz#2a74750d5604b6b3c2fe3388a454c9eac2c6c1f4" - integrity sha512-Zs86qIXXM9icU0PiGY09PQCle4TI750IPLmAJzW5Kf9n9t5HzSYf6Rz6fyzSwmfMPiR51SUKJh9sXVZu78h2QA== +"@vue/devtools-kit@^7.7.2": + version "7.7.2" + resolved "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz#3315bd5b144f98c7b84c2f44270b445644ec8f10" + integrity sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ== dependencies: - "@vue/devtools-shared" "^7.6.4" + "@vue/devtools-shared" "^7.7.2" birpc "^0.2.19" hookable "^5.5.3" mitt "^3.0.1" @@ -2494,149 +2417,143 @@ speakingurl "^14.0.1" superjson "^2.2.1" -"@vue/devtools-shared@^7.6.4": - version "7.6.4" - resolved "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.6.4.tgz#110044c88bafee3b2daa992fd90730546dec7b11" - integrity sha512-nD6CUvBEel+y7zpyorjiUocy0nh77DThZJ0k1GRnJeOmY3ATq2fWijEp7wk37gb023Cb0R396uYh5qMSBQ5WFg== +"@vue/devtools-shared@^7.7.2": + version "7.7.2" + resolved "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz#b11b143820130a32d8ce5737e264d06ab6d62f40" + integrity sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA== dependencies: rfdc "^1.4.1" -"@vue/reactivity@3.5.13": - version "3.5.13" - resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz#b41ff2bb865e093899a22219f5b25f97b6fe155f" - integrity sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg== +"@vue/reactivity@3.5.18": + version "3.5.18" + resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz#fe32166e3938832c54b4134e60e9b58ca7d9bdb4" + integrity sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg== dependencies: - "@vue/shared" "3.5.13" + "@vue/shared" "3.5.18" -"@vue/runtime-core@3.5.13": - version "3.5.13" - resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz#1fafa4bf0b97af0ebdd9dbfe98cd630da363a455" - integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw== +"@vue/runtime-core@3.5.18": + version "3.5.18" + resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz#9e9ae8b9491548b53d0cea2bf25746d27c52e191" + integrity sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w== dependencies: - "@vue/reactivity" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/reactivity" "3.5.18" + "@vue/shared" "3.5.18" -"@vue/runtime-dom@3.5.13": - version "3.5.13" - resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz#610fc795de9246300e8ae8865930d534e1246215" - integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog== +"@vue/runtime-dom@3.5.18": + version "3.5.18" + resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz#1150952d1048b5822e4f1dd8aed24665cbb22107" + integrity sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw== dependencies: - "@vue/reactivity" "3.5.13" - "@vue/runtime-core" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/reactivity" "3.5.18" + "@vue/runtime-core" "3.5.18" + "@vue/shared" "3.5.18" csstype "^3.1.3" -"@vue/server-renderer@3.5.13": - version "3.5.13" - resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7" - integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA== +"@vue/server-renderer@3.5.18": + version "3.5.18" + resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz#e9fa267b95b3a1d8cddca762377e5de2ae9122bd" + integrity sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA== dependencies: - "@vue/compiler-ssr" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/compiler-ssr" "3.5.18" + "@vue/shared" "3.5.18" + +"@vue/shared@3.5.18": + version "3.5.18" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz#529f24a88d3ed678d50fd5c07455841fbe8ac95e" + integrity sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA== -"@vue/shared@3.5.13", "@vue/shared@^3.5.12": - version "3.5.13" - resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f" - integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== +"@vue/shared@^3.5.13": + version "3.5.17" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz#e8b3a41f0be76499882a89e8ed40d86a70fa4b70" + integrity sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg== -"@vueuse/core@11.2.0", "@vueuse/core@^11.1.0": - version "11.2.0" - resolved "https://registry.npmjs.org/@vueuse/core/-/core-11.2.0.tgz#3fc6c0963051bb154dc4c08061889405e3fc745d" - integrity sha512-JIUwRcOqOWzcdu1dGlfW04kaJhW3EXnnjJJfLTtddJanymTL7lF1C0+dVVZ/siLfc73mWn+cGP1PE1PKPruRSA== +"@vueuse/core@12.7.0", "@vueuse/core@^12.4.0": + version "12.7.0" + resolved "https://registry.npmjs.org/@vueuse/core/-/core-12.7.0.tgz#b9c3880e9c01d9db86029c6a58412f1b1922497e" + integrity sha512-jtK5B7YjZXmkGNHjviyGO4s3ZtEhbzSgrbX+s5o+Lr8i2nYqNyHuPVOeTdM1/hZ5Tkxg/KktAuAVDDiHMraMVA== dependencies: "@types/web-bluetooth" "^0.0.20" - "@vueuse/metadata" "11.2.0" - "@vueuse/shared" "11.2.0" - vue-demi ">=0.14.10" + "@vueuse/metadata" "12.7.0" + "@vueuse/shared" "12.7.0" + vue "^3.5.13" -"@vueuse/integrations@^11.1.0": - version "11.2.0" - resolved "https://registry.npmjs.org/@vueuse/integrations/-/integrations-11.2.0.tgz#c4c2dd82260265697e0ec8d6356a7d2744acb896" - integrity sha512-zGXz3dsxNHKwiD9jPMvR3DAxQEOV6VWIEYTGVSB9PNpk4pTWR+pXrHz9gvXWcP2sTk3W2oqqS6KwWDdntUvNVA== +"@vueuse/integrations@^12.4.0": + version "12.7.0" + resolved "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.7.0.tgz#d9ba676a6643def3f8dcc99580162fbaf33de05e" + integrity sha512-IEq7K4bCl7mn3uKJaWtNXnd1CAPaHLUMuyj5K1/k/pVcItt0VONZW8xiGxdIovJcQjkzOHjImhX5t6gija+0/g== dependencies: - "@vueuse/core" "11.2.0" - "@vueuse/shared" "11.2.0" - vue-demi ">=0.14.10" + "@vueuse/core" "12.7.0" + "@vueuse/shared" "12.7.0" + vue "^3.5.13" -"@vueuse/metadata@11.2.0": - version "11.2.0" - resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.2.0.tgz#fd02cbbc7d08cb4592fceea0486559b89ae38643" - integrity sha512-L0ZmtRmNx+ZW95DmrgD6vn484gSpVeRbgpWevFKXwqqQxW9hnSi2Ppuh2BzMjnbv4aJRiIw8tQatXT9uOB23dQ== +"@vueuse/metadata@12.7.0": + version "12.7.0" + resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.7.0.tgz#17a263927204962ec045095c83f62c81db085a46" + integrity sha512-4VvTH9mrjXqFN5LYa5YfqHVRI6j7R00Vy4995Rw7PQxyCL3z0Lli86iN4UemWqixxEvYfRjG+hF9wL8oLOn+3g== -"@vueuse/shared@11.2.0": - version "11.2.0" - resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-11.2.0.tgz#7fb2f3cade6b6c00ef97e613f187ee9bdcfb9a3a" - integrity sha512-VxFjie0EanOudYSgMErxXfq6fo8vhr5ICI+BuE3I9FnX7ePllEsVrRQ7O6Q1TLgApeLuPKcHQxAXpP+KnlrJsg== +"@vueuse/shared@12.7.0": + version "12.7.0" + resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-12.7.0.tgz#0c573789069818a2e25ddae3ab64b536c614537b" + integrity sha512-coLlUw2HHKsm7rPN6WqHJQr18WymN4wkA/3ThFaJ4v4gWGWAQQGK+MJxLuJTBs4mojQiazlVWAKNJNpUWGRkNw== dependencies: - vue-demi ">=0.14.10" + vue "^3.5.13" "@yarnpkg/lockfile@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" + resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -"@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.35" - resolved "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.35.tgz" - integrity sha512-J6ySgEdQUqAmlttvZOoXOEsrDTAnHyR/MtEvuAG5a+gwKY/2Cc7xn4CWcpgfuwkp+0a4vXmt2BDwzacDoGDN1g== +"@yarnpkg/parsers@3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz#48a1517a0f49124827f4c37c284a689c607b2f32" + integrity sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" -"@zkochan/js-yaml@0.0.6": - version "0.0.6" - resolved "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz" - integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== +"@zkochan/js-yaml@0.0.7": + version "0.0.7" + resolved "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz#4b0cb785220d7c28ce0ec4d0804deb5d821eae89" + integrity sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ== dependencies: argparse "^2.0.1" -JSONStream@^1.0.4, JSONStream@^1.3.5: +JSONStream@^1.3.5: version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" through ">=2.2.7 <3" -abbrev@1, abbrev@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.14.0: - version "8.14.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== +acorn@^8.15.0: + version "8.15.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== add-stream@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz" + resolved "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== -agent-base@6, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agentkeepalive@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== - dependencies: - debug "^4.1.0" - depd "^1.1.2" - humanize-ms "^1.2.1" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -2662,33 +2579,33 @@ ajv@^8.11.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -algoliasearch@^5.12.0: - version "5.14.2" - resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.14.2.tgz#7cbad5a1fe1f94e4df6752f0c78748722d7c6fb9" - integrity sha512-aYjI4WLamMxbhdJ2QAA99VbDCJOGzMOdT2agh57bi40n86ufkhZSIAf6mkocr7NmtBLtwCnSHvD5NJ+Ky5elWw== - dependencies: - "@algolia/client-abtesting" "5.14.2" - "@algolia/client-analytics" "5.14.2" - "@algolia/client-common" "5.14.2" - "@algolia/client-insights" "5.14.2" - "@algolia/client-personalization" "5.14.2" - "@algolia/client-query-suggestions" "5.14.2" - "@algolia/client-search" "5.14.2" - "@algolia/ingestion" "1.14.2" - "@algolia/monitoring" "1.14.2" - "@algolia/recommend" "5.14.2" - "@algolia/requester-browser-xhr" "5.14.2" - "@algolia/requester-fetch" "5.14.2" - "@algolia/requester-node-http" "5.14.2" +algoliasearch@^5.14.2: + version "5.20.3" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.20.3.tgz#32d79b9ffaf5a085943fab304698f46c5a3faed9" + integrity sha512-iNC6BGvipaalFfDfDnXUje8GUlW5asj0cTMsZJwO/0rhsyLx1L7GZFAY8wW+eQ6AM4Yge2p5GSE5hrBlfSD90Q== + dependencies: + "@algolia/client-abtesting" "5.20.3" + "@algolia/client-analytics" "5.20.3" + "@algolia/client-common" "5.20.3" + "@algolia/client-insights" "5.20.3" + "@algolia/client-personalization" "5.20.3" + "@algolia/client-query-suggestions" "5.20.3" + "@algolia/client-search" "5.20.3" + "@algolia/ingestion" "1.20.3" + "@algolia/monitoring" "1.20.3" + "@algolia/recommend" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" ansi-colors@^4.1.1: version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" @@ -2731,25 +2648,17 @@ ansi-styles@^5.0.0: ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: +aproba@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -are-we-there-yet@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz" - integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" @@ -2759,142 +2668,64 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - array-differ@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz" + resolved "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== array-ify@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" + resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.8: - version "3.1.8" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - arrify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== arrify@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" + resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.0: - version "2.0.6" - resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - assertion-error@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== async@^3.2.3: - version "3.2.4" - resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.6" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axios@^1.0.0: - version "1.7.5" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz#21eed340eb5daf47d29b6e002424b3e88c8c54b1" - integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw== +axios@^1.8.3: + version "1.11.0" + resolved "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz#c2ec219e35e414c025b2095e8b8280278478fdb6" + integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA== dependencies: follow-redirects "^1.15.6" - form-data "^4.0.0" + form-data "^4.0.4" proxy-from-env "^1.1.0" b4a@^1.6.4: - version "1.6.4" - resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz" - integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== + version "1.6.7" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== balanced-match@^1.0.0: version "1.0.2" @@ -2902,31 +2733,37 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bare-events@^2.0.0, bare-events@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz#a7a7263c107daf8b85adf0b64f908503454ab26e" - integrity sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg== + version "2.5.4" + resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== -bare-fs@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-2.1.2.tgz#59294fa0ba7596c8b8a8a735517f28f8e5c1fbcc" - integrity sha512-+BjcnjHwnPfXunVnp7TTHP/8PkQZdMAIuJ8GyqodOv+F7hrhvqWX1oIaac3klLPSJ6wKRWVfoL8+w0HMrs1/OA== +bare-fs@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.1.tgz#85844f34da819c76754d545323a8b23ed3617c76" + integrity sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg== dependencies: bare-events "^2.0.0" - bare-os "^2.0.0" - bare-path "^2.0.0" - streamx "^2.13.0" + bare-path "^3.0.0" + bare-stream "^2.0.0" -bare-os@^2.0.0, bare-os@^2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/bare-os/-/bare-os-2.1.2.tgz#bdc8855062ea1c4bcb82fbb669d90be57462305d" - integrity sha512-slQjOn78Q8itnzomNAamiKo5MDpEpV3JnoNZ93lyynaFh6paWcU+5c0GVcZ7EYIJC2unN2JGdF1qupdscYl0Yg== +bare-os@^3.0.1: + version "3.5.1" + resolved "https://registry.npmjs.org/bare-os/-/bare-os-3.5.1.tgz#8e59ad8db6d0eab35cfe499208db643fd5f4c594" + integrity sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg== -bare-path@^2.0.0, bare-path@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz#830f17fd39842813ca77d211ebbabe238a88cb4c" - integrity sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw== +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.0.0: + version "2.6.5" + resolved "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz#bba8e879674c4c27f7e27805df005c15d7a2ca07" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== dependencies: - bare-os "^2.1.0" + streamx "^2.21.0" base64-js@^1.3.1: version "1.5.1" @@ -2935,20 +2772,18 @@ base64-js@^1.3.1: before-after-hook@^2.2.0: version "2.2.3" - resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== -bin-links@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/bin-links/-/bin-links-3.0.3.tgz" - integrity sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA== +bin-links@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" + integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== dependencies: - cmd-shim "^5.0.0" - mkdirp-infer-owner "^2.0.0" - npm-normalize-package-bin "^2.0.0" - read-cmd-shim "^3.0.0" - rimraf "^3.0.0" - write-file-atomic "^4.0.0" + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" birpc@^0.2.19: version "0.2.19" @@ -2957,7 +2792,7 @@ birpc@^0.2.19: bl@^4.0.3, bl@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -2965,17 +2800,17 @@ bl@^4.0.3, bl@^4.1.0: readable-stream "^3.4.0" brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.12" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + version "2.0.2" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" @@ -2987,18 +2822,18 @@ braces@^3.0.3: fill-range "^7.1.1" browserslist@^4.24.0: - version "4.24.2" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" - integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== + version "4.25.0" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz#986aa9c6d87916885da2b50d8eb577ac8d133b2c" + integrity sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA== dependencies: - caniuse-lite "^1.0.30001669" - electron-to-chromium "^1.5.41" - node-releases "^2.0.18" - update-browserslist-db "^1.1.1" + caniuse-lite "^1.0.30001718" + electron-to-chromium "^1.5.160" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.5.0: @@ -3009,67 +2844,46 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" - integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== - -builtins@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== - dependencies: - semver "^7.0.0" - -byte-size@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/byte-size/-/byte-size-7.0.1.tgz" - integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== +byte-size@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz#3424608c62d59de5bfda05d31e0313c6174842ae" + integrity sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== cac@^6.7.14: version "6.7.14" resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -cacache@^16.0.0, cacache@^16.0.6, cacache@^16.1.0: - version "16.1.3" - resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz" - integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== +cacache@^18.0.0, cacache@^18.0.3: + version "18.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz#4601d7578dadb59c66044e157d02a3314682d6a5" + integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^2.0.1" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" + ssri "^10.0.0" tar "^6.1.11" - unique-filename "^2.0.0" + unique-filename "^3.0.0" cachedir@2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" + resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -3078,7 +2892,7 @@ callsites@^3.0.0: camelcase-keys@^6.2.2: version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: camelcase "^5.3.1" @@ -3087,23 +2901,23 @@ camelcase-keys@^6.2.2: camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001669: - version "1.0.30001684" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz#0eca437bab7d5f03452ff0ef9de8299be6b08e16" - integrity sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ== +caniuse-lite@^1.0.30001718: + version "1.0.30001723" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz#c4f3174f02089720736e1887eab345e09bb10944" + integrity sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw== ccount@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chai@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" - integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== +chai@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz#1358ee106763624114addf84ab02697e411c9c05" + integrity sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw== dependencies: assertion-error "^2.0.1" check-error "^2.1.1" @@ -3113,13 +2927,13 @@ chai@^5.1.2: chalk@4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.4.1: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3130,16 +2944,16 @@ chalk@^2.4.1, chalk@^2.4.2: chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.3.0, chalk@~5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== +chalk@^5.3.0, chalk@^5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== character-entities-html4@^2.0.0: version "2.1.0" @@ -3163,27 +2977,27 @@ check-error@^2.1.1: chownr@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +ci-info@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz#cbd21386152ebfe1d56f280a3b5feccbd96764c7" + integrity sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg== + clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@3.1.0, cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" @@ -3197,7 +3011,7 @@ cli-cursor@^5.0.0: cli-spinners@2.6.1: version "2.6.1" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== cli-spinners@^2.5.0: @@ -3207,7 +3021,7 @@ cli-spinners@^2.5.0: cli-truncate@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: slice-ansi "^5.0.0" @@ -3215,7 +3029,7 @@ cli-truncate@^4.0.0: cli-width@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cli-width@^4.1.0: @@ -3225,7 +3039,7 @@ cli-width@^4.1.0: cliui@^7.0.2: version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -3234,16 +3048,16 @@ cliui@^7.0.2: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clone-deep@^4.0.1: +clone-deep@4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" @@ -3255,12 +3069,10 @@ clone@^1.0.2: resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -cmd-shim@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz" - integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw== - dependencies: - mkdirp-infer-owner "^2.0.0" +cmd-shim@6.0.3, cmd-shim@^6.0.0: + version "6.0.3" + resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz#c491e9656594ba17ac83c4bd931590a9d6e26033" + integrity sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== color-convert@^1.9.0: version "1.9.3" @@ -3286,19 +3098,19 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-support@^1.1.3: +color-support@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== colorette@^2.0.20: version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -columnify@^1.6.0: +columnify@1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz" + resolved "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== dependencies: strip-ansi "^6.0.1" @@ -3306,7 +3118,7 @@ columnify@^1.6.0: combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" @@ -3316,10 +3128,15 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@~12.1.0: - version "12.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== +commander@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz#f244fc74a92343514e56229f16ef5c5e22ced5e9" + integrity sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA== + +comment-parser@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" + integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== commitizen@^4.0.3, commitizen@^4.2.4: version "4.3.1" @@ -3343,12 +3160,12 @@ commitizen@^4.0.3, commitizen@^4.2.4: common-ancestor-path@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz" + resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== compare-func@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" + resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" @@ -3361,7 +3178,7 @@ concat-map@0.0.1: concat-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== dependencies: buffer-from "^1.0.0" @@ -3369,114 +3186,91 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -config-chain@^1.1.12: - version "1.1.13" - resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - console-control-strings@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -conventional-changelog-angular@^5.0.12: - version "5.0.13" - resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz" - integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== - dependencies: - compare-func "^2.0.0" - q "^1.5.1" - -conventional-changelog-angular@^7.0.0: +conventional-changelog-angular@7.0.0, conventional-changelog-angular@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz" + resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== dependencies: compare-func "^2.0.0" conventional-changelog-atom@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz" + resolved "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz#291fd1583517d4e7131dba779ad9fa238359daa1" integrity sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw== conventional-changelog-conventionalcommits@^7.0.2: version "7.0.2" - resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz" + resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== dependencies: compare-func "^2.0.0" -conventional-changelog-core@^4.2.4: - version "4.2.4" - resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz" - integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== +conventional-changelog-core@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz#3c331b155d5b9850f47b4760aeddfc983a92ad49" + integrity sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A== dependencies: add-stream "^1.0.0" - conventional-changelog-writer "^5.0.0" - conventional-commits-parser "^3.2.0" - dateformat "^3.0.0" - get-pkg-repo "^4.0.0" - git-raw-commits "^2.0.8" + conventional-changelog-writer "^6.0.0" + conventional-commits-parser "^4.0.0" + dateformat "^3.0.3" + get-pkg-repo "^4.2.1" + git-raw-commits "^3.0.0" git-remote-origin-url "^2.0.0" - git-semver-tags "^4.1.1" - lodash "^4.17.15" - normalize-package-data "^3.0.0" - q "^1.5.1" + git-semver-tags "^5.0.0" + normalize-package-data "^3.0.3" read-pkg "^3.0.0" read-pkg-up "^3.0.0" - through2 "^4.0.0" -conventional-changelog-preset-loader@^2.3.4: - version "2.3.4" - resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz" - integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== +conventional-changelog-preset-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz#14975ef759d22515d6eabae6396c2ae721d4c105" + integrity sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA== -conventional-changelog-writer@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz" - integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== +conventional-changelog-writer@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz#d8d3bb5e1f6230caed969dcc762b1c368a8f7b01" + integrity sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ== dependencies: - conventional-commits-filter "^2.0.7" - dateformat "^3.0.0" + conventional-commits-filter "^3.0.0" + dateformat "^3.0.3" handlebars "^4.7.7" json-stringify-safe "^5.0.1" - lodash "^4.17.15" - meow "^8.0.0" - semver "^6.0.0" - split "^1.0.0" - through2 "^4.0.0" + meow "^8.1.2" + semver "^7.0.0" + split "^1.0.1" conventional-commit-types@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz" + resolved "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== -conventional-commits-filter@^2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz" - integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== +conventional-commits-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz#bf1113266151dd64c49cd269e3eb7d71d7015ee2" + integrity sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q== dependencies: lodash.ismatch "^4.4.0" - modify-values "^1.0.0" + modify-values "^1.0.1" -conventional-commits-parser@^3.2.0: - version "3.2.4" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz" - integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== dependencies: - JSONStream "^1.0.4" + JSONStream "^1.3.5" is-text-path "^1.0.1" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" + meow "^8.1.2" + split2 "^3.2.2" conventional-commits-parser@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz" + resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== dependencies: JSONStream "^1.3.5" @@ -3484,19 +3278,18 @@ conventional-commits-parser@^5.0.0: meow "^12.0.1" split2 "^4.0.0" -conventional-recommended-bump@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz" - integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== +conventional-recommended-bump@7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz#ec01f6c7f5d0e2491c2d89488b0d757393392424" + integrity sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA== dependencies: concat-stream "^2.0.0" - conventional-changelog-preset-loader "^2.3.4" - conventional-commits-filter "^2.0.7" - conventional-commits-parser "^3.2.0" - git-raw-commits "^2.0.8" - git-semver-tags "^4.1.1" - meow "^8.0.0" - q "^1.5.1" + conventional-changelog-preset-loader "^3.0.0" + conventional-commits-filter "^3.0.0" + conventional-commits-parser "^4.0.0" + git-raw-commits "^3.0.0" + git-semver-tags "^5.0.0" + meow "^8.1.2" convert-source-map@^2.0.0: version "2.0.0" @@ -3512,7 +3305,7 @@ copy-anything@^3.0.2: core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig-typescript-loader@^6.1.0: @@ -3522,18 +3315,7 @@ cosmiconfig-typescript-loader@^6.1.0: dependencies: jiti "^2.4.1" -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^9.0.0: +cosmiconfig@9.0.0, cosmiconfig@^9.0.0: version "9.0.0" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== @@ -3545,12 +3327,12 @@ cosmiconfig@^9.0.0: cross-env@^7.0.3: version "7.0.3" - resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" + resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: cross-spawn "^7.0.1" -cross-spawn@^7.0.0, cross-spawn@^7.0.6: +cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -3559,14 +3341,10 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -cross-spawn@^7.0.1, cross-spawn@^7.0.3: - version "7.0.5" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz#910aac880ff5243da96b728bc6521a5f6c2f2f82" - integrity sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.1.3: version "3.1.3" @@ -3575,7 +3353,7 @@ csstype@^3.1.3: cz-conventional-changelog@3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz" + resolved "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== dependencies: chalk "^2.4.1" @@ -3589,7 +3367,7 @@ cz-conventional-changelog@3.3.0: dargs@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz" + resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== dargs@^8.0.0: @@ -3597,74 +3375,21 @@ dargs@^8.0.0: resolved "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz#a34859ea509cbce45485e5aa356fef70bfcc7272" integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -dateformat@^3.0.0: +dateformat@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@4, debug@^4.3.3: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.7: - version "4.3.7" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1: + version "4.4.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: ms "^2.1.3" -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" - integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== - decamelize-keys@^1.1.0: version "1.1.1" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" @@ -3672,14 +3397,19 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0: version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -dedent@0.7.0, dedent@^0.7.0: +dedent@0.7.0: version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@1.5.3: + version "1.5.3" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + deep-eql@^5.0.1: version "5.0.2" resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" @@ -3697,47 +3427,19 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - define-lazy-prop@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -deprecation@^2.0.0, deprecation@^2.3.1: +deprecation@^2.0.0: version "2.3.1" - resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz" + resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== dequal@^2.0.0: @@ -3747,17 +3449,17 @@ dequal@^2.0.0: detect-file@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== -detect-indent@6.1.0, detect-indent@^6.0.0: +detect-indent@6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== detect-indent@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== devlop@^1.0.0: @@ -3767,51 +3469,43 @@ devlop@^1.0.0: dependencies: dequal "^2.0.0" -dezalgo@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== - dependencies: - asap "^2.0.0" - wrappy "1" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== dot-prop@^5.1.0: version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" -dot-prop@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== +dotenv-expand@~11.0.6: + version "11.0.7" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz#af695aea007d6fdc84c86cd8d0ad7beb40a0bd08" + integrity sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA== dependencies: - is-obj "^2.0.0" + dotenv "^16.4.5" -dotenv@~10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dotenv@^16.4.5: + version "16.6.1" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" + integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== -duplexer@^0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +dotenv@~16.4.5: + version "16.4.7" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" eastasianwidth@^0.2.0: version "0.2.0" @@ -3825,10 +3519,10 @@ ejs@^3.1.7: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.41: - version "1.5.66" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.66.tgz#1e9b4bc7638ac02d3551eea1dbaeb0101ec5823f" - integrity sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ== +electron-to-chromium@^1.5.160: + version "1.5.169" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.169.tgz#6afdfd8e701b7ab744e2bb0cfdec3cefc1072cbe" + integrity sha512-q7SQx6mkLy0GTJK9K9OiWeaBMV4XQtBSdf6MJUzDB/H/5tFXfIiX38Lci1Kl6SsgiEhz1SQI1ejEOU5asWEhwQ== emoji-regex-xs@^1.0.0: version "1.0.0" @@ -3836,9 +3530,9 @@ emoji-regex-xs@^1.0.0: integrity sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== emoji-regex@^10.3.0: - version "10.3.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz" - integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + version "10.4.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== emoji-regex@^8.0.0: version "8.0.0" @@ -3852,21 +3546,28 @@ emoji-regex@^9.2.2: encoding@^0.1.13: version "0.1.13" - resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +end-of-stream@^1.4.1: + version "1.4.5" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + enquirer@~2.3.6: version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" @@ -3878,13 +3579,13 @@ entities@^4.5.0: env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -envinfo@^7.7.4: - version "7.8.1" - resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +envinfo@7.13.0: + version "7.13.0" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" + integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== environment@^1.0.0: version "1.1.0" @@ -3893,116 +3594,47 @@ environment@^1.0.0: err-code@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" + resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-module-lexer@^1.5.4: - version "1.5.4" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" - integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== +es-module-lexer@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: - get-intrinsic "^1.2.4" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + hasown "^2.0.2" esbuild@^0.21.3: version "0.21.5" @@ -4033,12 +3665,39 @@ esbuild@^0.21.3: "@esbuild/win32-ia32" "0.21.5" "@esbuild/win32-x64" "0.21.5" -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escalade@^3.2.0: +esbuild@^0.25.0: + version "0.25.9" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz#15ab8e39ae6cdc64c24ff8a2c0aef5b3fd9fa976" + integrity sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.9" + "@esbuild/android-arm" "0.25.9" + "@esbuild/android-arm64" "0.25.9" + "@esbuild/android-x64" "0.25.9" + "@esbuild/darwin-arm64" "0.25.9" + "@esbuild/darwin-x64" "0.25.9" + "@esbuild/freebsd-arm64" "0.25.9" + "@esbuild/freebsd-x64" "0.25.9" + "@esbuild/linux-arm" "0.25.9" + "@esbuild/linux-arm64" "0.25.9" + "@esbuild/linux-ia32" "0.25.9" + "@esbuild/linux-loong64" "0.25.9" + "@esbuild/linux-mips64el" "0.25.9" + "@esbuild/linux-ppc64" "0.25.9" + "@esbuild/linux-riscv64" "0.25.9" + "@esbuild/linux-s390x" "0.25.9" + "@esbuild/linux-x64" "0.25.9" + "@esbuild/netbsd-arm64" "0.25.9" + "@esbuild/netbsd-x64" "0.25.9" + "@esbuild/openbsd-arm64" "0.25.9" + "@esbuild/openbsd-x64" "0.25.9" + "@esbuild/openharmony-arm64" "0.25.9" + "@esbuild/sunos-x64" "0.25.9" + "@esbuild/win32-arm64" "0.25.9" + "@esbuild/win32-ia32" "0.25.9" + "@esbuild/win32-x64" "0.25.9" + +escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -4048,73 +3707,64 @@ escape-string-regexp@^1.0.5: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" - integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.12.0: - version "2.12.0" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" - integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.30.0: - version "2.31.0" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" - integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.8" - array.prototype.findlastindex "^1.2.5" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.0" - hasown "^2.0.2" - is-core-module "^2.15.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.0" - semver "^6.3.1" - string.prototype.trimend "^1.0.8" - tsconfig-paths "^3.15.0" - -eslint-plugin-jest@^28.8.2: - version "28.10.0" - resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.10.0.tgz#4b35b8abb0f7cfe699bff8d9060270a2ddd770ea" - integrity sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA== - dependencies: - "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" +eslint-config-prettier@^10.0.0: + version "10.1.8" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== + +eslint-import-context@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.8.tgz#4098b659f4c1a3b3cc3bc896c3baee7907ca636d" + integrity sha512-bq+F7nyc65sKpZGT09dY0S0QrOnQtuDVIfyTGQ8uuvtMIF7oHp6CEP3mouN0rrnYF3Jqo6Ke0BfU/5wASZue1w== + dependencies: + get-tsconfig "^4.10.1" + stable-hash-x "^0.1.1" + +eslint-import-context@^0.1.9: + version "0.1.9" + resolved "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz#967b0b2f0a90ef4b689125e088f790f0b7756dbe" + integrity sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg== + dependencies: + get-tsconfig "^4.10.1" + stable-hash-x "^0.2.0" + +eslint-import-resolver-typescript@^4.4.3: + version "4.4.4" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz#3e83a9c25f4a053fe20e1b07b47e04e8519a8720" + integrity sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw== + dependencies: + debug "^4.4.1" + eslint-import-context "^0.1.8" + get-tsconfig "^4.10.1" + is-bun-module "^2.0.0" + stable-hash-x "^0.2.0" + tinyglobby "^0.2.14" + unrs-resolver "^1.7.11" + +eslint-plugin-import-x@^4.15.2: + version "4.16.1" + resolved "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz#a96ee1ad5ba6816f9a5573a9617935011a24c4df" + integrity sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ== + dependencies: + "@typescript-eslint/types" "^8.35.0" + comment-parser "^1.4.1" + debug "^4.4.1" + eslint-import-context "^0.1.9" + is-glob "^4.0.3" + minimatch "^9.0.3 || ^10.0.1" + semver "^7.7.2" + stable-hash-x "^0.2.0" + unrs-resolver "^1.9.2" -eslint-scope@^8.2.0: - version "8.2.0" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" - integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -4124,26 +3774,27 @@ eslint-visitor-keys@^3.4.3: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-visitor-keys@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" - integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== eslint@^9.16.0: - version "9.17.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz#faa1facb5dd042172fdc520106984b5c2421bb0c" - integrity sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA== + version "9.32.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz#4ea28df4a8dbc454e1251e0f3aed4bcf4ce50a47" + integrity sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.19.0" - "@eslint/core" "^0.9.0" - "@eslint/eslintrc" "^3.2.0" - "@eslint/js" "9.17.0" - "@eslint/plugin-kit" "^0.2.3" + "@eslint/config-array" "^0.21.0" + "@eslint/config-helpers" "^0.3.0" + "@eslint/core" "^0.15.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.32.0" + "@eslint/plugin-kit" "^0.3.4" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.1" + "@humanwhocodes/retry" "^0.4.2" "@types/estree" "^1.0.6" "@types/json-schema" "^7.0.15" ajv "^6.12.4" @@ -4151,9 +3802,9 @@ eslint@^9.16.0: cross-spawn "^7.0.6" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^8.2.0" - eslint-visitor-keys "^4.2.0" - espree "^10.3.0" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -4169,27 +3820,20 @@ eslint@^9.16.0: natural-compare "^1.4.0" optionator "^0.9.3" -espree@^10.0.1, espree@^10.3.0: - version "10.3.0" - resolved "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" - integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== dependencies: - acorn "^8.14.0" + acorn "^8.15.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.0" + eslint-visitor-keys "^4.2.1" esprima@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.5.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - esquery@^1.5.0: version "1.6.0" resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" @@ -4228,18 +3872,18 @@ esutils@^2.0.2: eventemitter3@^4.0.4: version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== eventemitter3@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== +execa@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== dependencies: cross-spawn "^7.0.3" get-stream "^6.0.0" @@ -4251,36 +3895,26 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@~8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== dependencies: homedir-polyfill "^1.0.1" -expect-type@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" - integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== +expect-type@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz#af76d8b357cf5fa76c41c09dafb79c549e75f71f" + integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw== + +exponential-backoff@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" + integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== external-editor@^3.0.3, external-editor@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" @@ -4292,32 +3926,21 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.1.0, fast-fifo@^1.2.0: +fast-fifo@^1.2.0, fast-fifo@^1.3.2: version "1.3.2" - resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.2.9, fast-glob@^3.3.1, fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== +fast-glob@^3.3.1, fast-glob@^3.3.2, fast-glob@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -4331,24 +3954,34 @@ fast-levenshtein@^2.0.6: fast-safe-stringify@^2.0.6: version "2.1.1" - resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-uri@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" - integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + version "3.0.6" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + version "1.19.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" +fdir@^6.4.3, fdir@^6.4.4: + version "6.4.6" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" + integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + figures@3.2.0, figures@^3.0.0: version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -4360,9 +3993,9 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" -filelist@^1.0.1: +filelist@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: minimatch "^5.0.1" @@ -4375,33 +4008,33 @@ fill-range@^7.1.1: to-regex-range "^5.0.1" find-node-modules@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.2.tgz" - integrity sha512-x+3P4mbtRPlSiVE1Qco0Z4YLU8WFiFcuWTf3m75OV9Uzcfs2Bg+O9N+r/K0AnmINBW06KpfqKwYJbFlFq4qNug== + version "2.1.3" + resolved "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz#3c976cff2ca29ee94b4f9eafc613987fc4c0ee44" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== dependencies: findup-sync "^4.0.0" - merge "^2.1.0" + merge "^2.1.1" find-root@1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== find-up-simple@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz#21d035fde9fdbd56c8f4d2f63f32fd93a1cfc368" - integrity sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== + version "1.0.1" + resolved "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz#18fb90ad49e45252c4d7fca56baade04fa3fca1e" + integrity sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ== find-up@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -4426,7 +4059,7 @@ find-up@^7.0.0: findup-sync@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz" + resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== dependencies: detect-file "^1.0.0" @@ -4444,58 +4077,60 @@ flat-cache@^4.0.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: - version "3.3.2" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" - integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + version "3.3.3" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -focus-trap@^7.6.0: - version "7.6.2" - resolved "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.2.tgz#a501988821ca23d0150a7229eb7a20a3695bdf0e" - integrity sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w== +focus-trap@^7.6.4: + version "7.6.4" + resolved "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz#455ec5c51fee5ae99604ca15142409ffbbf84db9" + integrity sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw== dependencies: tabbable "^6.2.0" follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" + version "1.15.9" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + version "3.3.1" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - cross-spawn "^7.0.0" + cross-spawn "^7.0.6" signal-exit "^4.0.1" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== +form-data@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" + integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" mime-types "^2.1.12" +front-matter@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" + integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== + dependencies: + js-yaml "^3.13.1" + fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@9.1.0, fs-extra@^9.1.0: +fs-extra@9.1.0: version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -4503,22 +4138,29 @@ fs-extra@9.1.0, fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.0.0, fs-extra@^11.1.0: - version "11.2.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== +fs-extra@^11.0.0, fs-extra@^11.2.0: + version "11.3.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0, fs-minipass@^2.1.0: +fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -4534,35 +4176,6 @@ function-bind@^1.1.2: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gauge@^4.0.3: - version "4.0.4" - resolved "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz" - integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^3.0.7" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -4570,28 +4183,33 @@ gensync@^1.0.0-beta.2: get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-east-asian-width@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz" - integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + version "1.3.0" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" -get-pkg-repo@^4.0.0: +get-pkg-repo@^4.2.1: version "4.2.1" - resolved "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz" + resolved "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== dependencies: "@hutson/parse-repository-url" "^3.0.0" @@ -4599,40 +4217,44 @@ get-pkg-repo@^4.0.0: through2 "^2.0.0" yargs "^16.2.0" -get-port@^5.1.1: +get-port@5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz" + resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== +get-tsconfig@^4.10.1: + version "4.10.1" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e" + integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" + resolve-pkg-maps "^1.0.0" -git-raw-commits@^2.0.8: - version "2.0.11" - resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== +git-raw-commits@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz#5432f053a9744f67e8db03dbc48add81252cfdeb" + integrity sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw== dependencies: dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" + meow "^8.1.2" + split2 "^3.2.2" git-raw-commits@^4.0.0: version "4.0.0" @@ -4645,71 +4267,59 @@ git-raw-commits@^4.0.0: git-remote-origin-url@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz" + resolved "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== dependencies: gitconfiglocal "^1.0.0" pify "^2.3.0" -git-semver-tags@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz" - integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== +git-semver-tags@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-5.0.1.tgz#db748aa0e43d313bf38dcd68624d8443234e1c15" + integrity sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA== dependencies: - meow "^8.0.0" - semver "^6.0.0" + meow "^8.1.2" + semver "^7.0.0" git-up@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz" + resolved "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== dependencies: is-ssh "^1.4.0" parse-url "^8.1.0" -git-url-parse@^13.1.0: - version "13.1.0" - resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz" - integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== +git-url-parse@14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz#18ce834726d5fbca0c25a4555101aa277017418f" + integrity sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ== dependencies: git-up "^7.0.0" gitconfiglocal@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz" + resolved "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== dependencies: ini "^1.3.2" -glob-parent@^5.1.1, glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: +glob-parent@6.0.2, glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" -glob@7.1.4: - version "7.1.4" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + is-glob "^4.0.1" -glob@7.2.3, glob@^7.1.3, glob@^7.1.4: +glob@7.2.3: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -4719,7 +4329,7 @@ glob@7.2.3, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^10.3.10, glob@^10.4.1: +glob@^10.2.2, glob@^10.3.10, glob@^10.4.1: version "10.4.5" resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -4731,16 +4341,15 @@ glob@^10.3.10, glob@^10.4.1: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@^9.2.0: + version "9.3.5" + resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== dependencies: fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" global-directory@^4.0.1: version "4.0.1" @@ -4751,7 +4360,7 @@ global-directory@^4.0.1: global-modules@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: global-prefix "^1.0.1" @@ -4760,8 +4369,8 @@ global-modules@^1.0.0: global-prefix@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== dependencies: expand-tilde "^2.0.2" homedir-polyfill "^1.0.1" @@ -4779,41 +4388,19 @@ globals@^14.0.0: resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^15.13.0: - version "15.14.0" - resolved "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz#b8fd3a8941ff3b4d38f3319d433b61bbb482e73f" - integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig== - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.0.2: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" +globals@^16.0.0: + version "16.3.0" + resolved "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667" + integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ== -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.6: version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: @@ -4822,12 +4409,12 @@ graphemer@^1.4.0: integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + version "4.7.8" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -4835,14 +4422,9 @@ handlebars@^4.7.7: hard-rejection@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -4853,46 +4435,34 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: +has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" -has-unicode@^2.0.1: +has-unicode@2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" -hast-util-to-html@^9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz#a9999a0ba6b4919576a9105129fead85d37f302b" - integrity sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg== +hast-util-to-html@^9.0.4: + version "9.0.5" + resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" + integrity sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== dependencies: "@types/hast" "^3.0.0" "@types/unist" "^3.0.0" @@ -4901,7 +4471,7 @@ hast-util-to-html@^9.0.3: hast-util-whitespace "^3.0.0" html-void-elements "^3.0.0" mdast-util-to-hast "^13.0.0" - property-information "^6.0.0" + property-information "^7.0.0" space-separated-tokens "^2.0.0" stringify-entities "^4.0.0" zwitch "^2.0.4" @@ -4915,7 +4485,7 @@ hast-util-whitespace@^3.0.0: homedir-polyfill@^1.0.1: version "1.0.3" - resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: parse-passwd "^1.0.0" @@ -4927,34 +4497,20 @@ hookable@^5.5.3: hosted-git-info@^2.1.4: version "2.8.9" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^3.0.6: - version "3.0.8" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz" - integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== - dependencies: - lru-cache "^6.0.0" - hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" -hosted-git-info@^5.0.0: - version "5.2.1" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz" - integrity sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw== - dependencies: - lru-cache "^7.5.1" - -hosted-git-info@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz" - integrity sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA== +hosted-git-info@^7.0.0, hosted-git-info@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" + integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== dependencies: lru-cache "^10.0.1" @@ -4968,45 +4524,32 @@ html-void-elements@^3.0.0: resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== -http-cache-semantics@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== +http-cache-semantics@^4.1.1: + version "4.2.0" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" + agent-base "^7.1.0" + debug "^4.3.4" -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== +https-proxy-agent@^7.0.1: + version "7.0.6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: - agent-base "6" + agent-base "^7.1.2" debug "4" human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - husky@^9.1.5: version "9.1.7" resolved "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" @@ -5021,7 +4564,7 @@ iconv-lite@^0.4.24: iconv-lite@^0.6.2: version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -5031,39 +4574,34 @@ ieee754@^1.1.13: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-walk@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz" - integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== +ignore-walk@^6.0.4: + version "6.0.5" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" + integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== dependencies: - minimatch "^5.0.1" - -ignore@^5.0.4: - version "5.3.0" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + minimatch "^9.0.0" -ignore@^5.2.0, ignore@^5.3.1: +ignore@^5.0.4, ignore@^5.2.0: version "5.3.2" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +ignore@^7.0.0: + version "7.0.5" + resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" - integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== - -import-local@^3.0.2: +import-local@3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -5081,18 +4619,13 @@ imurmurhash@^0.1.4: indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -index-to-position@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.0.tgz" - integrity sha512-I6PLk0E6Jk8t/W212xp9euPed30tIN9mYdslb0Vkd03hG9sd0pByboBdtIRL+Y/103JLp1alP3OuMgxfbIQyFw== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== +index-to-position@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz#e11bfe995ca4d8eddb1ec43274488f3c201a7f09" + integrity sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g== inflight@^1.0.4: version "1.0.6" @@ -5104,7 +4637,7 @@ inflight@^1.0.4: inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@4.1.1: @@ -5112,27 +4645,32 @@ ini@4.1.1: resolved "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== -ini@^1.3.2, ini@^1.3.4: - version "1.3.7" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz" - integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== +ini@^1.3.2, ini@^1.3.4, ini@^1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -init-package-json@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/init-package-json/-/init-package-json-3.0.2.tgz" - integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A== +ini@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + +init-package-json@6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.3.tgz#2552fba75b6eed2495dc97f44183e2e5a5bcf8b0" + integrity sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w== dependencies: - npm-package-arg "^9.0.1" - promzard "^0.3.0" - read "^1.0.7" - read-package-json "^5.0.0" + "@npmcli/package-json" "^5.0.0" + npm-package-arg "^11.0.0" + promzard "^1.0.0" + read "^3.0.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "^5.0.0" -inquirer@8.2.5, inquirer@^8.2.4: +inquirer@8.2.5: version "8.2.5" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== dependencies: ansi-escapes "^4.2.1" @@ -5151,6 +4689,27 @@ inquirer@8.2.5, inquirer@^8.2.4: through "^2.3.6" wrap-ansi "^7.0.0" +inquirer@^8.2.4: + version "8.2.6" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + inquirer@^9.2.15: version "9.3.7" resolved "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz#0b562bf843812208844741c9aec9244c939b83d4" @@ -5169,91 +4728,43 @@ inquirer@^9.2.15: wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -ip@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" - integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + jsbn "1.1.0" + sprintf-js "^1.1.3" is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-ci@^2.0.0: +is-bun-module@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.13.0, is-core-module@^2.15.1: - version "2.15.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" - integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== - dependencies: - hasown "^2.0.2" - -is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.13.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + resolved "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz#4d7859a87c0fcac950c95e666730e745eae8bddd" + integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== dependencies: - hasown "^2.0.0" + semver "^7.7.1" -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== +is-ci@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: - is-typed-array "^1.1.13" + ci-info "^3.2.0" -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-core-module@^2.16.0, is-core-module@^2.5.0: + version "2.16.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - has-tostringtag "^1.0.0" + hasown "^2.0.2" is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extglob@^2.1.1: @@ -5268,12 +4779,12 @@ is-fullwidth-code-point@^3.0.0: is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-fullwidth-code-point@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== dependencies: get-east-asian-width "^1.0.0" @@ -5292,21 +4803,9 @@ is-interactive@^1.0.0: is-lambda@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -5314,103 +4813,57 @@ is-number@^7.0.0: is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-plain-obj@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - is-ssh@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz" - integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== + version "1.4.1" + resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz#76de1cdbe8f92a8b905d1a172b6bc09704c20396" + integrity sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg== dependencies: protocols "^2.0.1" +is-stream@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - is-text-path@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz" + resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== dependencies: text-extensions "^1.0.0" is-text-path@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz" + resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== dependencies: text-extensions "^2.0.0" -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -5418,15 +4871,8 @@ is-unicode-supported@^0.1.0: is-utf8@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== is-what@^4.1.8: version "4.1.16" @@ -5435,24 +4881,19 @@ is-what@^4.1.8: is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: @@ -5460,9 +4901,14 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + isobject@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: @@ -5517,73 +4963,45 @@ jackspeak@^3.1.2: "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: - version "10.8.5" - resolved "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + version "10.9.2" + resolved "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" - -jest-environment-node@^29.6.2: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" + filelist "^1.0.4" + minimatch "^3.1.2" -jest-message-util@^29.7.0: +"jest-diff@>=29.4.3 < 30", jest-diff@^29.4.1: version "29.7.0" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jiti@^2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.1.tgz#4de9766ccbfa941d9b6390d2b159a4b295a52e6b" - integrity sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g== + version "2.4.2" + resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560" + integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" + integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== + js-yaml@4.1.0, js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -5591,18 +5009,23 @@ js-yaml@4.1.0, js-yaml@^4.0.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js-yaml@^3.10.0: +js-yaml@^3.10.0, js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsesc@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-buffer@3.0.1: version "3.0.1" @@ -5611,18 +5034,18 @@ json-buffer@3.0.1: json-parse-better-errors@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-parse-even-better-errors@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz" - integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== +json-parse-even-better-errors@^3.0.0, json-parse-even-better-errors@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== json-schema-traverse@^0.4.1: version "0.4.1" @@ -5641,34 +5064,27 @@ json-stable-stringify-without-jsonify@^1.0.1: json-stringify-nice@^1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz" + resolved "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== json-stringify-safe@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - json5@^2.2.2, json5@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonc@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz" + resolved "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz#9e2a25100d164a9bb864c57517563717fa882551" integrity sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw== dependencies: fast-safe-stringify "^2.0.6" @@ -5680,7 +5096,7 @@ jsonc@^2.0.0: jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -5689,18 +5105,18 @@ jsonfile@^6.0.1: jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== just-diff-apply@^5.2.0: version "5.5.0" - resolved "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz" + resolved "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== -just-diff@^5.0.1: - version "5.2.0" - resolved "https://registry.npmjs.org/just-diff/-/just-diff-5.2.0.tgz" - integrity sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw== +just-diff@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" + integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== keyv@^4.5.4: version "4.5.4" @@ -5711,39 +5127,94 @@ keyv@^4.5.4: kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -lerna@^6.0.0: - version "6.4.1" - resolved "https://registry.npmjs.org/lerna/-/lerna-6.4.1.tgz" - integrity sha512-0t8TSG4CDAn5+vORjvTFn/ZEGyc4LOEsyBUpzcdIxODHPKM4TVOGvbW9dBs1g40PhOrQfwhHS+3fSx/42j42dQ== - dependencies: - "@lerna/add" "6.4.1" - "@lerna/bootstrap" "6.4.1" - "@lerna/changed" "6.4.1" - "@lerna/clean" "6.4.1" - "@lerna/cli" "6.4.1" - "@lerna/command" "6.4.1" - "@lerna/create" "6.4.1" - "@lerna/diff" "6.4.1" - "@lerna/exec" "6.4.1" - "@lerna/filter-options" "6.4.1" - "@lerna/import" "6.4.1" - "@lerna/info" "6.4.1" - "@lerna/init" "6.4.1" - "@lerna/link" "6.4.1" - "@lerna/list" "6.4.1" - "@lerna/publish" "6.4.1" - "@lerna/run" "6.4.1" - "@lerna/validation-error" "6.4.1" - "@lerna/version" "6.4.1" - "@nrwl/devkit" ">=15.4.2 < 16" - import-local "^3.0.2" +lerna@^8.2.0: + version "8.2.3" + resolved "https://registry.npmjs.org/lerna/-/lerna-8.2.3.tgz#0a9c07eda4cfac84a480b3e66915189ccfb5bd2c" + integrity sha512-rmuDU+92eWUnnyaPg3Ise339pTxF+r2hu8ky/soCfbGpUoW4kCwsDza3P/LtQJWrKwZWHcosEitfYvxGUWZ16A== + dependencies: + "@lerna/create" "8.2.3" + "@npmcli/arborist" "7.5.4" + "@npmcli/package-json" "5.2.0" + "@npmcli/run-script" "8.1.0" + "@nx/devkit" ">=17.1.2 < 21" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "20.1.2" + aproba "2.0.0" + byte-size "8.1.1" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "6.0.3" + color-support "1.1.3" + columnify "1.6.0" + console-control-strings "^1.1.0" + conventional-changelog-angular "7.0.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "9.0.0" + dedent "1.5.3" + envinfo "7.13.0" + execa "5.0.0" + fs-extra "^11.2.0" + get-port "5.1.1" + get-stream "6.0.0" + git-url-parse "14.0.0" + glob-parent "6.0.2" + graceful-fs "4.2.11" + has-unicode "2.0.1" + import-local "3.1.0" + ini "^1.3.8" + init-package-json "6.0.3" inquirer "^8.2.4" - npmlog "^6.0.2" - nx ">=15.4.2 < 16" - typescript "^3 || ^4" + is-ci "3.0.1" + is-stream "2.0.0" + jest-diff ">=29.4.3 < 30" + js-yaml "4.1.0" + libnpmaccess "8.0.6" + libnpmpublish "9.0.9" + load-json-file "6.2.0" + lodash "^4.17.21" + make-dir "4.0.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "11.0.2" + npm-packlist "8.0.2" + npm-registry-fetch "^17.1.0" + nx ">=17.1.2 < 21" + p-map "4.0.0" + p-map-series "2.1.0" + p-pipe "3.1.0" + p-queue "6.6.2" + p-reduce "2.1.0" + p-waterfall "2.1.1" + pacote "^18.0.6" + pify "5.0.0" + read-cmd-shim "4.0.0" + resolve-from "5.0.0" + rimraf "^4.4.1" + semver "^7.3.8" + set-blocking "^2.0.0" + signal-exit "3.0.7" + slash "3.0.0" + ssri "^10.0.6" + string-width "^4.2.3" + tar "6.2.1" + temp-dir "1.0.0" + through "2.3.8" + tinyglobby "0.2.12" + typescript ">=3 < 6" + upath "2.0.1" + uuid "^10.0.0" + validate-npm-package-license "3.0.4" + validate-npm-package-name "5.0.1" + wide-align "1.1.5" + write-file-atomic "5.0.1" + write-pkg "4.0.0" + yargs "17.7.2" + yargs-parser "21.1.1" levn@^0.4.1: version "0.4.1" @@ -5753,62 +5224,63 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -libnpmaccess@^6.0.3: - version "6.0.4" - resolved "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-6.0.4.tgz" - integrity sha512-qZ3wcfIyUoW0+qSFkMBovcTrSGJ3ZeyvpR7d5N9pEYv/kXs8sHP2wiqEIXBKLFrZlmM0kR0RJD7mtfLngtlLag== +libnpmaccess@8.0.6: + version "8.0.6" + resolved "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.6.tgz#73be4c236258babc0a0bca6d3b6a93a6adf937cf" + integrity sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw== dependencies: - aproba "^2.0.0" - minipass "^3.1.1" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" + npm-package-arg "^11.0.2" + npm-registry-fetch "^17.0.1" -libnpmpublish@^6.0.4: - version "6.0.5" - resolved "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-6.0.5.tgz" - integrity sha512-LUR08JKSviZiqrYTDfywvtnsnxr+tOvBU0BF8H+9frt7HMvc6Qn6F8Ubm72g5hDTHbq8qupKfDvDAln2TVPvFg== +libnpmpublish@9.0.9: + version "9.0.9" + resolved "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.9.tgz#e737378c09f09738377d2a276734be35cffb85e2" + integrity sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg== dependencies: - normalize-package-data "^4.0.0" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" + ci-info "^4.0.0" + normalize-package-data "^6.0.1" + npm-package-arg "^11.0.2" + npm-registry-fetch "^17.0.1" + proc-log "^4.2.0" semver "^7.3.7" - ssri "^9.0.0" + sigstore "^2.2.0" + ssri "^10.0.6" -lilconfig@~3.1.3: +lilconfig@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== +lines-and-columns@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" + integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lines-and-columns@~2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz" - integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== - -lint-staged@15.2.11: - version "15.2.11" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.11.tgz#e88440982f4a4c1d55a9a7a839259ec3806bd81b" - integrity sha512-Ev6ivCTYRTGs9ychvpVw35m/bcNDuBN+mnTeObCL5h+boS5WzBEC6LHI4I9F/++sZm1m+J2LEiy0gxL/R9TBqQ== - dependencies: - chalk "~5.3.0" - commander "~12.1.0" - debug "~4.4.0" - execa "~8.0.1" - lilconfig "~3.1.3" - listr2 "~8.2.5" - micromatch "~4.0.8" - pidtree "~0.6.0" - string-argv "~0.3.2" - yaml "~2.6.1" - -listr2@~8.2.5: - version "8.2.5" - resolved "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz#5c9db996e1afeb05db0448196d3d5f64fec2593d" - integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== +lint-staged@16.1.2: + version "16.1.2" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.2.tgz#8cb84daa844f39c7a9790dd2c0caa327125ef059" + integrity sha512-sQKw2Si2g9KUZNY3XNvRuDq4UJqpHwF0/FQzZR2M7I5MvtpWvibikCjUVJzZdGE0ByurEl3KQNvsGetd1ty1/Q== + dependencies: + chalk "^5.4.1" + commander "^14.0.0" + debug "^4.4.1" + lilconfig "^3.1.3" + listr2 "^8.3.3" + micromatch "^4.0.8" + nano-spawn "^1.0.2" + pidtree "^0.6.0" + string-argv "^0.3.2" + yaml "^2.8.0" + +listr2@^8.3.3: + version "8.3.3" + resolved "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz#815fc8f738260ff220981bf9e866b3e11e8121bf" + integrity sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ== dependencies: cli-truncate "^4.0.0" colorette "^2.0.20" @@ -5817,9 +5289,19 @@ listr2@~8.2.5: rfdc "^1.4.1" wrap-ansi "^9.0.0" +load-json-file@6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== + dependencies: + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" + load-json-file@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" @@ -5827,19 +5309,9 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -load-json-file@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz" - integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== - dependencies: - graceful-fs "^4.1.15" - parse-json "^5.0.0" - strip-bom "^4.0.0" - type-fest "^0.6.0" - locate-path@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" @@ -5847,7 +5319,7 @@ locate-path@^2.0.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" @@ -5868,7 +5340,7 @@ locate-path@^7.2.0: lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.clonedeep@^4.5.0: @@ -5878,28 +5350,28 @@ lodash.clonedeep@^4.5.0: lodash.isfunction@^3.0.9: version "3.0.9" - resolved "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz" + resolved "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== lodash.ismatch@^4.4.0: version "4.4.0" - resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz" + resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.kebabcase@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" + resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== lodash.map@^4.5.1: version "4.6.0" - resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz" - integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== lodash.merge@^4.6.2: version "4.6.2" @@ -5908,35 +5380,35 @@ lodash.merge@^4.6.2: lodash.mergewith@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== lodash.snakecase@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz" + resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== lodash.startcase@^4.4.0: version "4.4.0" - resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz" + resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash.upperfirst@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz" + resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.1.0: +log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -5957,20 +5429,15 @@ log-update@^6.1.0: longest@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz" - integrity sha1-eB4YMpaqlPbU2RbcM10NF676I/g= - -loupe@^3.1.0, loupe@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" - integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== + resolved "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" + integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== -lru-cache@^10.0.1: - version "10.2.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== +loupe@^3.1.0, loupe@^3.1.4: + version "3.1.4" + resolved "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz#784a0060545cb38778ffb19ccde44d7870d5fdd9" + integrity sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg== -lru-cache@^10.2.0: +lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.2.2: version "10.4.3" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -5989,22 +5456,10 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: - version "7.14.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz" - integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== - -magic-string@^0.30.11: - version "0.30.13" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz#92438e3ff4946cf54f18247c981e5c161c46683c" - integrity sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -magic-string@^0.30.12: - version "0.30.14" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz#e9bb29870b81cfc1ec3cc656552f5a7fcbf19077" - integrity sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw== +magic-string@^0.30.17: + version "0.30.17" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -6017,58 +5472,47 @@ magicast@^0.3.5: "@babel/types" "^7.25.4" source-map-js "^1.2.0" +make-dir@4.0.0, make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-dir@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: - version "10.2.1" - resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz" - integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== +make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: + version "13.0.1" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" + integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== dependencies: - agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" + http-cache-semantics "^4.1.1" is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" + minipass "^7.0.2" + minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" + proc-log "^4.2.0" promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^9.0.0" + ssri "^10.0.0" map-obj@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== mark.js@8.11.1: @@ -6076,6 +5520,11 @@ mark.js@8.11.1: resolved "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + mdast-util-to-hast@^13.0.0: version "13.2.0" resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" @@ -6093,12 +5542,12 @@ mdast-util-to-hast@^13.0.0: meow@^12.0.1: version "12.1.1" - resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz" + resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== -meow@^8.0.0: +meow@^8.1.2: version "8.1.2" - resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz" + resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== dependencies: "@types/minimist" "^1.2.0" @@ -6118,14 +5567,14 @@ merge-stream@^2.0.0: resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge@^2.1.0: +merge@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz" + resolved "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== micromark-util-character@^2.0.0: @@ -6156,11 +5605,11 @@ micromark-util-symbol@^2.0.0: integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== micromark-util-types@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" - integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== + version "2.0.2" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" + integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@~4.0.8: +micromatch@^4.0.2, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -6170,12 +5619,12 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@~4.0.8: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" @@ -6185,11 +5634,6 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - mimic-function@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" @@ -6197,16 +5641,23 @@ mimic-function@^5.0.0: min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimatch@3.0.5: version "3.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== dependencies: brace-expansion "^1.1.7" +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -6215,22 +5666,36 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: brace-expansion "^1.1.7" minimatch@^5.0.1: - version "5.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz" - integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg== + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.4: +minimatch@^9.0.0, minimatch@^9.0.4: version "9.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" +"minimatch@^9.0.3 || ^10.0.1": + version "10.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa" + integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw== + dependencies: + "@isaacs/brace-expansion" "^5.0.0" + minimist-options@4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" @@ -6239,27 +5704,27 @@ minimist-options@4.1.0: minimist@1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== dependencies: - minipass "^3.0.0" + minipass "^7.0.3" -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== +minipass-fetch@^3.0.0: + version "3.0.5" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== dependencies: - minipass "^3.1.6" + minipass "^7.0.3" minipass-sized "^1.0.3" minizlib "^2.1.2" optionalDependencies: @@ -6267,58 +5732,55 @@ minipass-fetch@^2.0.3: minipass-flush@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: minipass "^3.0.0" -minipass-json-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz" - integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== - dependencies: - jsonparse "^1.3.1" - minipass "^3.0.0" - minipass-pipeline@^1.2.4: version "1.2.4" - resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" minipass-sized@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: +minipass@^3.0.0: version "3.3.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + minipass@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.2: version "7.1.2" resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -minisearch@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/minisearch/-/minisearch-7.1.0.tgz#f5830e9109b5919ee7b291c29a304f381aa68770" - integrity sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA== +minisearch@^7.1.1: + version "7.1.2" + resolved "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz#296ee8d1906cc378f7e57a3a71f07e5205a75df5" + integrity sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -6329,45 +5791,31 @@ mitt@^3.0.1: resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== -mkdirp-infer-owner@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz" - integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== - dependencies: - chownr "^2.0.0" - infer-owner "^1.0.4" - mkdirp "^1.0.3" - mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" + minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -modify-values@^1.0.0: +modify-values@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz" + resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: +ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multimatch@^5.0.0: +multimatch@5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz" + resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== dependencies: "@types/minimatch" "^3.0.3" @@ -6376,20 +5824,30 @@ multimatch@^5.0.0: arrify "^2.0.1" minimatch "^3.0.4" -mute-stream@0.0.8, mute-stream@~0.0.4: +mute-stream@0.0.8: version "0.0.8" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mute-stream@1.0.0: +mute-stream@1.0.0, mute-stream@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== -nanoid@^3.3.7: - version "3.3.8" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== +nano-spawn@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz#9853795681f0e96ef6f39104c2e4347b6ba79bf6" + integrity sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg== + +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +napi-postinstall@^0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz#419697d0288cb524623e422f919624f22a5e4028" + integrity sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg== natural-compare@^1.4.0: version "1.4.0" @@ -6397,70 +5855,58 @@ natural-compare@^1.4.0: integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@^0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + version "0.6.4" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== -neo-async@^2.6.0: +neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -node-addon-api@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== - -node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@2.6.7: version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.3.0: - version "4.6.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== - -node-gyp@^9.0.0: - version "9.3.1" - resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz" - integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== +node-gyp@^10.0.0: + version "10.3.1" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz#1dd1a1a1c6c5c59da1a76aea06a062786b2c8a1a" + integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ== dependencies: env-paths "^2.2.0" - glob "^7.1.4" + exponential-backoff "^3.1.1" + glob "^10.3.10" graceful-fs "^4.2.6" - make-fetch-happen "^10.0.3" - nopt "^6.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" + make-fetch-happen "^13.0.0" + nopt "^7.0.0" + proc-log "^4.1.0" semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" + tar "^6.2.1" + which "^4.0.0" -node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-machine-id@1.1.12: + version "1.1.12" + resolved "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" + integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== +nopt@^7.0.0, nopt@^7.2.1: + version "7.2.1" + resolved "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== dependencies: - abbrev "^1.0.0" + abbrev "^2.0.0" normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -6468,9 +5914,9 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^3.0.0: +normalize-package-data@^3.0.0, normalize-package-data@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" @@ -6478,221 +5924,142 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-package-data@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz" - integrity sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg== - dependencies: - hosted-git-info "^5.0.0" - is-core-module "^2.8.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - -normalize-package-data@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz" - integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== +normalize-package-data@^6.0.0, normalize-package-data@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" + integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== dependencies: hosted-git-info "^7.0.0" - is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" -npm-bundled@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-bundled@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz" - integrity sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw== +npm-bundled@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz#cca73e15560237696254b10170d8f86dad62da25" + integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== dependencies: - npm-normalize-package-bin "^2.0.0" + npm-normalize-package-bin "^3.0.0" -npm-install-checks@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz" - integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA== +npm-install-checks@^6.0.0, npm-install-checks@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== dependencies: semver "^7.1.1" -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-normalize-package-bin@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz" - integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== -npm-package-arg@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.1.tgz" - integrity sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg== +npm-package-arg@11.0.2: + version "11.0.2" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz#1ef8006c4a9e9204ddde403035f7ff7d718251ca" + integrity sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw== dependencies: - hosted-git-info "^3.0.6" - semver "^7.0.0" - validate-npm-package-name "^3.0.0" + hosted-git-info "^7.0.0" + proc-log "^4.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" -npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: - version "9.1.2" - resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz" - integrity sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg== +npm-package-arg@^11.0.0, npm-package-arg@^11.0.2: + version "11.0.3" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz#dae0c21199a99feca39ee4bfb074df3adac87e2d" + integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== dependencies: - hosted-git-info "^5.0.0" - proc-log "^2.0.1" + hosted-git-info "^7.0.0" + proc-log "^4.0.0" semver "^7.3.5" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "^5.0.0" -npm-packlist@^5.1.0, npm-packlist@^5.1.1: - version "5.1.3" - resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz" - integrity sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg== +npm-packlist@8.0.2, npm-packlist@^8.0.0: + version "8.0.2" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz#5b8d1d906d96d21c85ebbeed2cf54147477c8478" + integrity sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA== dependencies: - glob "^8.0.1" - ignore-walk "^5.0.1" - npm-bundled "^2.0.0" - npm-normalize-package-bin "^2.0.0" + ignore-walk "^6.0.4" -npm-pick-manifest@^7.0.0: - version "7.0.2" - resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz" - integrity sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw== +npm-pick-manifest@^9.0.0, npm-pick-manifest@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz#83562afde52b0b07cb6244361788d319ce7e8636" + integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== dependencies: - npm-install-checks "^5.0.0" - npm-normalize-package-bin "^2.0.0" - npm-package-arg "^9.0.0" + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^11.0.0" semver "^7.3.5" -npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.3.0: - version "13.3.1" - resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz" - integrity sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw== +npm-registry-fetch@^17.0.0, npm-registry-fetch@^17.0.1, npm-registry-fetch@^17.1.0: + version "17.1.0" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz#fb69e8e762d456f08bda2f5f169f7638fb92beb1" + integrity sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA== dependencies: - make-fetch-happen "^10.0.6" - minipass "^3.1.6" - minipass-fetch "^2.0.3" - minipass-json-stream "^1.0.1" + "@npmcli/redact" "^2.0.0" + jsonparse "^1.3.1" + make-fetch-happen "^13.0.0" + minipass "^7.0.2" + minipass-fetch "^3.0.0" minizlib "^2.1.2" - npm-package-arg "^9.0.1" - proc-log "^2.0.0" + npm-package-arg "^11.0.0" + proc-log "^4.0.0" npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -npmlog@^6.0.0, npmlog@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz" - integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== - dependencies: - are-we-there-yet "^3.0.0" - console-control-strings "^1.1.0" - gauge "^4.0.3" - set-blocking "^2.0.0" - -nx@15.4.8, "nx@>=15.4.2 < 16": - version "15.4.8" - resolved "https://registry.npmjs.org/nx/-/nx-15.4.8.tgz" - integrity sha512-uwb2EqI1LfCoDIE/YMTV8xdt+VyNirw952JjmMKx85mZiV2wAV9J+LqzC3PXkw5W8OGvWCkajB2uybCpxEdiBg== +"nx@>=17.1.2 < 21": + version "20.8.2" + resolved "https://registry.npmjs.org/nx/-/nx-20.8.2.tgz#c70f504fee1804015034d0f7b2c51871a25bda3a" + integrity sha512-mDKpbH3vEpUFDx0rrLh+tTqLq1PYU8KiD/R7OVZGd1FxQxghx2HOl32MiqNsfPcw6AvKlXhslbwIESV+N55FLQ== dependencies: - "@nrwl/cli" "15.4.8" - "@nrwl/tao" "15.4.8" - "@parcel/watcher" "2.0.4" + "@napi-rs/wasm-runtime" "0.2.4" "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "^3.0.0-rc.18" - "@zkochan/js-yaml" "0.0.6" - axios "^1.0.0" - chalk "4.1.0" + "@yarnpkg/parsers" "3.0.2" + "@zkochan/js-yaml" "0.0.7" + axios "^1.8.3" + chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" - cliui "^7.0.2" - dotenv "~10.0.0" + cliui "^8.0.1" + dotenv "~16.4.5" + dotenv-expand "~11.0.6" enquirer "~2.3.6" - fast-glob "3.2.7" figures "3.2.0" flat "^5.0.2" - fs-extra "^11.1.0" - glob "7.1.4" + front-matter "^4.0.2" ignore "^5.0.4" - js-yaml "4.1.0" + jest-diff "^29.4.1" jsonc-parser "3.2.0" - lines-and-columns "~2.0.3" - minimatch "3.0.5" + lines-and-columns "2.0.3" + minimatch "9.0.3" + node-machine-id "1.1.12" npm-run-path "^4.0.1" open "^8.4.0" - semver "7.3.4" + ora "5.3.0" + resolve.exports "2.0.3" + semver "^7.5.3" string-width "^4.2.3" - strong-log-transformer "^2.1.0" tar-stream "~2.2.0" tmp "~0.2.1" tsconfig-paths "^4.1.2" tslib "^2.3.0" - v8-compile-cache "2.3.0" + yaml "^2.6.0" yargs "^17.6.2" yargs-parser "21.1.1" - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" + optionalDependencies: + "@nx/nx-darwin-arm64" "20.8.2" + "@nx/nx-darwin-x64" "20.8.2" + "@nx/nx-freebsd-x64" "20.8.2" + "@nx/nx-linux-arm-gnueabihf" "20.8.2" + "@nx/nx-linux-arm64-gnu" "20.8.2" + "@nx/nx-linux-arm64-musl" "20.8.2" + "@nx/nx-linux-x64-gnu" "20.8.2" + "@nx/nx-linux-x64-musl" "20.8.2" + "@nx/nx-win32-arm64-msvc" "20.8.2" + "@nx/nx-win32-x64-msvc" "20.8.2" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -6703,18 +6070,11 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - onetime@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" @@ -6722,19 +6082,19 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" -oniguruma-to-es@0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.4.1.tgz#112fbcd5fafe4f635983425a6db88f3e2de37107" - integrity sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ== +oniguruma-to-es@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz#480e4bac4d3bc9439ac0d2124f0725e7a0d76d17" + integrity sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ== dependencies: emoji-regex-xs "^1.0.0" - regex "^5.0.0" - regex-recursion "^4.2.1" + regex "^6.0.1" + regex-recursion "^6.0.2" open@^8.4.0: - version "8.4.0" - resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -6752,6 +6112,20 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +ora@5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" + integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== + dependencies: + bl "^4.0.3" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + log-symbols "^4.0.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + ora@^5.4.1: version "5.4.1" resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -6774,19 +6148,19 @@ os-tmpdir@~1.0.2: p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^1.1.0: version "1.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -6807,14 +6181,14 @@ p-limit@^4.0.0: p-locate@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" @@ -6833,56 +6207,56 @@ p-locate@^6.0.0: dependencies: p-limit "^4.0.0" -p-map-series@^2.1.0: +p-map-series@2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz" + resolved "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== -p-map@^4.0.0: +p-map@4.0.0, p-map@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" -p-pipe@^3.1.0: +p-pipe@3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz" + resolved "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== -p-queue@^6.6.2: +p-queue@6.6.2: version "6.6.2" - resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: eventemitter3 "^4.0.4" p-timeout "^3.2.0" -p-reduce@^2.0.0, p-reduce@^2.1.0: +p-reduce@2.1.0, p-reduce@^2.0.0, p-reduce@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz" + resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== p-timeout@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== dependencies: p-finally "^1.0.0" p-try@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -p-waterfall@^2.1.1: +p-waterfall@2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz" + resolved "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== dependencies: p-reduce "^2.0.0" @@ -6892,31 +6266,27 @@ package-json-from-dist@^1.0.0: resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== -pacote@^13.0.3, pacote@^13.6.1: - version "13.6.2" - resolved "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz" - integrity sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg== - dependencies: - "@npmcli/git" "^3.0.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/promise-spawn" "^3.0.0" - "@npmcli/run-script" "^4.1.0" - cacache "^16.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.6" - mkdirp "^1.0.4" - npm-package-arg "^9.0.0" - npm-packlist "^5.1.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.1" - proc-log "^2.0.0" +pacote@^18.0.0, pacote@^18.0.6: + version "18.0.6" + resolved "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz#ac28495e24f4cf802ef911d792335e378e86fac7" + integrity sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A== + dependencies: + "@npmcli/git" "^5.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/package-json" "^5.1.0" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/run-script" "^8.0.0" + cacache "^18.0.0" + fs-minipass "^3.0.0" + minipass "^7.0.2" + npm-package-arg "^11.0.0" + npm-packlist "^8.0.0" + npm-pick-manifest "^9.0.0" + npm-registry-fetch "^17.0.0" + proc-log "^4.0.0" promise-retry "^2.0.1" - read-package-json "^5.0.0" - read-package-json-fast "^2.0.3" - rimraf "^3.0.2" - ssri "^9.0.0" + sigstore "^2.2.0" + ssri "^10.0.0" tar "^6.1.11" parent-module@^1.0.0: @@ -6926,18 +6296,18 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-conflict-json@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz" - integrity sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA== +parse-conflict-json@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== dependencies: - json-parse-even-better-errors "^2.3.1" - just-diff "^5.0.1" + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" just-diff-apply "^5.2.0" parse-json@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" @@ -6945,7 +6315,7 @@ parse-json@^4.0.0: parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -6954,37 +6324,36 @@ parse-json@^5.0.0, parse-json@^5.2.0: lines-and-columns "^1.1.6" parse-json@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-8.0.0.tgz" - integrity sha512-QtWnjHuun44MCLbq9f2rlcX9Bp9FSsPgQS9nuGcIm3J557b3/CvmYUhwChgJJDlMpuNN0sFRAogzQ8xMitD1oQ== + version "8.1.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz#91cdc7728004e955af9cb734de5684733b24a717" + integrity sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA== dependencies: "@babel/code-frame" "^7.22.13" - index-to-position "^0.1.0" - json-parse-even-better-errors "^3.0.0" - type-fest "^4.6.0" + index-to-position "^0.1.2" + type-fest "^4.7.1" parse-passwd@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== parse-path@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz" - integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== + version "7.1.0" + resolved "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz#41fb513cb122831807a4c7b29c8727947a09d8c6" + integrity sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw== dependencies: protocols "^2.0.0" parse-url@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz" + resolved "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== dependencies: parse-path "^7.0.0" path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: @@ -7007,17 +6376,12 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.11.1: +path-scurry@^1.11.1, path-scurry@^1.6.1: version "1.11.1" resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== @@ -7027,20 +6391,15 @@ path-scurry@^1.11.1: path-type@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== pathval@^2.0.0: version "2.0.0" @@ -7052,44 +6411,54 @@ perfect-debounce@^1.0.0: resolved "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== -picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: +picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pidtree@~0.6.0: +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +pidtree@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== +pify@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + pify@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pify@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== - pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" @@ -7101,34 +6470,37 @@ pkg-dir@^8.0.0: dependencies: find-up-simple "^1.0.0" -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== +postcss-selector-parser@^6.0.10: + version "6.1.2" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" -postcss@^8.4.43, postcss@^8.4.48: - version "8.4.49" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" - integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== +postcss@^8.4.43, postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== dependencies: - nanoid "^3.3.7" + nanoid "^3.3.11" picocolors "^1.1.1" source-map-js "^1.2.1" preact@^10.0.0: - version "10.24.3" - resolved "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz#086386bd47071e3b45410ef20844c21e23828f64" - integrity sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA== + version "10.26.4" + resolved "https://registry.npmjs.org/preact/-/preact-10.26.4.tgz#b514f4249453a4247c82ff6d1267d59b7d78f9f9" + integrity sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w== prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^2.8.8: - version "2.8.8" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3.5.3: + version "3.6.2" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== pretty-format@^29.7.0: version "29.7.0" @@ -7139,70 +6511,70 @@ pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" -proc-log@^2.0.0, proc-log@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz" - integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== +proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" + integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +proggy@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz#154bb0e41d3125b518ef6c79782455c2c47d94e1" + integrity sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A== + promise-all-reject-late@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz" + resolved "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== -promise-call-limit@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz" - integrity sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q== +promise-call-limit@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz#524b7f4b97729ff70417d93d24f46f0265efa4f9" + integrity sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw== promise-inflight@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" + resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== dependencies: err-code "^2.0.2" retry "^0.12.0" -promzard@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz" - integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== +promzard@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz#2226e7c6508b1da3471008ae17066a7c3251e660" + integrity sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ== dependencies: - read "1" - -property-information@^6.0.0: - version "6.5.0" - resolved "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" - integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + read "^3.0.1" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== +property-information@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz#3508a6d6b0b8eb3ca6eb2c6623b164d2ed2ab112" + integrity sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg== protocols@^2.0.0, protocols@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz" - integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== + version "2.0.2" + resolved "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz#822e8fcdcb3df5356538b3e91bfd890b067fd0a4" + integrity sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ== proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -7212,24 +6584,14 @@ punycode@^2.1.0: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -q@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - quick-lru@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== react-is@^18.0.0: @@ -7237,32 +6599,22 @@ react-is@^18.0.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -read-cmd-shim@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz" - integrity sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g== - -read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== - dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" +read-cmd-shim@4.0.0, read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== -read-package-json@^5.0.0, read-package-json@^5.0.1: - version "5.0.2" - resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz" - integrity sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q== +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== dependencies: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^2.0.0" + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" read-pkg-up@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" @@ -7270,7 +6622,7 @@ read-pkg-up@^3.0.0: read-pkg-up@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: find-up "^4.1.0" @@ -7279,7 +6631,7 @@ read-pkg-up@^7.0.1: read-pkg@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" @@ -7288,7 +6640,7 @@ read-pkg@^3.0.0: read-pkg@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" @@ -7309,29 +6661,20 @@ read-pkg@^9.0.1: read-yaml-file@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-2.1.0.tgz" + resolved "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-2.1.0.tgz#c5866712db9ef5343b4d02c2413bada53c41c4a9" integrity sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ== dependencies: js-yaml "^4.0.0" strip-bom "^4.0.0" -read@1, read@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" - integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== - dependencies: - mute-stream "~0.0.4" - -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +read@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/read/-/read-3.0.1.tgz#926808f0f7c83fa95f1ef33c0e2c09dbb28fd192" + integrity sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw== dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" + mute-stream "^1.0.0" -readable-stream@^3.4.0: +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -7341,9 +6684,9 @@ readable-stream@^3.4.0: util-deprecate "^1.0.1" readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -7353,28 +6696,18 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdir-scoped-modules@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - redent@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" strip-indent "^3.0.0" -regex-recursion@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.2.1.tgz#024ee28593b8158e568307b99bf1b7a3d5ea31e9" - integrity sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA== +regex-recursion@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz#a0b1977a74c87f073377b938dbedfab2ea582b33" + integrity sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg== dependencies: regex-utilities "^2.3.0" @@ -7383,26 +6716,16 @@ regex-utilities@^2.3.0: resolved "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== -regex@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/regex/-/regex-5.0.2.tgz#291d960467e6499a79ceec022d20a4e0df67c54f" - integrity sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ== +regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz#282fa4435d0c700b09c0eb0982b602e05ab6a34f" + integrity sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA== dependencies: regex-utilities "^2.3.0" -regexp.prototype.flags@^1.5.2: - version "1.5.3" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" - integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.2" - require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: @@ -7412,28 +6735,33 @@ require-from-string@^2.0.2: resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== dependencies: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve-pkg@^2.0.0: version "2.0.0" @@ -7442,12 +6770,17 @@ resolve-pkg@^2.0.0: dependencies: resolve-from "^5.0.0" -resolve@^1.10.0, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== +resolve.exports@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== + +resolve@^1.10.0: + version "1.22.10" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -7469,56 +6802,88 @@ restore-cursor@^5.0.0: retry@^0.12.0: version "0.12.0" - resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rfdc@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== +rimraf@^4.4.1: + version "4.4.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" + integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== dependencies: - glob "^7.1.3" + glob "^9.2.0" rollup@^4.20.0: - version "4.27.4" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz#b23e4ef4fe4d0d87f5237dacf63f95a499503897" - integrity sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw== + version "4.43.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.43.0.tgz#275c09119eb7eaf0c3dea040523b81ef43c57b8c" + integrity sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg== + dependencies: + "@types/estree" "1.0.7" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.43.0" + "@rollup/rollup-android-arm64" "4.43.0" + "@rollup/rollup-darwin-arm64" "4.43.0" + "@rollup/rollup-darwin-x64" "4.43.0" + "@rollup/rollup-freebsd-arm64" "4.43.0" + "@rollup/rollup-freebsd-x64" "4.43.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.43.0" + "@rollup/rollup-linux-arm-musleabihf" "4.43.0" + "@rollup/rollup-linux-arm64-gnu" "4.43.0" + "@rollup/rollup-linux-arm64-musl" "4.43.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.43.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.43.0" + "@rollup/rollup-linux-riscv64-gnu" "4.43.0" + "@rollup/rollup-linux-riscv64-musl" "4.43.0" + "@rollup/rollup-linux-s390x-gnu" "4.43.0" + "@rollup/rollup-linux-x64-gnu" "4.43.0" + "@rollup/rollup-linux-x64-musl" "4.43.0" + "@rollup/rollup-win32-arm64-msvc" "4.43.0" + "@rollup/rollup-win32-ia32-msvc" "4.43.0" + "@rollup/rollup-win32-x64-msvc" "4.43.0" + fsevents "~2.3.2" + +rollup@^4.43.0: + version "4.50.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz#6f0717c34aacc65cc727eeaaaccc2afc4e4485fd" + integrity sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA== dependencies: - "@types/estree" "1.0.6" + "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.27.4" - "@rollup/rollup-android-arm64" "4.27.4" - "@rollup/rollup-darwin-arm64" "4.27.4" - "@rollup/rollup-darwin-x64" "4.27.4" - "@rollup/rollup-freebsd-arm64" "4.27.4" - "@rollup/rollup-freebsd-x64" "4.27.4" - "@rollup/rollup-linux-arm-gnueabihf" "4.27.4" - "@rollup/rollup-linux-arm-musleabihf" "4.27.4" - "@rollup/rollup-linux-arm64-gnu" "4.27.4" - "@rollup/rollup-linux-arm64-musl" "4.27.4" - "@rollup/rollup-linux-powerpc64le-gnu" "4.27.4" - "@rollup/rollup-linux-riscv64-gnu" "4.27.4" - "@rollup/rollup-linux-s390x-gnu" "4.27.4" - "@rollup/rollup-linux-x64-gnu" "4.27.4" - "@rollup/rollup-linux-x64-musl" "4.27.4" - "@rollup/rollup-win32-arm64-msvc" "4.27.4" - "@rollup/rollup-win32-ia32-msvc" "4.27.4" - "@rollup/rollup-win32-x64-msvc" "4.27.4" + "@rollup/rollup-android-arm-eabi" "4.50.1" + "@rollup/rollup-android-arm64" "4.50.1" + "@rollup/rollup-darwin-arm64" "4.50.1" + "@rollup/rollup-darwin-x64" "4.50.1" + "@rollup/rollup-freebsd-arm64" "4.50.1" + "@rollup/rollup-freebsd-x64" "4.50.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.50.1" + "@rollup/rollup-linux-arm-musleabihf" "4.50.1" + "@rollup/rollup-linux-arm64-gnu" "4.50.1" + "@rollup/rollup-linux-arm64-musl" "4.50.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.50.1" + "@rollup/rollup-linux-ppc64-gnu" "4.50.1" + "@rollup/rollup-linux-riscv64-gnu" "4.50.1" + "@rollup/rollup-linux-riscv64-musl" "4.50.1" + "@rollup/rollup-linux-s390x-gnu" "4.50.1" + "@rollup/rollup-linux-x64-gnu" "4.50.1" + "@rollup/rollup-linux-x64-musl" "4.50.1" + "@rollup/rollup-openharmony-arm64" "4.50.1" + "@rollup/rollup-win32-arm64-msvc" "4.50.1" + "@rollup/rollup-win32-ia32-msvc" "4.50.1" + "@rollup/rollup-win32-x64-msvc" "4.50.1" fsevents "~2.3.2" run-async@^2.4.0: version "2.4.1" - resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-async@^3.0.0: @@ -7534,25 +6899,15 @@ run-parallel@^1.1.9: queue-microtask "^1.2.2" rxjs@^7.2.0, rxjs@^7.5.5, rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + version "7.8.2" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== dependencies: tslib "^2.1.0" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-buffer@~5.2.0: @@ -7560,18 +6915,9 @@ safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== "semver@2 || 3 || 4 || 5", semver@^5.6.0: @@ -7579,60 +6925,24 @@ safe-regex-test@^1.0.3: resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.3.4: - version "7.3.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.1: +semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.7.1, semver@^7.7.2: + version "7.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" @@ -7649,36 +6959,28 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shiki@1.23.1, shiki@^1.22.2: - version "1.23.1" - resolved "https://registry.npmjs.org/shiki/-/shiki-1.23.1.tgz#02f149e8f2592509e701f3a806fd4f3dd64d17e9" - integrity sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig== - dependencies: - "@shikijs/core" "1.23.1" - "@shikijs/engine-javascript" "1.23.1" - "@shikijs/engine-oniguruma" "1.23.1" - "@shikijs/types" "1.23.1" - "@shikijs/vscode-textmate" "^9.3.0" +shiki@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz#09d01ebf3b0b06580431ce3ddc023320442cf223" + integrity sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ== + dependencies: + "@shikijs/core" "2.5.0" + "@shikijs/engine-javascript" "2.5.0" + "@shikijs/engine-oniguruma" "2.5.0" + "@shikijs/langs" "2.5.0" + "@shikijs/themes" "2.5.0" + "@shikijs/types" "2.5.0" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" -side-channel@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - siginfo@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@3.0.7, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1, signal-exit@^4.1.0: @@ -7686,14 +6988,26 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -slash@^3.0.0: +sigstore@^2.2.0: + version "2.3.1" + resolved "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz#0755dd2cc4820f2e922506da54d3d628e13bfa39" + integrity sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/sign" "^2.3.2" + "@sigstore/tuf" "^2.3.4" + "@sigstore/verify" "^1.2.1" + +slash@3.0.0, slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" @@ -7709,36 +7023,36 @@ slice-ansi@^7.1.0: smart-buffer@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== +socks-proxy-agent@^8.0.3: + version "8.0.5" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" -socks@^2.6.2: - version "2.7.1" - resolved "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== +socks@^2.8.3: + version "2.8.5" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz#bfe18f5ead1efc93f5ec90c79fa8bdccbcee2e64" + integrity sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" sort-keys@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz" + resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== dependencies: is-plain-obj "^1.0.0" -sort-keys@^4.0.0, sort-keys@^4.2.0: +sort-keys@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz" + resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz#6b7638cee42c506fff8c1cecde7376d21315be18" integrity sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== dependencies: is-plain-obj "^2.0.0" @@ -7750,7 +7064,7 @@ source-map-js@^1.2.0, source-map-js@^1.2.1: source-map@^0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== space-separated-tokens@^2.0.0: @@ -7759,95 +7073,103 @@ space-separated-tokens@^2.0.0: integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + version "3.0.21" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" + integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== speakingurl@^14.0.1: version "14.0.1" resolved "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53" integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ== -split2@^3.0.0: +split2@^3.2.2: version "3.2.2" - resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" + resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" split2@^4.0.0: version "4.2.0" - resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" + resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== -split@^1.0.0: +split@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/split/-/split-1.0.1.tgz" + resolved "https://registry.npmjs.org/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== dependencies: through "2" +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@^9.0.0, ssri@^9.0.1: - version "9.0.1" - resolved "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== +ssri@^10.0.0, ssri@^10.0.6: + version "10.0.6" + resolved "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== dependencies: - minipass "^3.1.1" + minipass "^7.0.3" -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" +stable-hash-x@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.1.1.tgz#1dc602f65183ef049a44a9be4fce249a4c71fc84" + integrity sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ== + +stable-hash-x@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9" + integrity sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ== stackback@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== -std-env@^3.8.0: - version "3.8.0" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5" - integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== +std-env@^3.9.0: + version "3.9.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== -streamx@^2.13.0, streamx@^2.15.0: - version "2.15.8" - resolved "https://registry.npmjs.org/streamx/-/streamx-2.15.8.tgz#5471145b54ee43b5088877023d8d0a2a77f95d8d" - integrity sha512-6pwMeMY/SuISiRsuS8TeIrAzyFbG5gGPHFQsYjUr/pbBadaL1PCWmzKw+CHZSwainfvcF6Si6cVLq4XTEwswFQ== +streamx@^2.15.0, streamx@^2.21.0: + version "2.22.0" + resolved "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== dependencies: - fast-fifo "^1.1.0" - queue-tick "^1.0.1" + fast-fifo "^1.3.2" + text-decoder "^1.1.0" optionalDependencies: bare-events "^2.2.0" -string-argv@~0.3.2: +string-argv@^0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== @@ -7863,7 +7185,7 @@ string-argv@~0.3.2: "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -7880,42 +7202,14 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" string-width@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz" - integrity sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw== + version "7.2.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -7925,7 +7219,7 @@ string_decoder@^1.1.1: string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" @@ -7954,14 +7248,14 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom@4.0.0, strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-bom@^3.0.0: @@ -7971,22 +7265,17 @@ strip-bom@^3.0.0: strip-comments-strings@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/strip-comments-strings/-/strip-comments-strings-1.2.0.tgz" + resolved "https://registry.npmjs.org/strip-comments-strings/-/strip-comments-strings-1.2.0.tgz#b19a1382e8f69a704ef61ad5069c29721c20aaad" integrity sha512-zwF4bmnyEjZwRhaak9jUWNxc0DoeKBJ7lwSN/LEc8dQXZcUFG6auaaTQJokQWXopLdM3iTx01nQT8E4aL29DAQ== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" @@ -7996,19 +7285,17 @@ strip-json-comments@3.1.1, strip-json-comments@^3.0.1, strip-json-comments@^3.1. resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strong-log-transformer@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz" - integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== +strip-literal@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz#ce9c452a91a0af2876ed1ae4e583539a353df3fc" + integrity sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA== dependencies: - duplexer "^0.1.1" - minimist "^1.2.0" - through "^2.3.4" + js-tokens "^9.0.1" superjson@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz#9377a7fa80fedb10c851c9dbffd942d4bcf79733" - integrity sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA== + version "2.2.2" + resolved "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz#9d52bf0bf6b5751a3c3472f1292e714782ba3173" + integrity sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q== dependencies: copy-anything "^3.0.2" @@ -8037,20 +7324,20 @@ tabbable@^6.2.0: integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== tar-fs@^3.0.5: - version "3.0.6" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" - integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== + version "3.1.1" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz#4f164e59fb60f103d472360731e8c6bb4a7fe9ef" + integrity sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg== dependencies: pump "^3.0.0" tar-stream "^3.1.5" optionalDependencies: - bare-fs "^2.1.1" - bare-path "^2.1.0" + bare-fs "^4.0.1" + bare-path "^3.0.0" tar-stream@^3.1.5: - version "3.1.6" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz" - integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== + version "3.1.7" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== dependencies: b4a "^1.6.4" fast-fifo "^1.2.0" @@ -8058,7 +7345,7 @@ tar-stream@^3.1.5: tar-stream@~2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -8067,7 +7354,7 @@ tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: +tar@6.2.1, tar@^6.1.11, tar@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== @@ -8079,9 +7366,9 @@ tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -temp-dir@^1.0.0: +temp-dir@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== test-exclude@^7.0.1: @@ -8093,60 +7380,89 @@ test-exclude@^7.0.1: glob "^10.4.1" minimatch "^9.0.4" +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + text-extensions@^1.0.0: version "1.9.0" - resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz" + resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== text-extensions@^2.0.0: version "2.4.0" - resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz" + resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== through2@^2.0.0: version "2.0.5" - resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: +through@2, through@2.3.8, "through@>=2.2.7 <3", through@^2.3.6: version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tinybench@^2.9.0: version "2.9.0" resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== -tinyexec@^0.3.0, tinyexec@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz#0ab0daf93b43e2c211212396bdb836b468c97c98" - integrity sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== -tinypool@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" - integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== +tinyexec@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz#70c31ab7abbb4aea0a24f55d120e5990bfa1e0b1" + integrity sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw== -tinyrainbow@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" - integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== +tinyglobby@0.2.12: + version "0.2.12" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz#ac941a42e0c5773bd0b5d08f32de82e74a1a61b5" + integrity sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww== + dependencies: + fdir "^6.4.3" + picomatch "^4.0.2" -tinyspy@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" - integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== +tinyglobby@^0.2.14: + version "0.2.14" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" + integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + +tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +tinypool@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== + +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== + +tinyspy@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz#d1d0f0602f4c15f1aae083a34d6d0df3363b1b52" + integrity sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A== tmp@^0.0.33: version "0.0.33" @@ -8156,9 +7472,9 @@ tmp@^0.0.33: os-tmpdir "~1.0.2" tmp@^0.2.1, tmp@~0.2.1: - version "0.2.3" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + version "0.2.4" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz#c6db987a2ccc97f812f17137b36af2b6521b0d13" + integrity sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ== to-regex-range@^5.0.1: version "5.0.1" @@ -8169,13 +7485,13 @@ to-regex-range@^5.0.1: tr46@~0.0.3: version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -treeverse@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/treeverse/-/treeverse-2.0.0.tgz" - integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A== +treeverse@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" + integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== trim-lines@^3.0.0: version "3.0.1" @@ -8184,42 +7500,36 @@ trim-lines@^3.0.0: trim-newlines@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -ts-api-utils@^1.3.0: - version "1.4.3" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" - integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" +ts-api-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== tsconfig-paths@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz" - integrity sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw== + version "4.2.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== dependencies: json5 "^2.2.2" minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.1.0: - version "2.6.3" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== +tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tslib@^2.3.0, tslib@^2.4.0: - version "2.4.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tuf-js@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz#fdd8794b644af1a75c7aaa2b197ddffeb2911b56" + integrity sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA== + dependencies: + "@tufjs/models" "2.0.1" + debug "^4.3.4" + make-fetch-happen "^13.0.1" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -8228,14 +7538,9 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - type-fest@^0.18.0: version "0.18.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== type-fest@^0.21.3: @@ -8245,131 +7550,65 @@ type-fest@^0.21.3: type-fest@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== type-fest@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-fest@^0.8.1: version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.6.0.tgz" - integrity sha512-rLjWJzQFOq4xw7MgJrCZ6T1jIOvvYElXT12r+y0CC6u67hegDHaxcPqb2fZHOGlqxugGQPNB1EnTezjBetkwkw== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" +type-fest@^4.6.0, type-fest@^4.7.1: + version "4.37.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz#7cf008bf77b63a33f7ca014fa2a3f09fd69e8937" + integrity sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg== typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -"typescript@^3 || ^4": - version "4.9.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== - -typescript@^5.2.2: - version "5.7.2" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" - integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== +"typescript@>=3 < 6", typescript@^5.2.2: + version "5.8.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + version "3.19.3" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== undici-types@~5.26.4: version "5.26.5" resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== +undici-types@~7.8.0: + version "7.8.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz#de00b85b710c54122e44fbfd911f8d70174cd294" + integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== unicorn-magic@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz" + resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== -unique-filename@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz" - integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== dependencies: - unique-slug "^3.0.0" + unique-slug "^4.0.0" -unique-slug@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== dependencies: imurmurhash "^0.1.4" @@ -8412,27 +7651,54 @@ unist-util-visit@^5.0.0: unist-util-visit-parents "^6.0.0" universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + version "6.0.1" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -upath@^2.0.1: +unrs-resolver@^1.7.11, unrs-resolver@^1.9.2: + version "1.9.2" + resolved "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.2.tgz#1a7c73335a5e510643664d7bb4bb6f5c28782e36" + integrity sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA== + dependencies: + napi-postinstall "^0.2.4" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.9.2" + "@unrs/resolver-binding-android-arm64" "1.9.2" + "@unrs/resolver-binding-darwin-arm64" "1.9.2" + "@unrs/resolver-binding-darwin-x64" "1.9.2" + "@unrs/resolver-binding-freebsd-x64" "1.9.2" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.9.2" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.9.2" + "@unrs/resolver-binding-linux-arm64-gnu" "1.9.2" + "@unrs/resolver-binding-linux-arm64-musl" "1.9.2" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.9.2" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.9.2" + "@unrs/resolver-binding-linux-riscv64-musl" "1.9.2" + "@unrs/resolver-binding-linux-s390x-gnu" "1.9.2" + "@unrs/resolver-binding-linux-x64-gnu" "1.9.2" + "@unrs/resolver-binding-linux-x64-musl" "1.9.2" + "@unrs/resolver-binding-wasm32-wasi" "1.9.2" + "@unrs/resolver-binding-win32-arm64-msvc" "1.9.2" + "@unrs/resolver-binding-win32-ia32-msvc" "1.9.2" + "@unrs/resolver-binding-win32-x64-msvc" "1.9.2" + +upath@2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz" + resolved "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== -update-browserslist-db@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" - integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: escalade "^3.2.0" - picocolors "^1.1.0" + picocolors "^1.1.1" uri-js@^4.2.2: version "4.4.1" @@ -8441,42 +7707,28 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache@2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: +validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz" - integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== - dependencies: - builtins "^1.0.3" - -validate-npm-package-name@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz" - integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== - dependencies: - builtins "^5.0.0" +validate-npm-package-name@5.0.1, validate-npm-package-name@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== vfile-message@^4.0.0: version "4.0.2" @@ -8494,21 +7746,35 @@ vfile@^6.0.0: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -vite-node@2.1.8: - version "2.1.8" - resolved "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz#9495ca17652f6f7f95ca7c4b568a235e0c8dbac5" - integrity sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== +vite-node@3.2.4: + version "3.2.4" + resolved "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz#f3676d94c4af1e76898c162c92728bca65f7bb07" + integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== dependencies: cac "^6.7.14" - debug "^4.3.7" - es-module-lexer "^1.5.4" - pathe "^1.1.2" - vite "^5.0.0" + debug "^4.4.1" + es-module-lexer "^1.7.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + +"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": + version "7.1.5" + resolved "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz#4dbcb48c6313116689be540466fc80faa377be38" + integrity sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ== + dependencies: + esbuild "^0.25.0" + fdir "^6.5.0" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.15" + optionalDependencies: + fsevents "~2.3.3" -vite@^5.0.0, vite@^5.4.10: - version "5.4.11" - resolved "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz#3b415cd4aed781a356c1de5a9ebafb837715f6e5" - integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== +vite@^5.4.14: + version "5.4.20" + resolved "https://registry.npmjs.org/vite/-/vite-5.4.20.tgz#3267a5e03f21212f44edfd72758138e8fcecd76a" + integrity sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g== dependencies: esbuild "^0.21.3" postcss "^8.4.43" @@ -8516,138 +7782,121 @@ vite@^5.0.0, vite@^5.4.10: optionalDependencies: fsevents "~2.3.3" -vitepress-plugin-tabs@^0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/vitepress-plugin-tabs/-/vitepress-plugin-tabs-0.5.0.tgz#2b193a72ed36b9fcd63e3907d3044fe7b6cf3e4e" - integrity sha512-SIhFWwGsUkTByfc2b279ray/E0Jt8vDTsM1LiHxmCOBAEMmvzIBZSuYYT1DpdDTiS3SuJieBheJkYnwCq/yD9A== +vitepress-plugin-tabs@^0.7.0: + version "0.7.1" + resolved "https://registry.npmjs.org/vitepress-plugin-tabs/-/vitepress-plugin-tabs-0.7.1.tgz#73e0537fee5bac1fa00c941165241eb941b13a80" + integrity sha512-jxJvsicxnMSIYX9b8mAFLD2nwyKUcMO10dEt4nDSbinZhM8cGvAmMFOHPdf6TBX6gYZRl+/++/iYHtoM14fERQ== vitepress@^1.3.4: - version "1.5.0" - resolved "https://registry.npmjs.org/vitepress/-/vitepress-1.5.0.tgz#61870b27dc9a580e46cea92989f64cdcb550dc23" - integrity sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g== - dependencies: - "@docsearch/css" "^3.6.2" - "@docsearch/js" "^3.6.2" - "@iconify-json/simple-icons" "^1.2.10" - "@shikijs/core" "^1.22.2" - "@shikijs/transformers" "^1.22.2" - "@shikijs/types" "^1.22.2" + version "1.6.3" + resolved "https://registry.npmjs.org/vitepress/-/vitepress-1.6.3.tgz#4e4662ce2ad55ef64604ecf4f96231a8da2fe9ba" + integrity sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw== + dependencies: + "@docsearch/css" "3.8.2" + "@docsearch/js" "3.8.2" + "@iconify-json/simple-icons" "^1.2.21" + "@shikijs/core" "^2.1.0" + "@shikijs/transformers" "^2.1.0" + "@shikijs/types" "^2.1.0" "@types/markdown-it" "^14.1.2" - "@vitejs/plugin-vue" "^5.1.4" - "@vue/devtools-api" "^7.5.4" - "@vue/shared" "^3.5.12" - "@vueuse/core" "^11.1.0" - "@vueuse/integrations" "^11.1.0" - focus-trap "^7.6.0" + "@vitejs/plugin-vue" "^5.2.1" + "@vue/devtools-api" "^7.7.0" + "@vue/shared" "^3.5.13" + "@vueuse/core" "^12.4.0" + "@vueuse/integrations" "^12.4.0" + focus-trap "^7.6.4" mark.js "8.11.1" - minisearch "^7.1.0" - shiki "^1.22.2" - vite "^5.4.10" - vue "^3.5.12" - -vitest@^2.1.8: - version "2.1.8" - resolved "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz#2e6a00bc24833574d535c96d6602fb64163092fa" - integrity sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== - dependencies: - "@vitest/expect" "2.1.8" - "@vitest/mocker" "2.1.8" - "@vitest/pretty-format" "^2.1.8" - "@vitest/runner" "2.1.8" - "@vitest/snapshot" "2.1.8" - "@vitest/spy" "2.1.8" - "@vitest/utils" "2.1.8" - chai "^5.1.2" - debug "^4.3.7" - expect-type "^1.1.0" - magic-string "^0.30.12" - pathe "^1.1.2" - std-env "^3.8.0" + minisearch "^7.1.1" + shiki "^2.1.0" + vite "^5.4.14" + vue "^3.5.13" + +vitest@^3.0.0: + version "3.2.4" + resolved "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz#0637b903ad79d1539a25bc34c0ed54b5c67702ea" + integrity sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/expect" "3.2.4" + "@vitest/mocker" "3.2.4" + "@vitest/pretty-format" "^3.2.4" + "@vitest/runner" "3.2.4" + "@vitest/snapshot" "3.2.4" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + debug "^4.4.1" + expect-type "^1.2.1" + magic-string "^0.30.17" + pathe "^2.0.3" + picomatch "^4.0.2" + std-env "^3.9.0" tinybench "^2.9.0" - tinyexec "^0.3.1" - tinypool "^1.0.1" - tinyrainbow "^1.2.0" - vite "^5.0.0" - vite-node "2.1.8" + tinyexec "^0.3.2" + tinyglobby "^0.2.14" + tinypool "^1.1.1" + tinyrainbow "^2.0.0" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite-node "3.2.4" why-is-node-running "^2.3.0" -vue-demi@>=0.14.10: - version "0.14.10" - resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04" - integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg== - -vue@^3.5.0, vue@^3.5.12: - version "3.5.13" - resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz#9f760a1a982b09c0c04a867903fc339c9f29ec0a" - integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== +vue@^3.5.0, vue@^3.5.13: + version "3.5.18" + resolved "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz#3d622425ad1391a2b0138323211ec784f4415686" + integrity sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA== dependencies: - "@vue/compiler-dom" "3.5.13" - "@vue/compiler-sfc" "3.5.13" - "@vue/runtime-dom" "3.5.13" - "@vue/server-renderer" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/compiler-dom" "3.5.18" + "@vue/compiler-sfc" "3.5.18" + "@vue/runtime-dom" "3.5.18" + "@vue/server-renderer" "3.5.18" + "@vue/shared" "3.5.18" -walk-up-path@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz" - integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== +walk-up-path@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" + integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - which@^1.2.14: version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^2.0.1, which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +which@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + why-is-node-running@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" @@ -8656,21 +7905,21 @@ why-is-node-running@^2.3.0: siginfo "^2.0.0" stackback "0.0.2" -wide-align@^1.1.5: +wide-align@1.1.5: version "1.1.5" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" word-wrap@^1.0.3, word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": @@ -8682,7 +7931,7 @@ wordwrap@^1.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -8693,7 +7942,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -8711,7 +7960,7 @@ wrap-ansi@^8.1.0: wrap-ansi@^9.0.0: version "9.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== dependencies: ansi-styles "^6.2.1" @@ -8723,44 +7972,26 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@5.0.1, write-file-atomic@^5.0.0, write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + write-file-atomic@^2.4.2: version "2.4.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -write-file-atomic@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - write-json-file@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz" + resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== dependencies: detect-indent "^5.0.0" @@ -8770,21 +8001,9 @@ write-json-file@^3.2.0: sort-keys "^2.0.0" write-file-atomic "^2.4.2" -write-json-file@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz" - integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== - dependencies: - detect-indent "^6.0.0" - graceful-fs "^4.1.15" - is-plain-obj "^2.0.0" - make-dir "^3.0.0" - sort-keys "^4.0.0" - write-file-atomic "^3.0.0" - -write-pkg@^4.0.0: +write-pkg@4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz" + resolved "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== dependencies: sort-keys "^2.0.0" @@ -8801,12 +8020,12 @@ write-yaml-file@^5.0.0: xtend@~4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: @@ -8819,42 +8038,24 @@ yallist@^4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@~2.6.1: - version "2.6.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" - integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== - -yargs-parser@20.2.4, yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== +yaml@^2.6.0, yaml@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" + integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== yargs-parser@21.1.1, yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^17.0.0, yargs@^17.6.2: +yargs@17.7.2, yargs@^17.0.0, yargs@^17.6.2: version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -8865,15 +8066,28 @@ yargs@^17.0.0, yargs@^17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + version "1.1.1" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== yoctocolors-cjs@^2.1.2: version "2.1.2"