[
  {
    "path": ".codesandbox/ci.json",
    "content": "{\n  \"node\": \"18\",\n  \"packages\": [\"@alias/*\", \"@commitlint/*\"],\n  \"sandboxes\": []\n}\n"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "content": "{\n  \"name\": \"commitlint-dev\",\n  \"dockerComposeFile\": [\"../compose.yaml\"],\n  \"service\": \"commitlint\",\n  \"workspaceFolder\": \"/root/repo\",\n  \"shutdownAction\": \"stopCompose\",\n  \"customizations\": {\n    \"vscode\": {\n      \"extensions\": [\n        \"editorconfig.editorconfig\",\n        \"esbenp.prettier-vscode\",\n        \"ms-azuretools.vscode-docker\",\n        \"ms-vsliveshare.vsliveshare-pack\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "[*]\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nindent_style = tab\n\n[{.*rc,*.yml,*.md,*.json,*.svg}]\nindent_style = space\n\n[*.md]\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n- Using welcoming and inclusive language\n- Being respectful of differing viewpoints and experiences\n- Gracefully accepting constructive criticism\n- Focusing on what is best for the community\n- Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n- The use of sexualized language or imagery and unwelcome sexual attention or advances\n- Trolling, insulting/derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or electronic address, without explicit permission\n- Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@mario-nebl.de. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "> Lint commit messages\n\n# commitlint\n\nYeay! You want to contribute to commitlint. That's amazing!\nTo smoothen everyone's experience involved with the project please take note of the following guidelines and rules.\n\n## Found an Issue?\n\nThank you for reporting any issues you find. We do our best to test and make commitlint as solid as possible, but any reported issue is a real help.\n\n> commitlint issues\n\nPlease follow these guidelines when reporting issues:\n\n- Provide a title in the format of `<Error> when <Task>`\n- Tag your issue with the tag `bug`\n- Provide a short summary of what you are trying to do\n- Provide the log of the encountered error if applicable\n- Provide the exact version of commitlint. Check `npm ls @commitlint/cli` when in doubt\n- Be awesome and consider contributing a [pull request](#want-to-contribute)\n\n## Want to contribute?\n\nYou consider contributing changes to commitlint – we dig that!\nPlease consider these guidelines when filing a pull request:\n\n> commitlint pull requests\n\n- Follow the [Coding Rules](#coding-rules)\n- Follow the [Commit Rules](#commit-rules)\n- Make sure you rebased the current master branch when filing the pull request\n- Squash your commits when filing the pull request\n- Provide a short title with a maximum of 100 characters\n- Provide a more detailed description containing\n  _ What you want to achieve\n  _ What you changed\n  _ What you added\n  _ What you removed\n\n### Coding Rules\n\nTo keep the code base of commitlint neat and tidy the following rules apply to every change\n\n> Coding standards\n\n- `prettier` is king\n- Favor micro library over swiss army knives (rimraf, ncp vs. fs-extra)\n- Be awesome\n\n### Commit Rules\n\nTo help everyone with understanding the commit history of commitlint the following commit rules are enforced.\nTo make your life easier commitlint is commitizen-friendly and provides the npm run-script `commit`.\n\n> Commit standards\n\n- [conventional-changelog](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/prompt)\n- husky commit message hook available\n- present tense\n- maximum of 100 characters\n- message format of `$type($scope): $message`\n\n### Environment setup\n\nThis project uses `yarn`, so be sure that it is available in your shell environment.\n\nAfter cloning the repo run\n\n```sh\nyarn install\n```\n\n### Testing\n\nFrom the project root directory, use the following commands to run the test suite\n\n```sh\nyarn build\nyarn test\n```\n\n### Documentation updates\n\nDocumentation uses `vitepress`.\nTo run and edit the documentation locally run:\n\n```sh\nyarn docs-dev\n```\n\nTo have a preview of the deployed doc run:\n\n```sh\nyarn docs-build\nyarn docs-serve\n```\n\nFor more information refer to [vitepress documentation](https://vitepress.dev).\n\n## Package dependency overview\n\n![commitlint-dependencies](https://user-images.githubusercontent.com/4248851/58385093-34b79780-7feb-11e9-8f27-bffc4aca3eba.png)\n\n(Partly outdated)\n\n## Publishing a release\n\n```sh\nnpm login\nmise install\n```\n\n- [mise](https://mise.jdx.dev/)\n\n```sh\nyarn clean\nyarn install\nyarn build\nyarn test\nyarn run publish --otp <one-time password>\n```\n\nIf something in between fails (like a new package was added and needs to be published for the\nfirst time but you forgot) you can use `lerna publish from-package` to publish anything that\nhas not been published yet.\n\n### Create GitHub release\n\n1. Copy changelog entry for the new version\n1. Create release for the new tag: https://github.com/conventional-changelog/commitlint/releases\n1. Post in the [commitlint Slack-channel][12]\n\n### Publish a `next` release (or i.e. patch release)\n\n```sh\nnpm login\nmise install\n```\n\n```sh\nyarn clean\nyarn install\nyarn build\nyarn test\nnpx lerna publish --conventional-commits --dist-tag [`next` | `next` | `[release-vXX(BRANCH)]`] --otp <one-time password>\n```\n\nIf for some reason this stops in between, you can manually publish missing packages like this:\n\n```sh\nnpm publish <package-name> --tag [`latest` | `next` | `[release-vXX(BRANCH)]`] --otp <one-time password>\n```\n\nDepending on the state of the packages you might need to run `npm pack` in each failed package and then publish it.\n\n#### Publishing (new) packages for the first time\n\n```sh\nnpm publish [PACKAGE_NAME] --access public\n```\n\nFrom within the folder first i.e. `cd @commitlint/new-packages`.\n\n#### Move `next` to `latest`\n\n```sh\nnpm login\n```\n\n```sh\nnpx lerna exec --no-bail --no-private --no-sort --stream -- '[ -n \"$(npm v . dist-tags.next)\" ] && npm dist-tag add ${LERNA_PACKAGE_NAME}@$(npm v . dist-tags.next) latest --otp <one-time password>'\n```\n\nRemove next:\n\n```sh\nnpx lerna exec --no-bail --no-private --no-sort --stream -- '[ -n \"$(npm v . dist-tags.next)\" ] && npm dist-tag rm ${LERNA_PACKAGE_NAME} next --otp <one-time password>'\n```\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/BUG_REPORT.yml",
    "content": "name: \"🐛 Bug Report\"\ndescription: Create a new ticket for a bug.\ntitle: \"fix: <title>\"\nlabels: [\"bug\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Provide a general summary of the issue in the Title above\n  - type: textarea\n    id: steps-to-reproduce\n    attributes:\n      label: \"Steps to Reproduce\"\n      description: Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include code to reproduce, if relevant\n      value: |\n        1. First step\n        2. Second step\n      render: bash\n    validations:\n      required: true\n  - type: textarea\n    id: current-behavior\n    attributes:\n      label: \"Current Behavior\"\n      description: Tell us what happens instead of the expected behavior\n    validations:\n      required: false\n  - type: textarea\n    id: expected-behavior\n    attributes:\n      label: \"Expected Behavior\"\n      description: Tell us what should happen\n      placeholder: Short and explicit description of your incident...\n    validations:\n      required: true\n  - type: checkboxes\n    id: affected-packages\n    attributes:\n      label: \"Affected packages\"\n      options:\n        - label: cli\n        - label: core\n        - label: prompt\n        - label: config-angular\n  - type: textarea\n    id: possible-solution\n    attributes:\n      label: \"Possible Solution\"\n      description: Not obligatory, but suggest a fix/reason for the bug, or ideas how to implement the addition or change\n    validations:\n      required: false\n  - type: textarea\n    id: context\n    attributes:\n      label: \"Context\"\n      description: |\n        How has this issue affected you? What are you trying to accomplish?\n        Providing context helps us come up with a solution that is most useful in the real world\n    validations:\n      required: false\n  - type: input\n    id: commitlint-version\n    attributes:\n      label: \"commitlint --version\"\n      placeholder: \"@commitlint/cli@x.x.x\"\n    validations:\n      required: true\n  - type: input\n    id: git-version\n    attributes:\n      label: \"git --version\"\n      placeholder: vx.x.x\n    validations:\n      required: true\n  - type: input\n    id: node-version\n    attributes:\n      label: \"node --version\"\n      placeholder: vx.x.x\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml",
    "content": "name: \"✨ Feature Request\"\ndescription: Create a new ticket for a new feature request\ntitle: \"feat: <title>\"\nlabels: [\"feature\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Provide a general summary of the issue in the Title above\n  - type: textarea\n    id: expected-behavior\n    attributes:\n      label: \"Expected Behavior\"\n      description: Tell us how it should work\n      placeholder: Short and explicit description of your request...\n    validations:\n      required: true\n  - type: textarea\n    id: current-behavior\n    attributes:\n      label: \"Current Behavior\"\n      description: Explain the difference from current behavior\n    validations:\n      required: false\n  - type: checkboxes\n    id: affected-packages\n    attributes:\n      label: \"Affected packages\"\n      options:\n        - label: cli\n        - label: core\n        - label: prompt\n        - label: config-angular\n  - type: textarea\n    id: possible-solution\n    attributes:\n      label: \"Possible Solution\"\n      description: Ideas how to implement the addition or change\n    validations:\n      required: false\n  - type: textarea\n    id: context\n    attributes:\n      label: \"Context\"\n      description: |\n        How has this issue affected you? What are you trying to accomplish?\n        Providing context helps us come up with a solution that is most useful in the real world\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--- Provide a general summary of your changes in the Title above -->\n\n## Description\n\n<!--- Describe your changes in detail -->\n\n## Motivation and Context\n\n<!--- Why is this change required? What problem does it solve? -->\n<!--- If it fixes an open issue, please link to the issue here. -->\n\n## Usage examples\n\n<!--- Provide examples of intended usage -->\n\n```js\n// commitlint.config.js\nmodule.exports = {};\n```\n\n```sh\necho \"your commit message here\" | commitlint # fails/passes\n```\n\n## How Has This Been Tested?\n\n<!--- Please describe in detail how you tested your changes. -->\n\n## Types of changes\n\n<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->\n\n- [ ] Bug fix (non-breaking change which fixes an issue)\n- [ ] New feature (non-breaking change which adds functionality)\n- [ ] Breaking change (fix or feature that would cause existing functionality to change)\n\n## Checklist:\n\n<!--- Go over all the following points, and put an `x` in all the boxes that apply. See the README for information on testing. -->\n<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\n\n- [ ] My change requires a change to the documentation.\n- [ ] I have updated the documentation accordingly.\n- [ ] I have added tests to cover my changes.\n- [ ] All new and existing tests passed.\n"
  },
  {
    "path": ".github/workflows/CI.yml",
    "content": "name: CI\n\non:\n  push:\n    branches:\n      - \"**\"\n  pull_request:\n    types: [opened, synchronize]\n\n  workflow_dispatch:\n\n  # to execute once a day (more info see https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule )\n  schedule:\n    - cron: \"0 0 * * *\"\n\njobs:\n  build:\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository\n    strategy:\n      matrix:\n        os: [ubuntu-22.04, ubuntu-24.04, windows-2022, windows-2025]\n        # Node versions match Ubuntu LTS defaults:\n        # 18 = Ubuntu 24.04, 20 = Ubuntu 25.x, 22 = Ubuntu 26.04\n        node: [18, 20, 22]\n    runs-on: ${{ matrix.os }}\n    steps:\n      - uses: actions/checkout@v6\n\n      - uses: actions/setup-node@v6\n        with:\n          node-version: ${{ matrix.node }}\n          cache: yarn\n\n      - name: Install dependencies\n        run: yarn install --ignore-engines --frozen-lockfile\n\n      - name: Build packages\n        run: yarn build\n\n      - name: Test\n        run: yarn test\n\n  codeQuality:\n    name: Code quality\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository\n    needs: [build]\n    runs-on: ubuntu-24.04\n    steps:\n      - uses: actions/checkout@v6\n\n      - uses: actions/setup-node@v6\n        with:\n          node-version: lts/*\n          cache: yarn\n\n      - name: Install dependencies\n        run: yarn install --ignore-engines --frozen-lockfile\n\n      - name: Check format\n        run: yarn format || (yarn format-fix; git diff; echo \"Formatting did not match (see above diff), please run 'yarn format-fix'\" >&2 && exit 1)\n\n      - name: Lint\n        run: yarn lint\n\n  nodeJsBaselineAptCompatibility:\n    name: NodeJS installed from stock Ubuntu-LTS packages (not external sources)\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository\n    runs-on: ubuntu-24.04\n    container:\n      image: \"ubuntu:24.04\"\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Install dependencies\n        run: |\n          apt update --yes\n\n          # NOTE: do not change the below with an `actions/setup-node` step! or it\n          # would make this CI job entirely pointless\n          apt install --yes npm\n\n          npm install --global yarn\n          yarn install\n\n      - name: Print versions\n        run: node --version && npm --version && yarn --version\n\n      - name: Build\n        run: yarn build\n\n      - name: Run Tests\n        run: yarn test\n"
  },
  {
    "path": ".github/workflows/commitlint.yml",
    "content": "name: Conventional Commitlint\n\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  commitlint:\n    name: Commitlint\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Setup Node\n        uses: actions/setup-node@v6\n        with:\n          node-version: lts/*\n          cache: yarn\n\n      - name: Install dependencies\n        run: yarn install --frozen-lockfile\n\n      - name: Build packages\n        run: yarn build\n\n      - name: Print versions\n        run: |\n          git --version\n          node --version\n          npm --version\n          yarn --version\n          yarn commitlint --version\n\n      - name: Validate current commit (last commit) with commitlint\n        if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'\n        run: yarn commitlint --last --verbose\n\n      - name: Validate PR commits with commitlint\n        if: github.event_name == 'pull_request'\n        run: yarn commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose\n"
  },
  {
    "path": ".github/workflows/container-build.yml",
    "content": "name: container build\non:\n  push:\n    tags:\n      - \"**\"\n  schedule:\n    - cron: \"0 0 * * *\"\n  pull_request:\n    paths:\n      - \"Dockerfile.ci\"\njobs:\n  container-build:\n    if: github.repository == 'conventional-changelog/commitlint'\n    runs-on: ubuntu-latest\n    steps:\n      - name: checkout\n        uses: actions/checkout@v6\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0\n      - name: Log into registry\n        uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0\n        with:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          password: ${{ secrets.DOCKERHUB_TOKEN }}\n      - name: Docker meta\n        id: meta\n        uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0\n        with:\n          images: commitlint/commitlint\n          tags: |\n            type=semver,pattern={{version}}\n            type=edge,branch=master\n            type=ref,event=branch\n            type=sha,prefix=,format=short\n      - name: Build and push container image\n        uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0\n        with:\n          context: .\n          file: Dockerfile.ci\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          platforms: linux/amd64,linux/arm64\n"
  },
  {
    "path": ".github/workflows/docs-deploy.yml",
    "content": "name: Deploy docs site to Pages\n\non:\n  push:\n    branches: [master]\n\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: pages\n  cancel-in-progress: false\n\njobs:\n  # Build job\n  build:\n    if: github.repository == 'conventional-changelog/commitlint'\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Setup Node\n        uses: actions/setup-node@v6\n        with:\n          node-version: 18\n          cache: yarn\n\n      - name: Setup Pages\n        uses: actions/configure-pages@v5\n\n      - name: Install dependencies\n        run: yarn install\n\n      - name: Build with VitePress\n        run: |\n          yarn docs-build\n          touch ./docs/.vitepress/dist/.nojekyll\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v4\n        with:\n          path: ./docs/.vitepress/dist\n\n  # Deployment job\n  deploy:\n    if: github.repository == 'conventional-changelog/commitlint'\n    environment:\n      name: docs\n      url: ${{ steps.deployment.outputs.page_url }}\n    needs: build\n    runs-on: ubuntu-latest\n    name: Deploy\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea/\n.DS_Store\n*.log\nnode_modules\npackage-lock.json\n.npm\n.nyc_output\n.dockerignore\n.*.dockerfile\nlib/\npackage.json.lerna_backup\n/*.iml\ntsconfig.tsbuildinfo\ncoverage\ndist\n\ndocs/.vitepress/dist\ndocs/.vitepress/cache\n\n# For testing nested workspaces does not have the package's dependencies name in the scope\n!**/config-lerna-scopes/fixtures/nested-workspaces/**/node_modules\n"
  },
  {
    "path": ".husky/commit-msg",
    "content": "node @commitlint/cli/lib/cli.js --edit $1\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "yarn lint-staged\n\n# be sure to build with up to date source\n# before running pre-commit hook which is using `@commitlint/cli/lib/cli.js`\nyarn build\n"
  },
  {
    "path": ".mise.toml",
    "content": "[tools]\nnode = \"18\"\n"
  },
  {
    "path": ".npmrc",
    "content": "legacy-peer-deps=true\n"
  },
  {
    "path": ".nxignore",
    "content": "# Having fixtures with a package.json and project.json leads to a duplicate package resolution issue.\n# see https://github.com/nrwl/nx/issues/20959\n@commitlint/*/fixtures/**\n"
  },
  {
    "path": ".prettierignore",
    "content": "lib/\ncoverage/\nnode_modules/\nfixtures/\nCHANGELOG.md\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"type\": \"node\",\n      \"request\": \"launch\",\n      \"name\": \"Jest Test Current file\",\n      \"program\": \"${workspaceFolder}/node_modules/jest/bin/jest.js\",\n      \"cwd\": \"${workspaceFolder}\",\n      \"args\": [\"--runInBand\", \"--no-cache\", \"--no-coverage\", \"${fileBasename}\"],\n      \"sourceMaps\": true,\n      \"console\": \"integratedTerminal\",\n      \"internalConsoleOptions\": \"neverOpen\"\n    }\n  ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"typescript.tsdk\": \"node_modules/typescript/lib\"\n}\n"
  },
  {
    "path": ".yarnrc",
    "content": "registry \"https://registry.npmjs.org/\"\n--install.ignore-engines true\n"
  },
  {
    "path": "@alias/commitlint/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n\n### Bug Fixes\n\n* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299))\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [19.2.1](https://github.com/conventional-changelog/commitlint/compare/v19.2.0...v19.2.1) (2024-03-19)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [18.4.1](https://github.com/conventional-changelog/commitlint/compare/v18.4.0...v18.4.1) (2023-11-12)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [18.2.0](https://github.com/conventional-changelog/commitlint/compare/v18.1.0...v18.2.0) (2023-10-26)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.7.2](https://github.com/conventional-changelog/commitlint/compare/v17.7.1...v17.7.2) (2023-09-28)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.7.1](https://github.com/conventional-changelog/commitlint/compare/v17.7.0...v17.7.1) (2023-08-10)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.5.1](https://github.com/conventional-changelog/commitlint/compare/v17.5.0...v17.5.1) (2023-03-28)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n## [17.4.1](https://github.com/conventional-changelog/commitlint/compare/v17.4.0...v17.4.1) (2023-01-09)\n\n**Note:** Version bump only for package commitlint\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package commitlint\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package commitlint\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package commitlint\n\n## [17.1.2](https://github.com/conventional-changelog/commitlint/compare/v17.1.1...v17.1.2) (2022-08-29)\n\n**Note:** Version bump only for package commitlint\n\n## [17.1.1](https://github.com/conventional-changelog/commitlint/compare/v17.1.0...v17.1.1) (2022-08-27)\n\n**Note:** Version bump only for package commitlint\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package commitlint\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package commitlint\n\n## [17.0.2](https://github.com/conventional-changelog/commitlint/compare/v17.0.1...v17.0.2) (2022-06-01)\n\n**Note:** Version bump only for package commitlint\n\n## [17.0.1](https://github.com/conventional-changelog/commitlint/compare/v17.0.0...v17.0.1) (2022-05-25)\n\n**Note:** Version bump only for package commitlint\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package commitlint\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package commitlint\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package commitlint\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package commitlint\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n**Note:** Version bump only for package commitlint\n\n## [16.0.3](https://github.com/conventional-changelog/commitlint/compare/v16.0.2...v16.0.3) (2022-01-19)\n\n**Note:** Version bump only for package commitlint\n\n## [16.0.2](https://github.com/conventional-changelog/commitlint/compare/v16.0.1...v16.0.2) (2022-01-09)\n\n**Note:** Version bump only for package commitlint\n\n## [16.0.1](https://github.com/conventional-changelog/commitlint/compare/v16.0.0...v16.0.1) (2021-12-28)\n\n**Note:** Version bump only for package commitlint\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package commitlint\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package commitlint\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package commitlint\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package commitlint\n\n## [13.2.1](https://github.com/conventional-changelog/commitlint/compare/v13.2.0...v13.2.1) (2021-10-09)\n\n**Note:** Version bump only for package commitlint\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package commitlint\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package commitlint\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package commitlint\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package commitlint\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package commitlint\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package commitlint\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package commitlint\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package commitlint\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package commitlint\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package commitlint\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package commitlint\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package commitlint\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package commitlint\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package commitlint\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n**Note:** Version bump only for package commitlint\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n### Bug Fixes\n\n- **commitlint:** use new read pkg syntax ([#888](https://github.com/conventional-changelog/commitlint/issues/888)) ([6b3b9a9](https://github.com/conventional-changelog/commitlint/commit/6b3b9a9))\n\n## [8.3.1](https://github.com/conventional-changelog/commitlint/compare/v8.3.0...v8.3.1) (2019-10-16)\n\n**Note:** Version bump only for package commitlint\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package commitlint\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package commitlint\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package commitlint\n\n## [7.6.1](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.1) (2019-05-09)\n\n**Note:** Version bump only for package commitlint\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package commitlint\n\n## [7.5.2](https://github.com/conventional-changelog/commitlint/compare/v7.5.1...v7.5.2) (2019-02-11)\n\n**Note:** Version bump only for package commitlint\n\n## [7.5.1](https://github.com/conventional-changelog/commitlint/compare/v7.5.0...v7.5.1) (2019-02-09)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.4.0\"></a>\n\n# [7.4.0](https://github.com/conventional-changelog/commitlint/compare/v7.3.2...v7.4.0) (2019-01-27)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"7.3.2\"></a>\n\n## [7.3.2](https://github.com/conventional-changelog/commitlint/compare/v7.3.1...v7.3.2) (2019-01-15)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"6.2.0\"></a>\n\n# [6.2.0](https://github.com/conventional-changelog/commitlint/compare/v6.1.3...v6.2.0) (2018-05-01)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"6.0.5\"></a>\n\n## [6.0.5](https://github.com/conventional-changelog/commitlint/compare/v6.0.4...v6.0.5) (2018-01-31)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"6.0.1\"></a>\n\n## [6.0.1](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.1) (2018-01-09)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"5.2.6\"></a>\n\n## [5.2.6](https://github.com/conventional-changelog/commitlint/compare/v5.2.5...v5.2.6) (2017-12-21)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"5.2.5\"></a>\n\n## [5.2.5](https://github.com/conventional-changelog/commitlint/compare/v5.2.4...v5.2.5) (2017-12-08)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"5.2.4\"></a>\n\n## [5.2.4](https://github.com/conventional-changelog/commitlint/compare/v5.2.3...v5.2.4) (2017-12-08)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"5.2.3\"></a>\n\n## [5.2.3](https://github.com/conventional-changelog/commitlint/compare/v5.2.2...v5.2.3) (2017-12-05)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"5.2.0\"></a>\n\n# [5.2.0](https://github.com/conventional-changelog/commitlint/compare/v5.1.3...v5.2.0) (2017-11-30)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"4.2.2\"></a>\n\n## [4.2.2](https://github.com/conventional-changelog/commitlint/compare/v4.2.1...v4.2.2) (2017-10-26)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package commitlint\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package commitlint\n"
  },
  {
    "path": "@alias/commitlint/README.md",
    "content": "# commitlint\n\n> Alias of [@commitlint/cli](https://www.npmjs.com/package/@commitlint/cli)\n"
  },
  {
    "path": "@alias/commitlint/cli.js",
    "content": "#!/usr/bin/env node\nimport \"@commitlint/cli/cli.js\";\n"
  },
  {
    "path": "@alias/commitlint/cli.test.js",
    "content": "import { test, expect } from \"vitest\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { x } from \"tinyexec\";\nimport { fix } from \"@commitlint/test\";\n\nconst require = createRequire(import.meta.url);\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\nconst bin = require.resolve(\"./cli.js\");\n\nfunction cli(args, options, input) {\n\tconst result = x(bin, args, {\n\t\tnodeOptions: {\n\t\t\tcwd: options.cwd,\n\t\t\tenv: options.env,\n\t\t},\n\t});\n\n\tresult.process.stdin.write(input);\n\tresult.process.stdin.end();\n\n\treturn result;\n}\n\nconst fixBootstrap = (fixture) => fix.bootstrap(fixture, __dirname);\n\ntest(\"should reprint input from stdin\", async () => {\n\tconst cwd = await fixBootstrap(\"fixtures/default\");\n\tconst actual = await cli([], { cwd }, \"foo: bar\");\n\texpect(actual.stdout).toContain(\"foo: bar\");\n});\n\ntest(\"should produce success output with --verbose flag\", async () => {\n\tconst cwd = await fixBootstrap(\"fixtures/default\");\n\tconst actual = await cli([\"--verbose\"], { cwd }, \"type: bar\");\n\texpect(actual.stdout).toContain(\"0 problems, 0 warnings\");\n\texpect(actual.stderr).toEqual(\"\");\n});\n"
  },
  {
    "path": "@alias/commitlint/fixtures/default/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'never', ['foo']]\n\t}\n};\n"
  },
  {
    "path": "@alias/commitlint/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@alias/commitlint/package.json",
    "content": "{\n  \"name\": \"commitlint\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commit messages\",\n  \"files\": [\n    \"cli.js\"\n  ],\n  \"bin\": {\n    \"commitlint\": \"cli.js\"\n  },\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-main\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@alias/commitlint\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"cli\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@commitlint/cli\": \"^20.5.0\",\n    \"@commitlint/types\": \"^20.5.0\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"tinyexec\": \"^1.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@alias/commitlint-config-angular/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package commitlint-config-angular\n\n<a name=\"3.2.0\"></a>\n\n# 3.2.0 (2017-09-05)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Features\n\n- alias config packages ([67ba5c6](https://github.com/conventional-changelog/commitlint/commit/67ba5c6))\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Features\n\n- alias config packages ([67ba5c6](https://github.com/conventional-changelog/commitlint/commit/67ba5c6))\n"
  },
  {
    "path": "@alias/commitlint-config-angular/README.md",
    "content": "# commitlint-config-angular\n\n> Alias of [@commitlint/config-angular](https://www.npmjs.com/package/@commitlint/config-angular)\n"
  },
  {
    "path": "@alias/commitlint-config-angular/index.js",
    "content": "export { default } from \"@commitlint/config-angular\";\n"
  },
  {
    "path": "@alias/commitlint-config-angular/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@alias/commitlint-config-angular/package.json",
    "content": "{\n  \"name\": \"commitlint-config-angular\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Shareable commitlint config enforcing the angular commit convention\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@alias/commitlint-config-angular\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"angular\"\n  ],\n  \"author\": \"Mario Nebl <hello@herebecode.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"@commitlint/config-angular\": \"^20.5.0\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@alias/commitlint-config-lerna-scopes/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n## [17.6.2](https://github.com/conventional-changelog/commitlint/compare/v17.6.1...v17.6.2) (2023-05-03)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [17.2.1](https://github.com/conventional-changelog/commitlint/compare/v17.2.0...v17.2.1) (2022-11-01)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [17.0.2](https://github.com/conventional-changelog/commitlint/compare/v17.0.1...v17.0.2) (2022-06-01)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [16.2.2](https://github.com/conventional-changelog/commitlint/compare/v16.2.1...v16.2.2) (2022-02-14)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n## [7.5.1](https://github.com/conventional-changelog/commitlint/compare/v7.5.0...v7.5.1) (2019-02-09)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"5.2.6\"></a>\n\n## [5.2.6](https://github.com/conventional-changelog/commitlint/compare/v5.2.5...v5.2.6) (2017-12-21)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"5.2.0\"></a>\n\n# [5.2.0](https://github.com/conventional-changelog/commitlint/compare/v5.1.3...v5.2.0) (2017-11-30)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"4.1.1\"></a>\n\n## [4.1.1](https://github.com/conventional-changelog/commitlint/compare/v4.1.0...v4.1.1) (2017-10-09)\n\n**Note:** Version bump only for package commitlint-config-lerna-scopes\n\n<a name=\"3.2.0\"></a>\n\n# 3.2.0 (2017-09-05)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Features\n\n- alias config packages ([67ba5c6](https://github.com/conventional-changelog/commitlint/commit/67ba5c6))\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Features\n\n- alias config packages ([67ba5c6](https://github.com/conventional-changelog/commitlint/commit/67ba5c6))\n"
  },
  {
    "path": "@alias/commitlint-config-lerna-scopes/README.md",
    "content": "# commitlint-config-lerna-scopes\n\n> Alias of [@commitlint/config-lerna-scopes](https://www.npmjs.com/package/@commitlint/config-lerna-scopes)\n"
  },
  {
    "path": "@alias/commitlint-config-lerna-scopes/index.js",
    "content": "export { default } from \"@commitlint/config-lerna-scopes\";\n"
  },
  {
    "path": "@alias/commitlint-config-lerna-scopes/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@alias/commitlint-config-lerna-scopes/package.json",
    "content": "{\n  \"name\": \"commitlint-config-lerna-scopes\",\n  \"type\": \"module\",\n  \"version\": \"20.4.3\",\n  \"description\": \"Shareable commitlint config enforcing lerna package names as scopes\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@alias/commitlint-config-lerna-scopes\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"angular\"\n  ],\n  \"author\": \"Mario Nebl <hello@herebecode.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"@commitlint/config-lerna-scopes\": \"^20.4.3\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@alias/commitlint-config-nx-scopes/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [19.3.1](https://github.com/conventional-changelog/commitlint/compare/v19.3.0...v19.3.1) (2024-05-13)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [19.2.1](https://github.com/conventional-changelog/commitlint/compare/v19.2.0...v19.2.1) (2024-03-19)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [18.5.1](https://github.com/conventional-changelog/commitlint/compare/v18.5.0...v18.5.1) (2024-01-22)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [18.3.0](https://github.com/conventional-changelog/commitlint/compare/v18.2.0...v18.3.0) (2023-10-26)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [17.6.4](https://github.com/conventional-changelog/commitlint/compare/v17.6.3...v17.6.4) (2023-05-07)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package commitlint-config-nx-scopes\n\n# [16.2.0](https://github.com/conventional-changelog/commitlint/compare/v16.1.0...v16.2.0) (2022-01-25)\n\n### Features\n\n- add support for Nx monorepos via @commitlint/config-nx-scopes ([#2995](https://github.com/conventional-changelog/commitlint/issues/2995)) ([11879ad](https://github.com/conventional-changelog/commitlint/commit/11879adacbef3c939311b1ff597a7b894fcca0dc))\n"
  },
  {
    "path": "@alias/commitlint-config-nx-scopes/README.md",
    "content": "# commitlint-config-nx-scopes\n\n> Alias of [@commitlint/config-nx-scopes](https://www.npmjs.com/package/@commitlint/config-nx-scopes)\n"
  },
  {
    "path": "@alias/commitlint-config-nx-scopes/index.js",
    "content": "export { default } from \"@commitlint/config-nx-scopes\";\n"
  },
  {
    "path": "@alias/commitlint-config-nx-scopes/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2022 - present Florian Guitton\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@alias/commitlint-config-nx-scopes/package.json",
    "content": "{\n  \"name\": \"commitlint-config-nx-scopes\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Shareable commitlint config enforcing nx project names as scopes\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@alias/commitlint-config-nx-scopes\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"nx\"\n  ],\n  \"author\": \"Florian Guitton <florian@secretarium.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"@commitlint/config-nx-scopes\": \"^20.5.0\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@alias/commitlint-config-patternplate/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package commitlint-config-patternplate\n\n<a name=\"3.2.0\"></a>\n\n# 3.2.0 (2017-09-05)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n### Features\n\n- alias config packages ([1946baf](https://github.com/conventional-changelog/commitlint/commit/1946baf))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Features\n\n- alias config packages ([67ba5c6](https://github.com/conventional-changelog/commitlint/commit/67ba5c6))\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Features\n\n- alias config packages ([67ba5c6](https://github.com/conventional-changelog/commitlint/commit/67ba5c6))\n"
  },
  {
    "path": "@alias/commitlint-config-patternplate/README.md",
    "content": "# commitlint-config-patternplate\n\n> Alias of [@commitlint/config-patternplate](https://www.npmjs.com/package/@commitlint/config-patternplate)\n"
  },
  {
    "path": "@alias/commitlint-config-patternplate/index.js",
    "content": "export { default } from \"@commitlint/config-patternplate\";\n"
  },
  {
    "path": "@alias/commitlint-config-patternplate/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@alias/commitlint-config-patternplate/package.json",
    "content": "{\n  \"name\": \"commitlint-config-patternplate\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commits, patternplate-style\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@alias/commitlint-config-patternplate\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"angular\"\n  ],\n  \"author\": \"Mario Nebl <hello@herebecode.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"@commitlint/config-patternplate\": \"^20.5.0\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/cli/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n\n### Bug Fixes\n\n* **cli:** validate that --cwd directory exists before execution ([#4658](https://github.com/conventional-changelog/commitlint/issues/4658)) ([cf80f75](https://github.com/conventional-changelog/commitlint/commit/cf80f75745593f4f018cac301a91f23316c974fd)), closes [#4595](https://github.com/conventional-changelog/commitlint/issues/4595)\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n\n### Bug Fixes\n\n* footer parser does not escape special chars for regex [#4560](https://github.com/conventional-changelog/commitlint/issues/4560) ([#4634](https://github.com/conventional-changelog/commitlint/issues/4634)) ([8ff7c7f](https://github.com/conventional-changelog/commitlint/commit/8ff7c7fcbc2db2b45910ecb5c01e9f1763060770))\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n\n### Features\n\n* upgrade conventional commit packages [#4082](https://github.com/conventional-changelog/commitlint/issues/4082) ([#4597](https://github.com/conventional-changelog/commitlint/issues/4597)) ([3aaf0a6](https://github.com/conventional-changelog/commitlint/commit/3aaf0a603c4047d268d85207957c919f45b60e1f))\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n\n### Bug Fixes\n\n* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299))\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n\n### Features\n\n* **cli:** use special errorCode for missing rules/config [#4142](https://github.com/conventional-changelog/commitlint/issues/4142) ([#4143](https://github.com/conventional-changelog/commitlint/issues/4143)) ([d7070d8](https://github.com/conventional-changelog/commitlint/commit/d7070d8a4905da7834a018825b37d52c2dd29f62))\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n\n### Features\n\n* support command line options from a file ([#4109](https://github.com/conventional-changelog/commitlint/issues/4109)) ([a20e890](https://github.com/conventional-changelog/commitlint/commit/a20e890f6b6c8bacdc511d40cb41f29415bdd044))\n* support linting from the last tag ([#4110](https://github.com/conventional-changelog/commitlint/issues/4110)) ([4b204ec](https://github.com/conventional-changelog/commitlint/commit/4b204ecfb43dd6a00e24b51111aadbd78f9d58e1))\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [19.2.1](https://github.com/conventional-changelog/commitlint/compare/v19.2.0...v19.2.1) (2024-03-19)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n\n### Features\n\n* **cli:** introduce new --last flag, to stop recommending HEAD~1 ([#3916](https://github.com/conventional-changelog/commitlint/issues/3916)) ([99f4f3f](https://github.com/conventional-changelog/commitlint/commit/99f4f3f4839190a2758083df7ba20b988e7b68a6))\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n\n### Bug Fixes\n\n* drop `resolve-from`, `resolve-global` and `import-fresh`, resolve global packages correctly ([#3939](https://github.com/conventional-changelog/commitlint/issues/3939)) ([8793c63](https://github.com/conventional-changelog/commitlint/commit/8793c639c083c33714da0a29429b338776813d0c)), closes [#3938](https://github.com/conventional-changelog/commitlint/issues/3938)\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n\n### Features\n\n* **cli:** print-config now can be configured to print a json in stdout ([#3863](https://github.com/conventional-changelog/commitlint/issues/3863)) ([6381a2d](https://github.com/conventional-changelog/commitlint/commit/6381a2daa0d5d89ab2195998d63a9690a533d3f2)), closes [#3819](https://github.com/conventional-changelog/commitlint/issues/3819)\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [18.4.1](https://github.com/conventional-changelog/commitlint/compare/v18.4.0...v18.4.1) (2023-11-12)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [18.2.0](https://github.com/conventional-changelog/commitlint/compare/v18.1.0...v18.2.0) (2023-10-26)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.7.2](https://github.com/conventional-changelog/commitlint/compare/v17.7.1...v17.7.2) (2023-09-28)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.7.1](https://github.com/conventional-changelog/commitlint/compare/v17.7.0...v17.7.1) (2023-08-10)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.5.1](https://github.com/conventional-changelog/commitlint/compare/v17.5.0...v17.5.1) (2023-03-28)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n## [17.4.1](https://github.com/conventional-changelog/commitlint/compare/v17.4.0...v17.4.1) (2023-01-09)\n\n**Note:** Version bump only for package @commitlint/cli\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n### Bug Fixes\n\n- update dependency fs-extra to v11 ([#3460](https://github.com/conventional-changelog/commitlint/issues/3460)) ([a437923](https://github.com/conventional-changelog/commitlint/commit/a43792388e0d9707da770b26592c5e31553384a1))\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n### Features\n\n- **cli:** add strict mode ([#3384](https://github.com/conventional-changelog/commitlint/issues/3384)) ([#3385](https://github.com/conventional-changelog/commitlint/issues/3385)) ([fdff2be](https://github.com/conventional-changelog/commitlint/commit/fdff2bee2d688698555de1cab904d0f5038075b1))\n\n## [17.1.2](https://github.com/conventional-changelog/commitlint/compare/v17.1.1...v17.1.2) (2022-08-29)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [17.1.1](https://github.com/conventional-changelog/commitlint/compare/v17.1.0...v17.1.1) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n### Features\n\n- **commitlint:** add additional git log args ([#3334](https://github.com/conventional-changelog/commitlint/issues/3334)) ([229c65b](https://github.com/conventional-changelog/commitlint/commit/229c65b60f15c15da5f5b11deb555d1f557c673a))\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [17.0.2](https://github.com/conventional-changelog/commitlint/compare/v17.0.1...v17.0.2) (2022-06-01)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [17.0.1](https://github.com/conventional-changelog/commitlint/compare/v17.0.0...v17.0.1) (2022-05-25)\n\n### Bug Fixes\n\n- **cli:** use `core.commentChar` from git config with `--edit` flag ([#3191](https://github.com/conventional-changelog/commitlint/issues/3191)) ([e5fee05](https://github.com/conventional-changelog/commitlint/commit/e5fee05301ab7441b6091e4ee6fc095d26bbd589)), closes [#3190](https://github.com/conventional-changelog/commitlint/issues/3190) [#3190](https://github.com/conventional-changelog/commitlint/issues/3190) [#3190](https://github.com/conventional-changelog/commitlint/issues/3190)\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [16.0.3](https://github.com/conventional-changelog/commitlint/compare/v16.0.2...v16.0.3) (2022-01-19)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [16.0.2](https://github.com/conventional-changelog/commitlint/compare/v16.0.1...v16.0.2) (2022-01-09)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [16.0.1](https://github.com/conventional-changelog/commitlint/compare/v16.0.0...v16.0.1) (2021-12-28)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n### Features\n\n- config validation ([#2412](https://github.com/conventional-changelog/commitlint/issues/2412)) ([c717202](https://github.com/conventional-changelog/commitlint/commit/c7172022097b11f46b33617e4a94d751243c1049)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n### Features\n\n- simplify config resolution ([#2398](https://github.com/conventional-changelog/commitlint/issues/2398)) ([8a8384f](https://github.com/conventional-changelog/commitlint/commit/8a8384f3c18954447cb633e76a573e1db71a1440)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [13.2.1](https://github.com/conventional-changelog/commitlint/compare/v13.2.0...v13.2.1) (2021-10-09)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n### Bug Fixes\n\n- **cli:** remove hard coded comment char with linting `COMMIT_EDIT_MSG` ([#2618](https://github.com/conventional-changelog/commitlint/issues/2618)) ([5badf6d](https://github.com/conventional-changelog/commitlint/commit/5badf6dc08116ed3557e6c780e55764b4f07ca67)), closes [#2351](https://github.com/conventional-changelog/commitlint/issues/2351)\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n### Bug Fixes\n\n- update dependency fs-extra to v10 ([#2575](https://github.com/conventional-changelog/commitlint/issues/2575)) ([d47d2b5](https://github.com/conventional-changelog/commitlint/commit/d47d2b595b980adadd4fb8ff198c1914caeff18f))\n- update dependency yargs to v17 ([#2574](https://github.com/conventional-changelog/commitlint/issues/2574)) ([81c38dd](https://github.com/conventional-changelog/commitlint/commit/81c38ddf15f239b525f673b26b2ee6606f2ee8f6))\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- update dependency execa to v5 ([#2341](https://github.com/conventional-changelog/commitlint/issues/2341)) ([f349df9](https://github.com/conventional-changelog/commitlint/commit/f349df90f08096a9bcad46b5e55b411aac327a24))\n- update dependency yargs to v16 ([204f36d](https://github.com/conventional-changelog/commitlint/commit/204f36d0a522afaf3a88739b401aea15ffa0b891))\n\n### Features\n\n- **cli:** implement print-config cli flag ([#2391](https://github.com/conventional-changelog/commitlint/issues/2391)) ([8626883](https://github.com/conventional-changelog/commitlint/commit/86268833946dea9dcf1c15459456cd4427d17835))\n- **load:** allow specifying helpUrl via config ([#2180](https://github.com/conventional-changelog/commitlint/issues/2180)) ([d6795a3](https://github.com/conventional-changelog/commitlint/commit/d6795a3c4633ba6efd7a0fcff48339dc291cd832))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n### Bug Fixes\n\n- **cli:** remove default value from edit option [#2065](https://github.com/conventional-changelog/commitlint/issues/2065) ([3d4116d](https://github.com/conventional-changelog/commitlint/commit/3d4116d044a2f5149a9c9c1d9fa35abf5e232479))\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency execa to v4 ([#1936](https://github.com/conventional-changelog/commitlint/issues/1936)) ([8efb441](https://github.com/conventional-changelog/commitlint/commit/8efb44193058d286f7325327a6d33936b273ec91))\n- update dependency fs-extra to v9 ([#1018](https://github.com/conventional-changelog/commitlint/issues/1018)) ([2df49fa](https://github.com/conventional-changelog/commitlint/commit/2df49fac907993ae78199a1012e918b0e2ff5621))\n- update dependency get-stdin to v8 ([#1938](https://github.com/conventional-changelog/commitlint/issues/1938)) ([f94a5c8](https://github.com/conventional-changelog/commitlint/commit/f94a5c82861523aa1cf407ffe062f99ecbbfb4e4))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency chalk to v4 ([#1275](https://github.com/conventional-changelog/commitlint/issues/1275)) ([a5d8fa1](https://github.com/conventional-changelog/commitlint/commit/a5d8fa118e8221361f14f5fd2b21d7aaad008a27))\n- update dependency regenerator-runtime to v0.13.5 ([#1017](https://github.com/conventional-changelog/commitlint/issues/1017)) ([9c4fdf1](https://github.com/conventional-changelog/commitlint/commit/9c4fdf1b5f42677422532dad655af9aed9b43881))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n### Bug Fixes\n\n- add missing @babel/runtime dep [#1738](https://github.com/conventional-changelog/commitlint/issues/1738) ([#1754](https://github.com/conventional-changelog/commitlint/issues/1754)) ([09afcd6](https://github.com/conventional-changelog/commitlint/commit/09afcd647a2c1d00538cf1c970e3790d936111f8))\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- **cli:** add missing regenerator-runtime to dependencies ([#919](https://github.com/conventional-changelog/commitlint/issues/919)) ([ee5eac9](https://github.com/conventional-changelog/commitlint/commit/ee5eac98fa97ba5ba17030c8d2705aee5c7f3a3a))\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/cli\n\n## [8.3.1](https://github.com/conventional-changelog/commitlint/compare/v8.3.0...v8.3.1) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n### Features\n\n- **cli:** add helpurl flag ([#789](https://github.com/conventional-changelog/commitlint/issues/789)) ([75cef4e](https://github.com/conventional-changelog/commitlint/commit/75cef4e))\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n### Bug Fixes\n\n- pass defaultIgnores from configuration in @commitlint/cli ([#771](https://github.com/conventional-changelog/commitlint/issues/771)) ([a259014](https://github.com/conventional-changelog/commitlint/commit/a259014))\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n### Bug Fixes\n\n- pass ignores from configuration in @commitlint/cli ([#668](https://github.com/conventional-changelog/commitlint/issues/668)) ([da99aaa](https://github.com/conventional-changelog/commitlint/commit/da99aaa))\n\n## [7.6.1](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.1) (2019-05-09)\n\n**Note:** Version bump only for package @commitlint/cli\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n### Bug Fixes\n\n- avoid excessive help text [#606](https://github.com/conventional-changelog/commitlint/issues/606) ([#637](https://github.com/conventional-changelog/commitlint/issues/637)) ([8f3c3b1](https://github.com/conventional-changelog/commitlint/commit/8f3c3b1))\n\n### Features\n\n- adds support for plugins ([#228](https://github.com/conventional-changelog/commitlint/issues/228)) ([#588](https://github.com/conventional-changelog/commitlint/issues/588)) ([cea4564](https://github.com/conventional-changelog/commitlint/commit/cea4564))\n\n## [7.5.2](https://github.com/conventional-changelog/commitlint/compare/v7.5.1...v7.5.2) (2019-02-11)\n\n### Bug Fixes\n\n- **cli:** replace old links with new organisation links ([#578](https://github.com/conventional-changelog/commitlint/issues/578)) ([4075903](https://github.com/conventional-changelog/commitlint/commit/4075903))\n\n## [7.5.1](https://github.com/conventional-changelog/commitlint/compare/v7.5.0...v7.5.1) (2019-02-09)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- **cli:** avoid linebreak in empty input ([#523](https://github.com/conventional-changelog/commitlint/issues/523)) ([3141882](https://github.com/conventional-changelog/commitlint/commit/3141882))\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- cleanup message for input with no config ([#519](https://github.com/conventional-changelog/commitlint/issues/519)) ([7d9e760](https://github.com/conventional-changelog/commitlint/commit/7d9e760))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.4.0\"></a>\n\n# [7.4.0](https://github.com/conventional-changelog/commitlint/compare/v7.3.2...v7.4.0) (2019-01-27)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"7.3.2\"></a>\n\n## [7.3.2](https://github.com/conventional-changelog/commitlint/compare/v7.3.1...v7.3.2) (2019-01-15)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- add fallback with husky git params to deprecation handling ([#498](https://github.com/conventional-changelog/commitlint/issues/498)) ([5a34b8c](https://github.com/conventional-changelog/commitlint/commit/5a34b8c))\n- avoid truncated output on macOS ([#503](https://github.com/conventional-changelog/commitlint/issues/503)) ([3192368](https://github.com/conventional-changelog/commitlint/commit/3192368))\n- respect String.protoype.repeat API contract ([f27e7ac](https://github.com/conventional-changelog/commitlint/commit/f27e7ac))\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n- use correct label for failing empty subjects ([#481](https://github.com/conventional-changelog/commitlint/issues/481)) ([2e7e34d](https://github.com/conventional-changelog/commitlint/commit/2e7e34d)), closes [#476](https://github.com/conventional-changelog/commitlint/issues/476)\n\n### Features\n\n- check stage before entering prompt ([#495](https://github.com/conventional-changelog/commitlint/issues/495)) ([3b3667a](https://github.com/conventional-changelog/commitlint/commit/3b3667a)), closes [#51](https://github.com/conventional-changelog/commitlint/issues/51) [#51](https://github.com/conventional-changelog/commitlint/issues/51)\n- warn on empty config ([#491](https://github.com/conventional-changelog/commitlint/issues/491)) ([b6bd36e](https://github.com/conventional-changelog/commitlint/commit/b6bd36e)), closes [#107](https://github.com/conventional-changelog/commitlint/issues/107) [#107](https://github.com/conventional-changelog/commitlint/issues/107)\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n### Bug Fixes\n\n- improve format module resolving ([#464](https://github.com/conventional-changelog/commitlint/issues/464)) ([baed8b1](https://github.com/conventional-changelog/commitlint/commit/baed8b1))\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n### Features\n\n- **cli:** add format option for report output ([1ecf097](https://github.com/conventional-changelog/commitlint/commit/1ecf097))\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"6.2.0\"></a>\n\n# [6.2.0](https://github.com/conventional-changelog/commitlint/compare/v6.1.3...v6.2.0) (2018-05-01)\n\n### Features\n\n- print commit message when the message is invalid ([86c34f1](https://github.com/conventional-changelog/commitlint/commit/86c34f1)), closes [#222](https://github.com/conventional-changelog/commitlint/issues/222)\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n### Features\n\n- add \"--config\" option ([#261](https://github.com/conventional-changelog/commitlint/issues/261)) ([2c03ec6](https://github.com/conventional-changelog/commitlint/commit/2c03ec6))\n\n<a name=\"6.0.5\"></a>\n\n## [6.0.5](https://github.com/conventional-changelog/commitlint/compare/v6.0.4...v6.0.5) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"6.0.1\"></a>\n\n## [6.0.1](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.1) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n### Bug Fixes\n\n- correctly resolve parserOpts [#115](https://github.com/conventional-changelog/commitlint/issues/115) [#95](https://github.com/conventional-changelog/commitlint/issues/95) ([1353dd5](https://github.com/conventional-changelog/commitlint/commit/1353dd5))\n\n<a name=\"5.2.6\"></a>\n\n## [5.2.6](https://github.com/conventional-changelog/commitlint/compare/v5.2.5...v5.2.6) (2017-12-21)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"5.2.5\"></a>\n\n## [5.2.5](https://github.com/conventional-changelog/commitlint/compare/v5.2.4...v5.2.5) (2017-12-08)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"5.2.4\"></a>\n\n## [5.2.4](https://github.com/conventional-changelog/commitlint/compare/v5.2.3...v5.2.4) (2017-12-08)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"5.2.3\"></a>\n\n## [5.2.3](https://github.com/conventional-changelog/commitlint/compare/v5.2.2...v5.2.3) (2017-12-05)\n\n### Bug Fixes\n\n- **cli:** add support for GIT_PARAMS on windows ([c62bd41](https://github.com/conventional-changelog/commitlint/commit/c62bd41)), closes [#103](https://github.com/conventional-changelog/commitlint/issues/103) [#175](https://github.com/conventional-changelog/commitlint/issues/175)\n\n<a name=\"5.2.0\"></a>\n\n# [5.2.0](https://github.com/conventional-changelog/commitlint/compare/v5.1.3...v5.2.0) (2017-11-30)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Bug Fixes\n\n- update dependency concurrently to v3.5.1 ([#147](https://github.com/conventional-changelog/commitlint/issues/147)) ([a809d0f](https://github.com/conventional-changelog/commitlint/commit/a809d0f))\n\n### Features\n\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"4.2.2\"></a>\n\n## [4.2.2](https://github.com/conventional-changelog/commitlint/compare/v4.2.1...v4.2.2) (2017-10-26)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n### Bug Fixes\n\n- nicer error messages ([#93](https://github.com/conventional-changelog/commitlint/issues/93)) ([dcfad61](https://github.com/conventional-changelog/commitlint/commit/dcfad61))\n- **core:** consider config outside of current git repo ([f7234b6](https://github.com/conventional-changelog/commitlint/commit/f7234b6))\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n### Features\n\n- edit flag now accepts the path to the commit file ([c881433](https://github.com/conventional-changelog/commitlint/commit/c881433)), closes [#40](https://github.com/conventional-changelog/commitlint/issues/40)\n\n<a name=\"4.1.1\"></a>\n\n## [4.1.1](https://github.com/conventional-changelog/commitlint/compare/v4.1.0...v4.1.1) (2017-10-09)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"4.1.0\"></a>\n\n# [4.1.0](https://github.com/conventional-changelog/commitlint/compare/v4.0.0...v4.1.0) (2017-10-05)\n\n**Note:** Version bump only for package @commitlint/cli\n\n<a name=\"4.0.0\"></a>\n\n# [4.0.0](https://github.com/conventional-changelog/commitlint/compare/v3.2.0...v4.0.0) (2017-10-04)\n\n### Features\n\n- enable alternative config formats ([#83](https://github.com/conventional-changelog/commitlint/issues/83)) ([91968b8](https://github.com/conventional-changelog/commitlint/commit/91968b8)), closes [#73](https://github.com/conventional-changelog/commitlint/issues/73)\n\n### BREAKING CHANGES\n\n- discontinue support of conventional-changelog-lintrc\n\n- test: make git setup reliable\n\n<a name=\"3.2.0\"></a>\n\n# 3.2.0 (2017-09-05)\n\n### Features\n\n- add preset parser ([5cd2335](https://github.com/conventional-changelog/commitlint/commit/5cd2335))\n\n<a name=\"3.1.3\"></a>\n\n## 3.1.3 (2017-08-21)\n\n### Bug Fixes\n\n- **core:** determine git root correctly in sub directories ([#64](https://github.com/conventional-changelog/commitlint/issues/64)) ([d594ec4](https://github.com/conventional-changelog/commitlint/commit/d594ec4)), closes [#62](https://github.com/conventional-changelog/commitlint/issues/62)\n\n<a name=\"3.1.2\"></a>\n\n## 3.1.2 (2017-08-07)\n\n<a name=\"3.1.1\"></a>\n\n## 3.1.1 (2017-08-07)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n### Bug Fixes\n\n- **core:** correct type validation message ([09c2b26](https://github.com/conventional-changelog/commitlint/commit/09c2b26))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Bug Fixes\n\n- **cli:** remove destructuring for node 4 support ([fe8caff](https://github.com/conventional-changelog/commitlint/commit/fe8caff))\n- ensure node4 compat ([bfeb653](https://github.com/conventional-changelog/commitlint/commit/bfeb653))\n\n<a name=\"3.1.3\"></a>\n\n## 3.1.3 (2017-08-21)\n\n### Bug Fixes\n\n- **core:** determine git root correctly in sub directories ([#64](https://github.com/conventional-changelog/commitlint/issues/64)) ([d594ec4](https://github.com/conventional-changelog/commitlint/commit/d594ec4)), closes [#62](https://github.com/conventional-changelog/commitlint/issues/62)\n\n<a name=\"3.1.2\"></a>\n\n## 3.1.2 (2017-08-07)\n\n<a name=\"3.1.1\"></a>\n\n## 3.1.1 (2017-08-07)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n### Bug Fixes\n\n- **core:** correct type validation message ([09c2b26](https://github.com/conventional-changelog/commitlint/commit/09c2b26))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Bug Fixes\n\n- **cli:** remove destructuring for node 4 support ([fe8caff](https://github.com/conventional-changelog/commitlint/commit/fe8caff))\n- ensure node4 compat ([bfeb653](https://github.com/conventional-changelog/commitlint/commit/bfeb653))\n\n<a name=\"3.1.2\"></a>\n\n## 3.1.2 (2017-08-07)\n\n<a name=\"3.1.1\"></a>\n\n## 3.1.1 (2017-08-07)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n### Bug Fixes\n\n- **core:** correct type validation message ([09c2b26](https://github.com/conventional-changelog/commitlint/commit/09c2b26))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Bug Fixes\n\n- **cli:** remove destructuring for node 4 support ([fe8caff](https://github.com/conventional-changelog/commitlint/commit/fe8caff))\n- ensure node4 compat ([bfeb653](https://github.com/conventional-changelog/commitlint/commit/bfeb653))\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n### Bug Fixes\n\n- **core:** correct type validation message ([09c2b26](https://github.com/conventional-changelog/commitlint/commit/09c2b26))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Bug Fixes\n\n- **cli:** remove destructuring for node 4 support ([fe8caff](https://github.com/conventional-changelog/commitlint/commit/fe8caff))\n- ensure node4 compat ([bfeb653](https://github.com/conventional-changelog/commitlint/commit/bfeb653))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Bug Fixes\n\n- **cli:** remove destructuring for node 4 support ([fe8caff](https://github.com/conventional-changelog/commitlint/commit/fe8caff))\n- ensure node4 compat ([bfeb653](https://github.com/conventional-changelog/commitlint/commit/bfeb653))\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Bug Fixes\n\n- **cli:** remove destructuring for node 4 support ([fe8caff](https://github.com/conventional-changelog/commitlint/commit/fe8caff))\n- ensure node4 compat ([bfeb653](https://github.com/conventional-changelog/commitlint/commit/bfeb653))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n### Bug Fixes\n\n- **cli:** remove destructuring for node 4 support ([fe8caff](https://github.com/conventional-changelog/commitlint/commit/fe8caff))\n- ensure node4 compat ([bfeb653](https://github.com/conventional-changelog/commitlint/commit/bfeb653))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Bug Fixes\n\n- **cli:** remove destructuring for node 4 support ([94437e8](https://github.com/conventional-changelog/commitlint/commit/94437e8))\n- ensure node4 compat ([a5e658a](https://github.com/conventional-changelog/commitlint/commit/a5e658a))\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Bug Fixes\n\n- **cli:** remove destructuring for node 4 support ([94437e8](https://github.com/conventional-changelog/commitlint/commit/94437e8))\n- ensure node4 compat ([a5e658a](https://github.com/conventional-changelog/commitlint/commit/a5e658a))\n"
  },
  {
    "path": "@commitlint/cli/README.md",
    "content": "# @commitlint/cli\n\n<p align=\"center\">\n  <img width=\"750\" src=\"https://commitlint.js.org/assets/commitlint.svg\">\n</p>\n\nLint commit messages\n\n## Documentation\n\nConsult [CLI reference](https://commitlint.js.org/reference/cli) for comprehensive documentation.\n"
  },
  {
    "path": "@commitlint/cli/cli.js",
    "content": "#!/usr/bin/env node\nimport \"./lib/cli.js\";\n"
  },
  {
    "path": "@commitlint/cli/commitlint.config.js",
    "content": ""
  },
  {
    "path": "@commitlint/cli/fixtures/comment-char/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'body-empty': [2, 'never']\n\t},\n\tparserPreset: {\n        parserOpts: {\n            commentChar: '$'\n        }\n    },\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/custom-formatter/commitlint.config.js",
    "content": "module.exports = {\n\tformatter: 'custom-formatter',\n\trules: {\n\t\t'type-enum': [2, 'never', ['foo']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/custom-formatter/formatters/custom.js",
    "content": "module.exports = function(_report) {\n\treturn 'custom-formatter-ok';\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/default/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'never', ['foo']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/default-ignores-false/commitlint.config.js",
    "content": "module.exports = {\n\tdefaultIgnores: false,\n\trules: {\n\t\t'subject-empty': [2, 'never']\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/default-ignores-true/commitlint.config.js",
    "content": "module.exports = {\n\tdefaultIgnores: true,\n\trules: {\n\t\t'subject-empty': [2, 'never']\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/default-ignores-unset/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'subject-empty': [2, 'never']\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/empty/commitlint.config.js",
    "content": "module.exports = {};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/extends-root/extended.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'never', ['foo']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/help-url/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'never', ['foo']]\n\t},\n\thelpUrl: 'https://www.example.com/foo'\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/husky/integration/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'never', ['foo']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/husky/integration/package.json",
    "content": "{\n  \"scripts\": {},\n  \"devDependencies\": {\n    \"husky\": \"^5.1.1\"\n  }\n}\n"
  },
  {
    "path": "@commitlint/cli/fixtures/husky/package.json",
    "content": "{\n  \"scripts\": {},\n  \"devDependencies\": {\n    \"husky\": \"^5.1.1\"\n  }\n}\n"
  },
  {
    "path": "@commitlint/cli/fixtures/ignores/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'always', ['type']],\n\t\t'scope-enum': [2, 'always', ['scope']],\n\t\t'subject-empty': [2, 'never']\n\t},\n\tignores: [\n\t\tcommit => {\n\t\t\treturn commit.includes('WIP');\n\t\t}\n\t]\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/inner-scope/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'always', ['outer']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/inner-scope/inner-scope/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'always', ['inner']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/issue-prefixes/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'references-empty': [2, 'never']\n\t},\n\tparserPreset: {\n\t\tparserOpts: {\n\t\t\tissuePrefixes: ['REF-']\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/last-flag-regression/commitlint.config.js",
    "content": "module.exports = {\n    rules: {\n        'subject-empty': [2, 'never'],\n    \t'type-empty': [2, 'never'],\n        'type-enum': [2, 'always', [\n            'test'\n        ]]\n    }\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/outer-scope/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'always', ['outer']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/package.json",
    "content": "{\n  \"type\": \"commonjs\"\n}\n"
  },
  {
    "path": "@commitlint/cli/fixtures/parser-preset/commitlint.config.js",
    "content": "module.exports = {\n\tparserPreset: './parser-preset',\n\trules: {\n\t\t'type-enum': [2, 'always', ['type']],\n\t\t'scope-enum': [2, 'always', ['scope']],\n\t\t'subject-empty': [2, 'never']\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/parser-preset/parser-preset.js",
    "content": "module.exports = {\n\tparserOpts: {\n\t\theaderPattern: /^----(\\w*)\\((\\w*)\\):\\s(.*)$/,\n\t\theaderCorrespondence: ['type', 'scope', 'subject']\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/signoff/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'signed-off-by': [2, 'always', 'Signed-off-by']\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/signoff/package.json",
    "content": "{\n  \"scripts\": {},\n  \"devDependencies\": {\n    \"husky\": \"^5.1.1\"\n  }\n}\n"
  },
  {
    "path": "@commitlint/cli/fixtures/simple/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'never', ['foo']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/specify-config-file/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'header-max-length': [2, 'always', 4]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/specify-config-file/config/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [2, 'never', ['foo']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/cli/fixtures/warning/commitlint.config.js",
    "content": "module.exports = {\n    rules: {\n        'type-enum': [2, 'always', ['feat']],\n        'subject-max-length': [1, 'always', 4]\n    }\n};\n"
  },
  {
    "path": "@commitlint/cli/index.cjs",
    "content": "'use strict';\n\nconst path = require('node:path');\n\nmodule.exports = path.join(__dirname, 'cli.js');\n"
  },
  {
    "path": "@commitlint/cli/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/cli/package.json",
    "content": "{\n  \"name\": \"@commitlint/cli\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commit messages\",\n  \"files\": [\n    \"index.cjs\",\n    \"cli.js\",\n    \"lib\"\n  ],\n  \"main\": \"index.cjs\",\n  \"bin\": {\n    \"commitlint\": \"./cli.js\"\n  },\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/cli\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"cli\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/conventional-commits-parser\": \"^5.0.2\",\n    \"@types/lodash.mergewith\": \"^4.6.8\",\n    \"@types/node\": \"^18.19.17\",\n    \"@types/yargs\": \"^17.0.29\",\n    \"fs-extra\": \"^11.3.4\",\n    \"lodash.mergewith\": \"^4.6.2\"\n  },\n  \"dependencies\": {\n    \"@commitlint/format\": \"^20.5.0\",\n    \"@commitlint/lint\": \"^20.5.0\",\n    \"@commitlint/load\": \"^20.5.0\",\n    \"@commitlint/read\": \"^20.5.0\",\n    \"@commitlint/types\": \"^20.5.0\",\n    \"tinyexec\": \"^1.0.0\",\n    \"yargs\": \"^17.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/cli/src/cli-error.ts",
    "content": "export enum ExitCode {\n\tCommitlintDefault = 0,\n\tCommitlintErrorDefault = 1,\n\tCommitLintWarning = 2,\n\tCommitLintError = 3,\n\tCommitlintInvalidArgument = 9,\n}\n\nexport class CliError extends Error {\n\t__proto__ = Error;\n\n\tpublic type: string;\n\tpublic error_code: ExitCode;\n\n\tconstructor(\n\t\tmessage: string,\n\t\ttype: string,\n\t\terror_code = ExitCode.CommitlintErrorDefault,\n\t) {\n\t\tsuper(message);\n\n\t\tthis.type = type;\n\t\tthis.error_code = error_code;\n\n\t\tObject.setPrototypeOf(this, CliError.prototype);\n\t}\n}\n"
  },
  {
    "path": "@commitlint/cli/src/cli.test.ts",
    "content": "import { describe, test, expect } from \"vitest\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { fix, git } from \"@commitlint/test\";\nimport fs from \"fs-extra\";\nimport mergeWith from \"lodash.mergewith\";\nimport { x } from \"tinyexec\";\nimport { ExitCode } from \"./cli-error.js\";\n\nconst require = createRequire(import.meta.url);\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\nconst bin = require.resolve(\"../cli.js\");\n\ninterface TestOptions {\n\tcwd: string;\n\tenv?: Record<string, string>;\n}\n\nconst cli = (args: string[], options: TestOptions) => {\n\treturn (input = \"\") => {\n\t\tconst result = x(bin, args, {\n\t\t\tnodeOptions: {\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tenv: options.env,\n\t\t\t},\n\t\t});\n\n\t\tresult.process?.stdin?.write(input);\n\t\tresult.process?.stdin?.end();\n\n\t\treturn result;\n\t};\n};\n\nconst gitBootstrap = (fixture: string) => git.bootstrap(fixture, __dirname);\nconst fixBootstrap = (fixture: string) => fix.bootstrap(fixture, __dirname);\n\ntest(\"should fail when --cwd references a non-existent directory\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([\"--cwd\", \"doesNotExist\"], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stderr).toContain(\n\t\t'The specified --cwd directory \"doesNotExist\" does not exist.',\n\t);\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should fail when -d references a non-existent directory\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([\"-d\", \"doesNotExist\"], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stderr).toContain(\n\t\t'The specified --cwd directory \"doesNotExist\" does not exist.',\n\t);\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should fail when --cwd references an existing file instead of a directory\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst filePath = path.join(cwd, \"commitlint.config.js\");\n\tconst result = cli([\"--cwd\", filePath], {\n\t\tcwd,\n\t})(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stderr).toContain(\"is not a directory\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should succeed when --cwd references an existing directory\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([\"--cwd\", cwd], { cwd })(\"type: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should throw when called without [input]\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([], { cwd })();\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should reprint input from stdin\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"foo: bar\");\n});\n\ntest(\"should produce success output with --verbose flag\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([\"--verbose\"], { cwd })(\"type: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"0 problems, 0 warnings\");\n\texpect(output.stderr).toEqual(\"\");\n});\n\ntest(\"should produce last commit and success output with --verbose flag\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/simple\");\n\tawait x(\"git\", [\"add\", \"commitlint.config.js\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", '\"test: this should work\"'], {\n\t\tnodeOptions: { cwd },\n\t});\n\tconst result = cli([\"--last\", \"--verbose\"], { cwd })();\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"0 problems, 0 warnings\");\n\texpect(output.stdout.trim()).toContain(\"test: this should work\");\n\texpect(output.stderr).toEqual(\"\");\n});\n\ntest(\"regression test for running with --last flag\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/last-flag-regression\");\n\tawait x(\"git\", [\"add\", \"commitlint.config.js\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", '\"test: this should work\"'], {\n\t\tnodeOptions: { cwd },\n\t});\n\tconst result = cli([\"--last\", \"--verbose\"], { cwd })();\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"0 problems, 0 warnings\");\n\texpect(output.stdout.trim()).toContain(\"test: this should work\");\n\texpect(output.stderr).toEqual(\"\");\n});\n\ntest(\"should produce no output with --quiet flag\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([\"--quiet\"], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toEqual(\"\");\n\texpect(output.stderr).toEqual(\"\");\n});\n\ntest(\"should produce no output with -q flag\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([\"-q\"], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toEqual(\"\");\n\texpect(output.stderr).toEqual(\"\");\n});\n\ntest(\"should produce help for empty config\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/empty\");\n\tconst result = cli([], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"Please add rules\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintInvalidArgument);\n});\n\ntest(\"should produce help for problems\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\n\t\t\"Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint\",\n\t);\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should produce help for problems with correct helpurl\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli(\n\t\t[\"-H https://github.com/conventional-changelog/commitlint/#testhelpurl\"],\n\t\t{ cwd },\n\t)(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\n\t\t\"Get help: https://github.com/conventional-changelog/commitlint/#testhelpurl\",\n\t);\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should fail for input from stdin without rules\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/empty\");\n\tconst result = cli([], { cwd })(\"foo: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintInvalidArgument);\n});\n\ntest(\"should succeed for input from stdin with rules\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([], { cwd })(\"type: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should fail for input from stdin with rule from rc\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/simple\");\n\tconst result = cli([], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"type must not be one of [foo]\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should work with --config option\", async () => {\n\tconst file = \"config/commitlint.config.js\";\n\tconst cwd = await gitBootstrap(\"fixtures/specify-config-file\");\n\tconst result = cli([\"--config\", file], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"type must not be one of [foo]\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should fail for input from stdin with rule from js\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/extends-root\");\n\tconst result = cli([\"--extends\", \"./extended\"], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"type must not be one of [foo]\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should output help URL defined in config file\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/help-url\");\n\tconst result = cli([], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\n\t\t\"Get help: https://www.example.com/foo\",\n\t);\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should produce no error output with --quiet flag\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/simple\");\n\tconst result = cli([\"--quiet\"], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toEqual(\"\");\n\texpect(output.stderr).toEqual(\"\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should produce no error output with -q flag\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/simple\");\n\tconst result = cli([\"-q\"], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stdout.trim()).toEqual(\"\");\n\texpect(output.stderr).toEqual(\"\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should work with husky commitmsg hook and git commit\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/husky/integration\");\n\tawait writePkg(\n\t\t{ husky: { hooks: { \"commit-msg\": `'${bin}' -e` } } },\n\t\t{ cwd },\n\t);\n\n\t// await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines\n\tawait x(\"git\", [\"add\", \"package.json\"], { nodeOptions: { cwd } });\n\tconst commit = await x(\"git\", [\"commit\", \"-m\", '\"test: this should work\"'], {\n\t\tnodeOptions: { cwd },\n\t});\n\n\texpect(commit).toBeTruthy();\n});\n\ntest(\"should work with husky commitmsg hook in sub packages\", async () => {\n\tconst upper = await gitBootstrap(\"fixtures/husky\");\n\tconst cwd = path.join(upper, \"integration\");\n\tawait writePkg(\n\t\t{ husky: { hooks: { \"commit-msg\": `'${bin}' -e` } } },\n\t\t{ cwd: upper },\n\t);\n\n\t// await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines\n\tawait x(\"git\", [\"add\", \"package.json\"], { nodeOptions: { cwd } });\n\tconst commit = await x(\"git\", [\"commit\", \"-m\", '\"test: this should work\"'], {\n\t\tnodeOptions: { cwd },\n\t});\n\texpect(commit).toBeTruthy();\n});\n\ntest(\"should work with husky via commitlint -e $GIT_PARAMS\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/husky/integration\");\n\tawait writePkg(\n\t\t{ husky: { hooks: { \"commit-msg\": `'${bin}' -e $GIT_PARAMS` } } },\n\t\t{ cwd },\n\t);\n\n\t// await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines\n\tawait x(\"git\", [\"add\", \"package.json\"], { nodeOptions: { cwd } });\n\tconst commit = await x(\"git\", [\"commit\", \"-m\", '\"test: this should work\"'], {\n\t\tnodeOptions: { cwd },\n\t});\n\texpect(commit).toBeTruthy();\n});\n\ntest(\"should work with husky via commitlint -e %GIT_PARAMS%\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/husky/integration\");\n\tawait writePkg(\n\t\t{ husky: { hooks: { \"commit-msg\": `'${bin}' -e %GIT_PARAMS%` } } },\n\t\t{ cwd },\n\t);\n\n\t// await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines\n\tawait x(\"git\", [\"add\", \"package.json\"], { nodeOptions: { cwd } });\n\tconst commit = await x(\"git\", [\"commit\", \"-m\", '\"test: this should work\"'], {\n\t\tnodeOptions: { cwd },\n\t});\n\texpect(commit).toBeTruthy();\n});\n\ntest(\"should work with husky via commitlint -e $HUSKY_GIT_PARAMS\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/husky/integration\");\n\tawait writePkg(\n\t\t{ husky: { hooks: { \"commit-msg\": `'${bin}' -e $HUSKY_GIT_PARAMS` } } },\n\t\t{ cwd },\n\t);\n\n\t// await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines\n\tawait x(\"git\", [\"add\", \"package.json\"], { nodeOptions: { cwd } });\n\tconst commit = await x(\"git\", [\"commit\", \"-m\", '\"test: this should work\"'], {\n\t\tnodeOptions: { cwd },\n\t});\n\texpect(commit).toBeTruthy();\n});\n\ntest(\"should work with husky via commitlint -e %HUSKY_GIT_PARAMS%\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/husky/integration\");\n\tawait writePkg(\n\t\t{ husky: { hooks: { \"commit-msg\": `'${bin}' -e %HUSKY_GIT_PARAMS%` } } },\n\t\t{ cwd },\n\t);\n\n\t// await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines\n\tawait x(\"git\", [\"add\", \"package.json\"], { nodeOptions: { cwd } });\n\tconst commit = await x(\"git\", [\"commit\", \"-m\", '\"test: this should work\"'], {\n\t\tnodeOptions: { cwd },\n\t});\n\texpect(commit).toBeTruthy();\n});\n\ntest(\"should allow reading of environment variables for edit file, succeeding if valid\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/simple\");\n\tawait fs.writeFile(path.join(cwd, \"commit-msg-file\"), \"foo\");\n\tconst result = cli([\"--env\", \"variable\"], {\n\t\tcwd,\n\t\tenv: { variable: \"commit-msg-file\" },\n\t})();\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should allow reading of environment variables for edit file, failing if invalid\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/simple\");\n\tawait fs.writeFile(\n\t\tpath.join(cwd, \"commit-msg-file\"),\n\t\t\"foo: bar\\n\\nFoo bar bizz buzz.\\n\\nCloses #123.\",\n\t);\n\tconst result = cli([\"--env\", \"variable\"], {\n\t\tcwd,\n\t\tenv: { variable: \"commit-msg-file\" },\n\t})();\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should pick up parser preset and fail accordingly\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/parser-preset\");\n\tconst result = cli([\"--parser-preset\", \"./parser-preset\"], { cwd })(\n\t\t\"type(scope): subject\",\n\t);\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"may not be empty\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should pick up parser preset and succeed accordingly\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/parser-preset\");\n\tconst result = cli([\"--parser-preset\", \"./parser-preset\"], { cwd })(\n\t\t\"----type(scope): subject\",\n\t);\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should pick up config from outside git repo and fail accordingly\", async () => {\n\tconst outer = await fixBootstrap(\"fixtures/outer-scope\");\n\tconst cwd = await git.init(path.join(outer, \"inner-scope\"));\n\n\tconst result = cli([], { cwd })(\"inner: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should pick up config from outside git repo and succeed accordingly\", async () => {\n\tconst outer = await fixBootstrap(\"fixtures/outer-scope\");\n\tconst cwd = await git.init(path.join(outer, \"inner-scope\"));\n\n\tconst result = cli([], { cwd })(\"outer: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should pick up config from inside git repo with precedence and succeed accordingly\", async () => {\n\tconst outer = await fixBootstrap(\"fixtures/inner-scope\");\n\tconst cwd = await git.init(path.join(outer, \"inner-scope\"));\n\n\tconst result = cli([], { cwd })(\"inner: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should pick up config from inside git repo with precedence and fail accordingly\", async () => {\n\tconst outer = await fixBootstrap(\"fixtures/inner-scope\");\n\tconst cwd = await git.init(path.join(outer, \"inner-scope\"));\n\n\tconst result = cli([], { cwd })(\"outer: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should handle --amend with signoff\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/signoff\");\n\tawait writePkg(\n\t\t{ husky: { hooks: { \"commit-msg\": `'${bin}' -e` } } },\n\t\t{ cwd },\n\t);\n\n\t// await x('npm', ['install'], { nodeOptions: {cwd}}); // npm install is failing on windows machines\n\tawait x(\"git\", [\"add\", \"package.json\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", '\"test: this should work\"', \"--signoff\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tconst commit = await x(\"git\", [\"commit\", \"--amend\", \"--no-edit\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\n\texpect(commit).toBeTruthy();\n}, 10000);\n\ntest(\"it uses parserOpts.commentChar when not using edit mode\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/comment-char\");\n\tconst input = \"header: foo\\n$body\\n\";\n\n\tconst result = cli([], { cwd })(input);\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"[body-empty]\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"it doesn't use parserOpts.commentChar when using edit mode\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/comment-char\");\n\tawait fs.writeFile(\n\t\tpath.join(cwd, \".git\", \"COMMIT_EDITMSG\"),\n\t\t\"header: foo\\n\\n$body\\n\",\n\t);\n\n\tconst result = cli([\"--edit\", \".git/COMMIT_EDITMSG\"], { cwd })();\n\tconst output = await result;\n\texpect(output.stdout.trim()).not.toContain(\"[body-empty]\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"it uses core.commentChar git config when using edit mode\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/comment-char\");\n\tawait x(\"git\", [\"config\", \"--local\", \"core.commentChar\", \"$\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tawait fs.writeFile(\n\t\tpath.join(cwd, \".git\", \"COMMIT_EDITMSG\"),\n\t\t\"header: foo\\n\\n$body\\n\",\n\t);\n\n\tconst result = cli([\"--edit\", \".git/COMMIT_EDITMSG\"], { cwd })();\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"[body-empty]\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"it falls back to # for core.commentChar when using edit mode\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/comment-char\");\n\tawait fs.writeFile(\n\t\tpath.join(cwd, \".git\", \"COMMIT_EDITMSG\"),\n\t\t\"header: foo\\n\\n#body\\n\",\n\t);\n\n\tconst result = cli([\"--edit\", \".git/COMMIT_EDITMSG\"], { cwd })();\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"[body-empty]\");\n\texpect(output.stderr).toEqual(\"\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should handle linting with issue prefixes\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/issue-prefixes\");\n\tconst result = cli([], { cwd })(\"foobar REF-1\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n}, 10000);\n\ntest(\"should print full commit message when input from stdin fails\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/simple\");\n\tconst input = \"foo: bar\\n\\nFoo bar bizz buzz.\\n\\nCloses #123.\";\n\t// output text in plain text so we can compare it\n\tconst result = cli([\"--color=false\"], { cwd })(input);\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(input);\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should not print commit message fully or partially when input succeeds\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst message = \"type: bar\\n\\nFoo bar bizz buzz.\\n\\nCloses #123.\";\n\t// output text in plain text so we can compare it\n\tconst result = cli([\"--color=false\"], { cwd })(message);\n\tconst output = await result;\n\texpect(output.stdout.trim()).not.toContain(message);\n\texpect(output.stdout.trim()).not.toContain(message.split(\"\\n\")[0]);\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should fail for invalid formatters from configuration\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/custom-formatter\");\n\tconst result = cli([], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stderr).toContain(\n\t\t\"Using format custom-formatter, but cannot find the module\",\n\t);\n\texpect(output.stdout.trim()).toEqual(\"\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should skip linting if message matches ignores config\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/ignores\");\n\tconst result = cli([], { cwd })(\"WIP\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should not skip linting if message does not match ignores config\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/ignores\");\n\tconst result = cli([], { cwd })(\"foo\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should not skip linting if defaultIgnores is false\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default-ignores-false\");\n\tconst result = cli([], { cwd })(\"fixup! foo: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should skip linting if defaultIgnores is true\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default-ignores-true\");\n\tconst result = cli([], { cwd })(\"fixup! foo: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should skip linting if defaultIgnores is unset\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default-ignores-unset\");\n\tconst result = cli([], { cwd })(\"fixup! foo: bar\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should fail for invalid formatters from flags\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/custom-formatter\");\n\tconst result = cli([\"--format\", \"through-flag\"], { cwd })(\"foo: bar\");\n\tconst output = await result;\n\texpect(output.stderr).toContain(\n\t\t\"Using format through-flag, but cannot find the module\",\n\t);\n\texpect(output.stdout.trim()).toEqual(\"\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintErrorDefault);\n});\n\ntest(\"should work with absolute formatter path\", async () => {\n\tconst formatterPath = path.resolve(\n\t\t__dirname,\n\t\t\"../fixtures/custom-formatter/formatters/custom.js\",\n\t);\n\tconst cwd = await gitBootstrap(\"fixtures/custom-formatter\");\n\tconst result = cli([\"--format\", formatterPath], { cwd })(\n\t\t\"test: this should work\",\n\t);\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"custom-formatter-ok\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should work with relative formatter path\", async () => {\n\tconst cwd = path.resolve(\n\t\tawait gitBootstrap(\"fixtures/custom-formatter\"),\n\t\t\"./formatters\",\n\t);\n\tconst result = cli([\"--format\", \"./custom.js\"], { cwd })(\n\t\t\"test: this should work\",\n\t);\n\tconst output = await result;\n\texpect(output.stdout.trim()).toContain(\"custom-formatter-ok\");\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"strict: should exit with 3 on error\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/warning\");\n\tconst result = cli([\"--strict\"], { cwd })(\"foo: abcdef\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitLintError);\n});\n\ntest(\"strict: should exit with 2 on warning\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/warning\");\n\tconst result = cli([\"--strict\"], { cwd })(\"feat: abcdef\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitLintWarning);\n});\n\ntest(\"strict: should exit with 0 on success\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/warning\");\n\tconst result = cli([\"--strict\"], { cwd })(\"feat: abc\");\n\tawait result;\n\texpect(result.exitCode).toBe(ExitCode.CommitlintDefault);\n});\n\ntest(\"should print help\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([\"--help\"], { cwd })();\n\tconst output = await result;\n\tconst version = require(\"../package.json\").version;\n\tconst stdout = output.stdout.trim().replace(`@${version}`, \"@dev\");\n\texpect(stdout).toMatchInlineSnapshot(`\n\t\t\"@commitlint/cli@dev - Lint your commit messages\n\n\t\t[input] reads from stdin if --edit, --env, --from and --to are omitted\n\n\t\tOptions:\n\t\t  -c, --color          toggle colored output  [boolean] [default: true]\n\t\t  -g, --config         path to the config file; result code 9 if config is missing  [string]\n\t\t      --print-config   print resolved config  [string] [choices: \"\", \"text\", \"json\"]\n\t\t  -d, --cwd            directory to execute in  [string] [default: (Working Directory)]\n\t\t  -e, --edit           read last commit message from the specified file or fallbacks to ./.git/COMMIT_EDITMSG  [string]\n\t\t  -E, --env            check message in the file at path given by environment variable value  [string]\n\t\t  -x, --extends        array of shareable configurations to extend  [array]\n\t\t  -H, --help-url       help url in error message  [string]\n\t\t  -f, --from           lower end of the commit range to lint; applies if edit=false  [string]\n\t\t      --from-last-tag  uses the last tag as the lower end of the commit range to lint; applies if edit=false and from is not set  [boolean]\n\t\t      --git-log-args   additional git log arguments as space separated string, example '--first-parent --cherry-pick'  [string]\n\t\t  -l, --last           just analyze the last commit; applies if edit=false  [boolean]\n\t\t  -o, --format         output format of the results  [string]\n\t\t  -p, --parser-preset  configuration preset to use for conventional-commits-parser  [string]\n\t\t  -q, --quiet          toggle console output  [boolean] [default: false]\n\t\t  -t, --to             upper end of the commit range to lint; applies if edit=false  [string]\n\t\t  -V, --verbose        enable verbose output for reports without problems  [boolean]\n\t\t  -s, --strict         enable strict mode; result code 2 for warnings, 3 for errors  [boolean]\n\t\t      --options        path to a JSON file or Common.js module containing CLI options\n\t\t  -v, --version        display version information  [boolean]\n\t\t  -h, --help           Show help  [boolean]\"\n\t`);\n});\n\ntest(\"should print version\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\tconst result = cli([\"--version\"], { cwd })();\n\tconst output = await result;\n\texpect(output.stdout.trim()).toMatch(\"@commitlint/cli@\");\n});\n\ndescribe(\"should print config\", () => {\n\ttest(\"should print config when flag is present but without value\", async () => {\n\t\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\t\tconst result = cli([\"--print-config\", \"text\", \"--no-color\"], { cwd })();\n\t\tconst output = await result;\n\t\tconst stdout = output.stdout\n\t\t\t.trim()\n\t\t\t.replace(/^{[^\\n]/g, \"{\\n  \")\n\t\t\t.replace(/[^\\n]}$/g, \"\\n}\")\n\t\t\t.replace(/(helpUrl:)\\n[ ]+/, \"$1 \");\n\t\texpect(stdout).toMatchInlineSnapshot(`\n\t\t\"{\n\t\t  extends: [],\n\t\t  formatter: '@commitlint/format',\n\t\t  parserPreset: undefined,\n\t\t  ignores: undefined,\n\t\t  defaultIgnores: undefined,\n\t\t  plugins: {},\n\t\t  rules: { 'type-enum': [ 2, 'never', [ 'foo' ] ] },\n\t\t  helpUrl: 'https://github.com/conventional-changelog/commitlint/#what-is-commitlint',\n\t\t  prompt: {}\n\t\t}\"\n\t`);\n\t});\n\n\ttest(\"should print config when flag has `text` value\", async () => {\n\t\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\t\tconst result = cli([\"--print-config=text\", \"--no-color\"], { cwd })();\n\t\tconst output = await result;\n\t\tconst stdout = output.stdout\n\t\t\t.trim()\n\t\t\t.replace(/^{[^\\n]/g, \"{\\n  \")\n\t\t\t.replace(/[^\\n]}$/g, \"\\n}\")\n\t\t\t.replace(/(helpUrl:)\\n[ ]+/, \"$1 \");\n\t\texpect(stdout).toMatchInlineSnapshot(`\n\t\t\"{\n\t\t  extends: [],\n\t\t  formatter: '@commitlint/format',\n\t\t  parserPreset: undefined,\n\t\t  ignores: undefined,\n\t\t  defaultIgnores: undefined,\n\t\t  plugins: {},\n\t\t  rules: { 'type-enum': [ 2, 'never', [ 'foo' ] ] },\n\t\t  helpUrl: 'https://github.com/conventional-changelog/commitlint/#what-is-commitlint',\n\t\t  prompt: {}\n\t\t}\"\n\t`);\n\t});\n\n\ttest(\"should print config when flag has `json` value\", async () => {\n\t\tconst cwd = await gitBootstrap(\"fixtures/default\");\n\t\tconst result = cli([\"--print-config=json\", \"--no-color\"], { cwd })();\n\t\tconst output = await result;\n\t\texpect(output.stdout.trim()).toMatchInlineSnapshot(\n\t\t\t`\"{\"extends\":[],\"formatter\":\"@commitlint/format\",\"plugins\":{},\"rules\":{\"type-enum\":[2,\"never\",[\"foo\"]]},\"helpUrl\":\"https://github.com/conventional-changelog/commitlint/#what-is-commitlint\",\"prompt\":{}}\"`,\n\t\t);\n\t});\n});\n\nasync function writePkg(payload: unknown, options: TestOptions) {\n\tconst pkgPath = path.join(options.cwd, \"package.json\");\n\tconst pkg = JSON.parse(await fs.readFile(pkgPath, \"utf-8\"));\n\tconst result = mergeWith(pkg, payload);\n\tawait fs.writeFile(pkgPath, JSON.stringify(result, null, \"  \"));\n}\n"
  },
  {
    "path": "@commitlint/cli/src/cli.ts",
    "content": "import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport util from \"node:util\";\n\nimport lint from \"@commitlint/lint\";\nimport load, { resolveFromSilent, resolveGlobalSilent } from \"@commitlint/load\";\nimport read from \"@commitlint/read\";\nimport type {\n\tFormatter,\n\tLintOptions,\n\tLintOutcome,\n\tParserPreset,\n\tQualifiedConfig,\n\tUserConfig,\n} from \"@commitlint/types\";\nimport type { ParserOptions as Options } from \"conventional-commits-parser\";\nimport { x } from \"tinyexec\";\nimport yargs, { type Arguments } from \"yargs\";\n\nimport { CliFlags } from \"./types.js\";\n\nimport { CliError, ExitCode } from \"./cli-error.js\";\n\nconst require = createRequire(import.meta.url);\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\nconst dynamicImport = async <T>(id: string): Promise<T> => {\n\tconst imported = await import(\n\t\tpath.isAbsolute(id) ? pathToFileURL(id).toString() : id\n\t);\n\treturn (\"default\" in imported && imported.default) || imported;\n};\n\nconst pkg: typeof import(\"../package.json\") = require(\"../package.json\");\n\nconst gitDefaultCommentChar = \"#\";\n\nconst cli = yargs(process.argv.slice(2))\n\t.options({\n\t\tcolor: {\n\t\t\talias: \"c\",\n\t\t\tdefault: true,\n\t\t\tdescription: \"toggle colored output\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tconfig: {\n\t\t\talias: \"g\",\n\t\t\tdescription:\n\t\t\t\t\"path to the config file; result code 9 if config is missing\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\t\"print-config\": {\n\t\t\tchoices: [\"\", \"text\", \"json\"],\n\t\t\tdescription: \"print resolved config\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tcwd: {\n\t\t\talias: \"d\",\n\t\t\tdefault: process.cwd(),\n\t\t\tdefaultDescription: \"(Working Directory)\",\n\t\t\tdescription: \"directory to execute in\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tedit: {\n\t\t\talias: \"e\",\n\t\t\tdescription:\n\t\t\t\t\"read last commit message from the specified file or fallbacks to ./.git/COMMIT_EDITMSG\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tenv: {\n\t\t\talias: \"E\",\n\t\t\tdescription:\n\t\t\t\t\"check message in the file at path given by environment variable value\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\textends: {\n\t\t\talias: \"x\",\n\t\t\tdescription: \"array of shareable configurations to extend\",\n\t\t\ttype: \"array\",\n\t\t},\n\t\t\"help-url\": {\n\t\t\talias: \"H\",\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"help url in error message\",\n\t\t},\n\t\tfrom: {\n\t\t\talias: \"f\",\n\t\t\tdescription:\n\t\t\t\t\"lower end of the commit range to lint; applies if edit=false\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\t\"from-last-tag\": {\n\t\t\tdescription:\n\t\t\t\t\"uses the last tag as the lower end of the commit range to lint; applies if edit=false and from is not set\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\t\"git-log-args\": {\n\t\t\tdescription:\n\t\t\t\t\"additional git log arguments as space separated string, example '--first-parent --cherry-pick'\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tlast: {\n\t\t\talias: \"l\",\n\t\t\tdescription: \"just analyze the last commit; applies if edit=false\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tformat: {\n\t\t\talias: \"o\",\n\t\t\tdescription: \"output format of the results\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\t\"parser-preset\": {\n\t\t\talias: \"p\",\n\t\t\tdescription:\n\t\t\t\t\"configuration preset to use for conventional-commits-parser\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tquiet: {\n\t\t\talias: \"q\",\n\t\t\tdefault: false,\n\t\t\tdescription: \"toggle console output\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tto: {\n\t\t\talias: \"t\",\n\t\t\tdescription:\n\t\t\t\t\"upper end of the commit range to lint; applies if edit=false\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tverbose: {\n\t\t\talias: \"V\",\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"enable verbose output for reports without problems\",\n\t\t},\n\t\tstrict: {\n\t\t\talias: \"s\",\n\t\t\ttype: \"boolean\",\n\t\t\tdescription:\n\t\t\t\t\"enable strict mode; result code 2 for warnings, 3 for errors\",\n\t\t},\n\t})\n\t.version(\n\t\t\"version\",\n\t\t\"display version information\",\n\t\t`${pkg.name}@${pkg.version}`,\n\t)\n\t.alias(\"v\", \"version\")\n\t.help(\"help\")\n\t.alias(\"h\", \"help\")\n\t.config(\n\t\t\"options\",\n\t\t\"path to a JSON file or Common.js module containing CLI options\",\n\t\trequire,\n\t)\n\t.usage(`${pkg.name}@${pkg.version} - ${pkg.description}\\n`)\n\t.usage(\n\t\t`[input] reads from stdin if --edit, --env, --from and --to are omitted`,\n\t)\n\t.strict();\n\n/**\n * avoid description words to be divided in new lines when there is enough space\n * @see https://github.com/conventional-changelog/commitlint/pull/3850#discussion_r1472251234\n */\ncli.wrap(cli.terminalWidth());\n\nmain(cli.argv).catch((err) => {\n\tsetTimeout(() => {\n\t\tif (err.type === pkg.name) {\n\t\t\tprocess.exit(err.error_code);\n\t\t}\n\t\tthrow err;\n\t}, 0);\n});\n\nasync function stdin() {\n\tlet result = \"\";\n\n\tif (process.stdin.isTTY) {\n\t\treturn result;\n\t}\n\n\tprocess.stdin.setEncoding(\"utf8\");\n\n\tfor await (const chunk of process.stdin) {\n\t\tresult += chunk;\n\t}\n\n\treturn result;\n}\n\ntype MainArgsObject = {\n\t[key in keyof Arguments<CliFlags>]: Arguments<CliFlags>[key];\n};\ntype MainArgsPromise = Promise<MainArgsObject>;\ntype MainArgs = MainArgsObject | MainArgsPromise;\n\nasync function resolveArgs(args: MainArgs): Promise<MainArgsObject> {\n\treturn typeof args.then === \"function\" ? await args : args;\n}\n\nasync function main(args: MainArgs): Promise<void> {\n\tconst options = await resolveArgs(args);\n\tif (typeof options.edit === \"undefined\") {\n\t\toptions.edit = false;\n\t}\n\n\tconst raw = options._;\n\tconst flags = normalizeFlags(options);\n\n\ttry {\n\t\tif (!fs.statSync(flags.cwd).isDirectory()) {\n\t\t\tconst err = new CliError(\n\t\t\t\t`The specified --cwd path \"${flags.cwd}\" is not a directory.`,\n\t\t\t\tpkg.name,\n\t\t\t);\n\t\t\tconsole.error(err.message);\n\t\t\tthrow err;\n\t\t}\n\t} catch (e) {\n\t\tif (e instanceof CliError) {\n\t\t\tthrow e;\n\t\t}\n\t\tconst code = (e as NodeJS.ErrnoException).code;\n\t\tconst message =\n\t\t\tcode === \"ENOENT\"\n\t\t\t\t? `The specified --cwd directory \"${flags.cwd}\" does not exist.`\n\t\t\t\t: `Cannot access the specified --cwd directory \"${flags.cwd}\": ${code ?? (e as Error).message}`;\n\t\tconst err = new CliError(message, pkg.name);\n\t\tconsole.error(err.message);\n\t\tthrow err;\n\t}\n\n\tif (typeof options[\"print-config\"] === \"string\") {\n\t\tconst loaded = await load(getSeed(flags), {\n\t\t\tcwd: flags.cwd,\n\t\t\tfile: flags.config,\n\t\t});\n\n\t\tswitch (options[\"print-config\"]) {\n\t\t\tcase \"json\":\n\t\t\t\tconsole.log(JSON.stringify(loaded));\n\t\t\t\treturn;\n\n\t\t\tcase \"text\":\n\t\t\tdefault:\n\t\t\t\tconsole.log(util.inspect(loaded, false, null, options.color));\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tconst fromStdin = checkFromStdin(raw, flags);\n\n\tif (\n\t\tObject.hasOwn(flags, \"last\") &&\n\t\t(Object.hasOwn(flags, \"from\") || Object.hasOwn(flags, \"to\") || flags.edit)\n\t) {\n\t\tconst err = new CliError(\n\t\t\t\"Please use the --last flag alone. The --last flag should not be used with --to or --from or --edit.\",\n\t\t\tpkg.name,\n\t\t);\n\t\tcli.showHelp(\"log\");\n\t\tconsole.log(err.message);\n\t\tthrow err;\n\t}\n\n\tconst input = await (fromStdin\n\t\t? stdin()\n\t\t: read({\n\t\t\t\tto: flags.to,\n\t\t\t\tfrom: flags.from,\n\t\t\t\tfromLastTag: flags[\"from-last-tag\"],\n\t\t\t\tlast: flags.last,\n\t\t\t\tedit: flags.edit,\n\t\t\t\tcwd: flags.cwd,\n\t\t\t\tgitLogArgs: flags[\"git-log-args\"],\n\t\t\t}));\n\n\tconst messages = (Array.isArray(input) ? input : [input])\n\t\t.filter((message) => typeof message === \"string\")\n\t\t.filter((message) => message.trim() !== \"\")\n\t\t.filter(Boolean);\n\n\tif (messages.length === 0 && !checkFromRepository(flags)) {\n\t\tconst err = new CliError(\n\t\t\t\"[input] is required: supply via stdin, or --env or --edit or --last or --from and --to\",\n\t\t\tpkg.name,\n\t\t);\n\t\tcli.showHelp(\"log\");\n\t\tconsole.log(err.message);\n\t\tthrow err;\n\t}\n\n\tconst loaded = await load(getSeed(flags), {\n\t\tcwd: flags.cwd,\n\t\tfile: flags.config,\n\t});\n\tconst parserOpts = selectParserOpts(loaded.parserPreset);\n\tconst opts: LintOptions & { parserOpts: Options } = {\n\t\tparserOpts: {},\n\t\tplugins: {},\n\t\tignores: [],\n\t\tdefaultIgnores: true,\n\t};\n\tif (parserOpts) {\n\t\topts.parserOpts = parserOpts;\n\t}\n\tif (loaded.plugins) {\n\t\topts.plugins = loaded.plugins;\n\t}\n\tif (loaded.ignores) {\n\t\topts.ignores = loaded.ignores;\n\t}\n\tif (loaded.defaultIgnores === false) {\n\t\topts.defaultIgnores = false;\n\t}\n\tconst format = await loadFormatter(loaded, flags);\n\n\t// If reading from `.git/COMMIT_EDIT_MSG`, strip comments using\n\t// core.commentChar from git configuration, falling back to '#'.\n\tif (flags.edit) {\n\t\tconst result = x(\"git\", [\"config\", \"core.commentChar\"]);\n\t\tconst output = await result;\n\n\t\tif (result.exitCode && result.exitCode > 1) {\n\t\t\tconsole.warn(\n\t\t\t\t\"Could not determine core.commentChar git configuration\",\n\t\t\t\toutput.stderr,\n\t\t\t);\n\t\t\topts.parserOpts.commentChar = gitDefaultCommentChar;\n\t\t} else {\n\t\t\topts.parserOpts.commentChar =\n\t\t\t\toutput.stdout.trim() || gitDefaultCommentChar;\n\t\t}\n\t}\n\n\tconst results = await Promise.all(\n\t\tmessages.map((message) => lint(message, loaded.rules, opts)),\n\t);\n\n\tlet isRulesEmpty = false;\n\tif (Object.keys(loaded.rules).length === 0) {\n\t\tlet input = \"\";\n\n\t\tif (results.length !== 0) {\n\t\t\tinput = results[0].input;\n\t\t}\n\n\t\tresults.splice(0, results.length, {\n\t\t\tvalid: false,\n\t\t\terrors: [\n\t\t\t\t{\n\t\t\t\t\tlevel: 2,\n\t\t\t\t\tvalid: false,\n\t\t\t\t\tname: \"empty-rules\",\n\t\t\t\t\tmessage: [\n\t\t\t\t\t\t\"Please add rules to your `commitlint.config.js`\",\n\t\t\t\t\t\t\"    - Getting started guide: https://commitlint.js.org/guides/getting-started\",\n\t\t\t\t\t\t\"    - Example config: https://github.com/conventional-changelog/commitlint/blob/master/%40commitlint/config-conventional/src/index.ts\",\n\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t},\n\t\t\t],\n\t\t\twarnings: [],\n\t\t\tinput,\n\t\t});\n\n\t\tisRulesEmpty = true;\n\t}\n\n\tconst report = results.reduce<{\n\t\tvalid: boolean;\n\t\terrorCount: number;\n\t\twarningCount: number;\n\t\tresults: LintOutcome[];\n\t}>(\n\t\t(info, result) => {\n\t\t\tinfo.valid = result.valid ? info.valid : false;\n\t\t\tinfo.errorCount += result.errors.length;\n\t\t\tinfo.warningCount += result.warnings.length;\n\t\t\tinfo.results.push(result);\n\n\t\t\treturn info;\n\t\t},\n\t\t{\n\t\t\tvalid: true,\n\t\t\terrorCount: 0,\n\t\t\twarningCount: 0,\n\t\t\tresults: [],\n\t\t},\n\t);\n\n\tconst helpUrl = flags[\"help-url\"]?.trim() || loaded.helpUrl;\n\n\tconst output = format(report, {\n\t\tcolor: flags.color,\n\t\tverbose: flags.verbose,\n\t\thelpUrl,\n\t});\n\n\tif (!flags.quiet && output !== \"\") {\n\t\tconsole.log(output);\n\t}\n\n\tif (flags.strict) {\n\t\tif (report.errorCount > 0) {\n\t\t\tthrow new CliError(output, pkg.name, ExitCode.CommitLintError);\n\t\t}\n\t\tif (report.warningCount > 0) {\n\t\t\tthrow new CliError(output, pkg.name, ExitCode.CommitLintWarning);\n\t\t}\n\t}\n\tif (isRulesEmpty) {\n\t\tthrow new CliError(output, pkg.name, ExitCode.CommitlintInvalidArgument);\n\t}\n\tif (!report.valid) {\n\t\tthrow new CliError(output, pkg.name);\n\t}\n}\n\nfunction checkFromStdin(input: (string | number)[], flags: CliFlags): boolean {\n\treturn input.length === 0 && !checkFromRepository(flags);\n}\n\nfunction checkFromRepository(flags: CliFlags): boolean {\n\treturn checkFromHistory(flags) || checkFromEdit(flags);\n}\n\nfunction checkFromEdit(flags: CliFlags): boolean {\n\treturn Boolean(flags.edit) || Boolean(flags.env);\n}\n\nfunction checkFromHistory(flags: CliFlags): boolean {\n\treturn (\n\t\ttypeof flags.from === \"string\" ||\n\t\ttypeof flags[\"from-last-tag\"] === \"boolean\" ||\n\t\ttypeof flags.to === \"string\" ||\n\t\ttypeof flags.last === \"boolean\"\n\t);\n}\n\nfunction normalizeFlags(flags: CliFlags): CliFlags {\n\tconst edit = getEditValue(flags);\n\treturn {\n\t\t...flags,\n\t\tedit,\n\t};\n}\n\nfunction getEditValue(flags: CliFlags) {\n\tif (flags.env) {\n\t\tif (!(flags.env in process.env)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Received '${flags.env}' as value for -E | --env, but environment variable '${flags.env}' is not available globally`,\n\t\t\t);\n\t\t}\n\t\treturn process.env[flags.env];\n\t}\n\tconst { edit } = flags;\n\t// If the edit flag is set but empty (i.e '-e') we default\n\t// to .git/COMMIT_EDITMSG\n\tif (edit === \"\") {\n\t\treturn true;\n\t}\n\tif (typeof edit === \"boolean\") {\n\t\treturn edit;\n\t}\n\t// The recommended method to specify -e with husky was `commitlint -e $HUSKY_GIT_PARAMS`\n\t// This does not work properly with win32 systems, where env variable declarations\n\t// use a different syntax\n\t// See https://github.com/conventional-changelog/commitlint/issues/103 for details\n\t// This has been superceded by the `-E GIT_PARAMS` / `-E HUSKY_GIT_PARAMS`\n\tconst isGitParams = edit === \"$GIT_PARAMS\" || edit === \"%GIT_PARAMS%\";\n\tconst isHuskyParams =\n\t\tedit === \"$HUSKY_GIT_PARAMS\" || edit === \"%HUSKY_GIT_PARAMS%\";\n\n\tif (isGitParams || isHuskyParams) {\n\t\tconsole.warn(`Using environment variable syntax (${edit}) in -e |\\\n--edit is deprecated. Use '{-E|--env} HUSKY_GIT_PARAMS instead'`);\n\n\t\tif (isGitParams && \"GIT_PARAMS\" in process.env) {\n\t\t\treturn process.env.GIT_PARAMS;\n\t\t}\n\t\tif (\"HUSKY_GIT_PARAMS\" in process.env) {\n\t\t\treturn process.env.HUSKY_GIT_PARAMS;\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Received ${edit} as value for -e | --edit, but GIT_PARAMS or HUSKY_GIT_PARAMS are not available globally.`,\n\t\t);\n\t}\n\treturn edit;\n}\n\nfunction getSeed(flags: CliFlags): UserConfig {\n\tconst n = (flags.extends || []).filter(\n\t\t(i): i is string => typeof i === \"string\",\n\t);\n\treturn n.length > 0\n\t\t? { extends: n, parserPreset: flags[\"parser-preset\"] }\n\t\t: { parserPreset: flags[\"parser-preset\"] };\n}\n\nfunction selectParserOpts(parserPreset: ParserPreset | undefined) {\n\tif (typeof parserPreset !== \"object\") {\n\t\treturn undefined;\n\t}\n\n\tif (typeof parserPreset.parserOpts !== \"object\") {\n\t\treturn undefined;\n\t}\n\n\treturn parserPreset.parserOpts;\n}\n\nfunction loadFormatter(\n\tconfig: QualifiedConfig,\n\tflags: CliFlags,\n): Promise<Formatter> {\n\tconst moduleName = flags.format || config.formatter || \"@commitlint/format\";\n\tconst modulePath =\n\t\tresolveFromSilent(moduleName, __dirname) ||\n\t\tresolveFromSilent(moduleName, flags.cwd) ||\n\t\tresolveGlobalSilent(moduleName);\n\n\tif (modulePath) {\n\t\treturn dynamicImport<Formatter>(modulePath);\n\t}\n\n\tthrow new Error(`Using format ${moduleName}, but cannot find the module.`);\n}\n\n// Catch unhandled rejections globally\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n\tconsole.log(\"Unhandled Rejection at: Promise \", promise, \" reason: \", reason);\n\tthrow reason;\n});\n"
  },
  {
    "path": "@commitlint/cli/src/types.ts",
    "content": "export interface CliFlags {\n\tcolor: boolean;\n\tconfig?: string;\n\tcwd: string;\n\tedit?: string | boolean;\n\tenv?: string;\n\textends?: (string | number)[];\n\thelp?: boolean;\n\t\"help-url\"?: string;\n\tfrom?: string;\n\t\"from-last-tag\"?: boolean;\n\t\"git-log-args\"?: string;\n\tlast?: boolean;\n\tformat?: string;\n\t\"parser-preset\"?: string;\n\tquiet: boolean;\n\tto?: string;\n\tversion?: boolean;\n\tverbose?: boolean;\n\t/** @type {'' | 'text' | 'json'} */\n\t\"print-config\"?: string;\n\tstrict?: boolean;\n\t_: (string | number)[];\n\t$0: string;\n}\n"
  },
  {
    "path": "@commitlint/cli/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src/**/*.ts\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@commitlint/config-angular/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n### Features\n\n- add subject-exclamation-mark rule to improve error messages ([#2593](https://github.com/conventional-changelog/commitlint/issues/2593)) ([be701bd](https://github.com/conventional-changelog/commitlint/commit/be701bdb1de4e667b7a872767244285c4fa4fda4))\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Features\n\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n### Bug Fixes\n\n- **core:** deprecate nlp rules ([bbab1d8](https://github.com/conventional-changelog/commitlint/commit/bbab1d8)), closes [#54](https://github.com/conventional-changelog/commitlint/issues/54)\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package @commitlint/config-angular\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n"
  },
  {
    "path": "@commitlint/config-angular/README.md",
    "content": "# @commitlint/config-angular\n\nLint your commits, angular-style\n\nShareable `commitlint` config enforcing the [Angular commit convention](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit).\nUse with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli).\n\n## Getting started\n\n```sh\nnpm install --save-dev @commitlint/config-angular @commitlint/cli\necho \"export default {extends: ['@commitlint/config-angular']};\" > commitlint.config.js\n```\n\n## Rules\n\n### Problems\n\nThe following rules are considered problems for `@commitlint/config-angular` and will yield a non-zero exit code when not met.\nConsult [Rules reference](https://commitlint.js.org/reference/rules) for a list of available rules.\n\n#### type-enum\n\n- **condition**: `type` is found in value\n- **rule**: `always`\n- **value**\n\n  ```\n  [\n    'build',\n    'ci',\n    'docs',\n    'feat',\n    'fix',\n    'perf',\n    'refactor',\n    'revert',\n    'style',\n    'test'\n  ]\n  ```\n\n```sh\necho \"foo: some message\" # fails\necho \"fix: some message\" # passes\n```\n\n#### type-case\n\n- **description**: `type` is in case `value`\n- **rule**: `always`\n- **value**\n  ```\n  'lowerCase'\n  ```\n\n```sh\necho \"FIX: some message\" # fails\necho \"fix: some message\" # passes\n```\n\n#### type-empty\n\n- **condition**: `type` is empty\n- **rule**: `never`\n\n```sh\necho \": some message\" # fails\necho \"fix: some message\" # passes\n```\n\n#### scope-case\n\n- **condition**: `scope` is in case `value`\n- **rule**: `always`\n\n```\n'lowerCase'\n```\n\n```sh\necho \"fix(SCOPE): some message\" # fails\necho \"fix(scope): some message\" # passes\n```\n\n#### subject-case\n\n- **condition**: `subject` is in one of the cases `['sentence-case', 'start-case', 'pascal-case', 'upper-case']`\n- **rule**: `never`\n\n```sh\necho \"fix(SCOPE): Some message\" # fails\necho \"fix(SCOPE): Some Message\" # fails\necho \"fix(SCOPE): SomeMessage\" # fails\necho \"fix(SCOPE): SOMEMESSAGE\" # fails\necho \"fix(scope): some message\" # passes\necho \"fix(scope): some Message\" # passes\n```\n\n#### subject-empty\n\n- **condition**: `subject` is empty\n- **rule**: `never`\n\n```sh\necho \"fix:\" # fails\necho \"fix: some message\" # passes\n```\n\n#### subject-full-stop\n\n- **condition**: `subject` ends with `value`\n- **rule**: `never`\n- **value**\n\n```\n'.'\n```\n\n```sh\necho \"fix: some message.\" # fails\necho \"fix: some message\" # passes\n```\n\n#### subject-exclamation-mark\n\n- **condition**: `subject` must not have a `!` before the `:` marker\n- **rule**: `never`\n\nThe [angular commit\nconvention](hhttps://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit)\ndoes not use a `!` to define a breaking change in the commit subject. If you\nwant to use this feature please consider using the [conventional commit\nconfig](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional#commitlintconfig-conventional).\n\n#### header-max-length\n\n- **condition**: `header` has `value` or less characters\n- **rule**: `always`\n- **value**\n\n```\n72\n```\n\n```sh\necho \"fix: some message that is way too long and breaks the line max-length by several characters\" # fails\necho \"fix: some message\" # passes\n```\n\n### Warnings\n\nThe following rules are considered warnings for `@commitlint/config-angular` and will print warning messages when not met.\n\n#### body-leading-blank\n\n- **condition**: Body begins with blank line\n- **rule**: `always`\n"
  },
  {
    "path": "@commitlint/config-angular/index.js",
    "content": "import typeEnum from \"@commitlint/config-angular-type-enum\";\n\nexport default {\n\tparserPreset: {\n\t\tparserOpts: { headerPattern: /^(\\w*)(?:\\((.*)\\))?!?: (.*)$/ },\n\t},\n\trules: {\n\t\t\"subject-exclamation-mark\": [2, \"never\"],\n\t\t\"body-leading-blank\": [1, \"always\"],\n\t\t\"footer-leading-blank\": [1, \"always\"],\n\t\t\"header-max-length\": [2, \"always\", 72],\n\t\t\"scope-case\": [2, \"always\", \"lower-case\"],\n\t\t\"subject-case\": [\n\t\t\t2,\n\t\t\t\"never\",\n\t\t\t[\"sentence-case\", \"start-case\", \"pascal-case\", \"upper-case\"],\n\t\t],\n\t\t\"subject-empty\": [2, \"never\"],\n\t\t\"subject-full-stop\": [2, \"never\", \".\"],\n\t\t\"type-case\": [2, \"always\", \"lower-case\"],\n\t\t\"type-empty\": [2, \"never\"],\n\t\t\"type-enum\": typeEnum.rules[\"type-enum\"],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/config-angular/index.test.js",
    "content": "import { test, expect } from \"vitest\";\nimport lint from \"@commitlint/lint\";\n\nimport config from \"./index.js\";\n\nconst { rules, parserPreset } = config;\n\nconst lintMessage = async (message) => {\n\tconst parserOpts = parserPreset.parserOpts;\n\tconst m = message.replace(/^\\s+/, \"\").trim();\n\tconst result = await lint(m, rules, { parserOpts });\n\n\tif (result.errors.length > 1) {\n\t\tthrow new Error(\n\t\t\t\"Commit test should only have one error message to validate against\",\n\t\t);\n\t}\n\n\tif (result.warnings.length > 1) {\n\t\tthrow new Error(\n\t\t\t\"Commit test should only have one warning message to validate against\",\n\t\t);\n\t}\n\n\treturn result;\n};\n\ntest(\"a valid commit message\", async () => {\n\tconst result = await lintMessage(\"test: a valid angular commit\");\n\texpect(result.valid).toBe(true);\n\texpect(result.errors).toStrictEqual([]);\n\texpect(result.warnings).toStrictEqual([]);\n});\n\ntest(\"a valid message with a scope\", async () => {\n\tconst result = await lintMessage(\n\t\t\"test(scope): a valid angular commit with a scope\",\n\t);\n\texpect(result.valid).toBe(true);\n\texpect(result.errors).toStrictEqual([]);\n\texpect(result.warnings).toStrictEqual([]);\n});\n\ntest(\"a valid multi line commit\", async () => {\n\tconst result = await lintMessage(\n\t\t`test(scope): a valid angular commit with a scope\n\n     Some content in the body`,\n\t);\n\texpect(result.valid).toBe(true);\n\texpect(result.errors).toStrictEqual([]);\n\texpect(result.warnings).toStrictEqual([]);\n});\n\ntest(\"a leading blank line after header\", async () => {\n\tconst result = await lintMessage(\n\t\t`test(scope): a valid angular commit with a scope\n     Some content in the body`,\n\t);\n\n\texpect(result.valid).toBe(true);\n\texpect(result.errors).toStrictEqual([]);\n\texpect(result.warnings[0].message).toBe(\"body must have leading blank line\");\n});\n\ntest(\"an invalid scope\", async () => {\n\tconst result = await lintMessage(`no: no is not an invalid commit type`);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors[0].message).toBe(\n\t\t\"type must be one of [build, ci, docs, feat, fix, perf, refactor, revert, style, test]\",\n\t);\n\texpect(result.warnings).toStrictEqual([]);\n});\n\ntest(\"a long header\", async () => {\n\tconst result = await lintMessage(\n\t\t`test: that its an error when there is ia realllllllllllllllllllllly long header`,\n\t);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors[0].message).toBe(\n\t\t\"header must not be longer than 72 characters, current length is 79\",\n\t);\n\texpect(result.warnings).toStrictEqual([]);\n});\n\ntest(\"message header with ! in it\", async () => {\n\tconst result = await lintMessage(`test!: with a breaking change in the type`);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors[0].message).toBe(\n\t\t\"subject must not have an exclamation mark in the subject to identify a breaking change\",\n\t);\n\texpect(result.warnings).toStrictEqual([]);\n});\n\ntest(\"message header with ! in it and a scope\", async () => {\n\tconst result = await lintMessage(\n\t\t`test(scope)!: with a breaking change in the type`,\n\t);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors[0].message).toBe(\n\t\t\"subject must not have an exclamation mark in the subject to identify a breaking change\",\n\t);\n\texpect(result.warnings).toStrictEqual([]);\n});\n"
  },
  {
    "path": "@commitlint/config-angular/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/config-angular/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-angular\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Shareable commitlint config enforcing the angular commit convention\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-import\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-angular\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"angular\"\n  ],\n  \"author\": \"Mario Nebl <hello@herebecode.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/lint\": \"^20.5.0\",\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"dependencies\": {\n    \"@commitlint/config-angular-type-enum\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-angular-type-enum/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add `main` and `types` keys in package.json ([#3953](https://github.com/conventional-changelog/commitlint/issues/3953)) ([7ddaad4](https://github.com/conventional-changelog/commitlint/commit/7ddaad4bc4e71afe89f25cc02d3e19beba1ce6cd))\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Features\n\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package @commitlint/config-angular-type-enum\n"
  },
  {
    "path": "@commitlint/config-angular-type-enum/README.md",
    "content": "# @commitlint/config-angular-type-enum\n\nShareable `commitlint` config enforcing the angular commit convention types.\nUse with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli).\n\nSee [@commitlint/config-angular](../config-angular) for full angular conventions.\n\n## Getting started\n\n```sh\nnpm install --save-dev @commitlint/config-angular-type-enum @commitlint/cli\necho \"module.exports = {extends: ['@commitlint/config-angular-type-enum']};\" > commitlint.config.js\n```\n\n## Usage\n\n```sh\necho \"foo: bar\" | commitlint # fails\necho \"build: bar\" | commitlint # passes\n```\n\n## Examples\n\n```js\n// commitlint.config.js\nconst types = require(\"@commitlint/config-angular-type-enum\");\n\n// Use as rule creating errors for non-allowed types\nmodule.exports = {\n  rules: {\n    ...types.rules,\n  },\n};\n\n// Warn for non-allowed types\nmodule.exports = {\n  rules: {\n    \"type-enum\": [1, \"always\", types.values()],\n  },\n};\n```\n"
  },
  {
    "path": "@commitlint/config-angular-type-enum/index.js",
    "content": "const types = [\n\t\"build\",\n\t\"ci\",\n\t\"docs\",\n\t\"feat\",\n\t\"fix\",\n\t\"perf\",\n\t\"refactor\",\n\t\"revert\",\n\t\"style\",\n\t\"test\",\n];\n\nexport default {\n\trules: {\n\t\t\"type-enum\": [2, \"always\", types],\n\t},\n\tvalue: () => types,\n};\n"
  },
  {
    "path": "@commitlint/config-angular-type-enum/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/config-angular-type-enum/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-angular-type-enum\",\n  \"type\": \"module\",\n  \"version\": \"20.0.0\",\n  \"description\": \"Shareable commitlint config enforcing the angular commit convention types\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-angular-type-enum\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"angular\"\n  ],\n  \"author\": \"Mario Nebl <hello@herebecode.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-conventional/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n\n### Bug Fixes\n\n* footer parser does not escape special chars for regex [#4560](https://github.com/conventional-changelog/commitlint/issues/4560) ([#4634](https://github.com/conventional-changelog/commitlint/issues/4634)) ([8ff7c7f](https://github.com/conventional-changelog/commitlint/commit/8ff7c7fcbc2db2b45910ecb5c01e9f1763060770))\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n\n### Features\n\n* upgrade conventional commit packages [#4082](https://github.com/conventional-changelog/commitlint/issues/4082) ([#4597](https://github.com/conventional-changelog/commitlint/issues/4597)) ([3aaf0a6](https://github.com/conventional-changelog/commitlint/commit/3aaf0a603c4047d268d85207957c919f45b60e1f))\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.3](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v18.6.3) (2024-03-11)\n\n\n### Bug Fixes\n\n* add missing entry `wrapper.mjs` ([#3966](https://github.com/conventional-changelog/commitlint/issues/3966)) ([c2c3c7c](https://github.com/conventional-changelog/commitlint/commit/c2c3c7cdc05c07c185cc2c2635a06835352c4504)), closes [#3958](https://github.com/conventional-changelog/commitlint/issues/3958)\n\n\n\n\n\n## [18.6.2](https://github.com/conventional-changelog/commitlint/compare/v18.6.1...v18.6.2) (2024-02-14)\n\n\n### Bug Fixes\n\n* **config-conventional:** use default export ([#3911](https://github.com/conventional-changelog/commitlint/issues/3911)) ([bc48408](https://github.com/conventional-changelog/commitlint/commit/bc4840832f9484186d3281d13ab5e0b4f9f63113))\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n\n### Features\n\n* **rules:** add header-trim rule ([#3199](https://github.com/conventional-changelog/commitlint/issues/3199)) ([#3871](https://github.com/conventional-changelog/commitlint/issues/3871)) ([331579a](https://github.com/conventional-changelog/commitlint/commit/331579a8796af901b5e5103c44fedf1cb3a2f661))\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n## [17.0.2](https://github.com/conventional-changelog/commitlint/compare/v17.0.1...v17.0.2) (2022-06-01)\n\n### Bug Fixes\n\n- update dependency conventional-changelog-conventionalcommits to v5 ([#3201](https://github.com/conventional-changelog/commitlint/issues/3201)) ([c20fd19](https://github.com/conventional-changelog/commitlint/commit/c20fd1952ed02df987165d96e4cef650c7fbaa4b))\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n### Bug Fixes\n\n- **cz-commitlint:** fix minor formatting issues ([99d8881](https://github.com/conventional-changelog/commitlint/commit/99d8881d0d951deded6d9e31bbb279d04101549b))\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n### Features\n\n- add subject-exclamation-mark rule to improve error messages ([#2593](https://github.com/conventional-changelog/commitlint/issues/2593)) ([be701bd](https://github.com/conventional-changelog/commitlint/commit/be701bdb1de4e667b7a872767244285c4fa4fda4))\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency ([#1993](https://github.com/conventional-changelog/commitlint/issues/1993)) ([32667e8](https://github.com/conventional-changelog/commitlint/commit/32667e8aa665cf94fe669ba048ad7abaf6abac6e))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency conventional-changelog-conventionalcommits to v4.3.0 ([#1816](https://github.com/conventional-changelog/commitlint/issues/1816)) ([f99aeda](https://github.com/conventional-changelog/commitlint/commit/f99aeda068aabdb250e2c9819da7229a695154b9))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- drop support for 'improvement' type ([#899](https://github.com/conventional-changelog/commitlint/issues/899)) ([b27ab08](https://github.com/conventional-changelog/commitlint/commit/b27ab08544373cfb72a4808756e2e8126ea96a97))\n\n### Features\n\n- **config-conventional:** footer/body-max-line ([#436](https://github.com/conventional-changelog/commitlint/issues/436)) ([8b394c9](https://github.com/conventional-changelog/commitlint/commit/8b394c94ffe37322d734bd4944add4a6cb2a4689))\n- **config-conventional:** increase header-max-length to 100 ([#860](https://github.com/conventional-changelog/commitlint/issues/860)) ([ff11998](https://github.com/conventional-changelog/commitlint/commit/ff11998e0cf6fcd4f03bc18ab27b1bdd6bf21906)), closes [#859](https://github.com/conventional-changelog/commitlint/issues/859)\n\n### BREAKING CHANGES\n\n- 'improvement' type will now be rejected by this config.\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n### Features\n\n- **config-conventional:** use parser with short breaking change support ([#821](https://github.com/conventional-changelog/commitlint/issues/821)) ([4b5300a](https://github.com/conventional-changelog/commitlint/commit/4b5300a))\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"5.2.3\"></a>\n\n## [5.2.3](https://github.com/conventional-changelog/commitlint/compare/v5.2.2...v5.2.3) (2017-12-05)\n\n**Note:** Version bump only for package @commitlint/config-conventional\n\n<a name=\"5.1.3\"></a>\n\n## [5.1.3](https://github.com/conventional-changelog/commitlint/compare/v5.1.2...v5.1.3) (2017-11-24)\n\n### Bug Fixes\n\n- **config-conventional:** add missing applicable attribute to type-enum ([a8db0b1](https://github.com/conventional-changelog/commitlint/commit/a8db0b1))\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n### Bug Fixes\n\n- set access for npm ([8aeaec2](https://github.com/conventional-changelog/commitlint/commit/8aeaec2))\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Bug Fixes\n\n- **config-conventional:** remove unneeded dependency ([d0e62fd](https://github.com/conventional-changelog/commitlint/commit/d0e62fd))\n\n### Features\n\n- add conventional-changelog package ([8bb0a85](https://github.com/conventional-changelog/commitlint/commit/8bb0a85))\n"
  },
  {
    "path": "@commitlint/config-conventional/README.md",
    "content": "# @commitlint/config-conventional\n\nLint your conventional commits\n\nShareable `commitlint` config enforcing [conventional commits](https://conventionalcommits.org/).\nUse with [@commitlint/cli](https://npm.im/@commitlint/cli) and [@commitlint/prompt-cli](https://npm.im/@commitlint/prompt-cli).\n\n## Getting started\n\n```sh\nnpm install --save-dev @commitlint/config-conventional @commitlint/cli\necho \"export default {extends: ['@commitlint/config-conventional']};\" > commitlint.config.js\n```\n\n## Rules\n\n### Problems\n\nThe following rules are considered problems for `@commitlint/config-conventional` and will yield a non-zero exit code when not met.\n\nConsult [Rules reference](https://commitlint.js.org/reference/rules) for a list of available rules.\n\n#### type-enum\n\n- **condition**: `type` is found in value\n- **rule**: `always`\n- **level**: `error`\n- **value**\n\n  ```\n  [\n    'build',\n    'chore',\n    'ci',\n    'docs',\n    'feat',\n    'fix',\n    'perf',\n    'refactor',\n    'revert',\n    'style',\n    'test'\n  ];\n  ```\n\n```sh\necho \"foo: some message\" # fails\necho \"fix: some message\" # passes\n```\n\n#### type-case\n\n- **description**: `type` is in case `value`\n- **rule**: `always`\n- **level**: `error`\n- **value**\n  ```\n  'lowerCase'\n  ```\n\n```sh\necho \"FIX: some message\" # fails\necho \"fix: some message\" # passes\n```\n\n#### type-empty\n\n- **condition**: `type` is empty\n- **rule**: `never`\n- **level**: `error`\n\n```sh\necho \": some message\" # fails\necho \"fix: some message\" # passes\n```\n\n#### subject-case\n\n- **condition**: `subject` is in one of the cases `['sentence-case', 'start-case', 'pascal-case', 'upper-case']`\n- **rule**: `never`\n- **level**: `error`\n\n```sh\necho \"fix(SCOPE): Some message\" # fails\necho \"fix(SCOPE): Some Message\" # fails\necho \"fix(SCOPE): SomeMessage\" # fails\necho \"fix(SCOPE): SOMEMESSAGE\" # fails\necho \"fix(scope): some message\" # passes\necho \"fix(scope): some Message\" # passes\n```\n\n#### subject-empty\n\n- **condition**: `subject` is empty\n- **rule**: `never`\n- **level**: `error`\n\n```sh\necho \"fix:\" # fails\necho \"fix: some message\" # passes\n```\n\n#### subject-full-stop\n\n- **condition**: `subject` ends with `value`\n- **rule**: `never`\n- **level**: `error`\n- **value**\n\n```\n'.'\n```\n\n```sh\necho \"fix: some message.\" # fails\necho \"fix: some message\" # passes\n```\n\n#### header-max-length\n\n- **condition**: `header` has `value` or less characters\n- **rule**: `always`\n- **level**: `error`\n- **value**\n\n```\n100\n```\n\n```sh\necho \"fix: some message that is way too long and breaks the line max-length by several characters\" # fails\necho \"fix: some message\" # passes\n```\n\n#### footer-leading-blank\n\n- **condition**: `footer` should have a leading blank line\n- **rule**: `always`\n- **level**: `warning`\n\n```sh\necho \"fix: some message\nBREAKING CHANGE: It will be significant\" # warning\n\necho \"fix: some message\n\nBREAKING CHANGE: It will be significant\" # passes\n```\n\n#### footer-max-line-length\n\n- **condition**: `footer` each line has `value` or less characters\n- **rule**: `always`\n- **level**: `error`\n- **value**\n\n```\n100\n```\n\n```sh\necho \"fix: some message\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\" # fails\n\necho \"fix: some message\n\nBREAKING CHANGE: footer with multiple lines\nbut still no line is too long\" # passes\n```\n\n#### body-leading-blank\n\n- **condition**: `body` should have a leading blank line\n- **rule**: `always`\n- **level**: `warning`\n\n```sh\necho \"fix: some message\nbody\" # warning\n\necho \"fix: some message\n\nbody\" # passes\n```\n\n#### body-max-line-length\n\n- **condition**: `body` each line has `value` or less characters\n- **rule**: `always`\n- **level**: `error`\n- **value**\n\n```\n100\n```\n\n```sh\necho \"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\" # fails\n\necho \"fix: some message\n\nbody with multiple lines\nbut still no line is too long\" # passes\n```\n"
  },
  {
    "path": "@commitlint/config-conventional/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/config-conventional/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-conventional\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Shareable commitlint config enforcing conventional commits\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-conventional\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"angular\"\n  ],\n  \"author\": \"Mario Nebl <hello@herebecode.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/lint\": \"^20.5.0\",\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"dependencies\": {\n    \"@commitlint/types\": \"^20.5.0\",\n    \"conventional-changelog-conventionalcommits\": \"^9.2.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-conventional/src/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport lint from \"@commitlint/lint\";\n\nimport config from \"./index.js\";\n\nconst { rules, parserPreset } = config;\n\nconst dynamicImport = async (id: string) => {\n\tconst imported = await import(\n\t\tpath.isAbsolute(id) ? pathToFileURL(id).toString() : id\n\t);\n\treturn (\"default\" in imported && imported.default) || imported;\n};\n\nconst commitLint = async (message: string) => {\n\tconst preset = await (await dynamicImport(parserPreset))();\n\treturn lint(message, rules, {\n\t\tparserOpts: preset.parser || preset.parserOpts,\n\t});\n};\n\nconst messages = {\n\tinvalidTypeEnum: \"foo: some message\",\n\tinvalidTypeCase: \"FIX: some message\",\n\tinvalidTypeEmpty: \": some message\",\n\tinvalidSubjectCases: [\n\t\t\"fix(scope): Some message\",\n\t\t\"fix(scope): Some Message\",\n\t\t\"fix(scope): SomeMessage\",\n\t\t\"fix(scope): SOMEMESSAGE\",\n\t],\n\tinvalidSubjectEmpty: \"fix:\",\n\tinvalidSubjectFullStop: \"fix: some message.\",\n\tinvalidHeaderMaxLength:\n\t\t\"fix: some message that is way too long and breaks the line max-length by several characters since the max is 100\",\n\twarningFooterLeadingBlank:\n\t\t\"fix: some message\\n\\nbody\\nBREAKING CHANGE: It will be significant\",\n\tinvalidFooterMaxLineLength:\n\t\t'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',\n\twarningBodyLeadingBlank: \"fix: some message\\nbody\",\n\tinvalidBodyMaxLineLength:\n\t\t'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',\n\tvalidMessages: [\n\t\t\"fix: some message\",\n\t\t\"fix(scope): some message\",\n\t\t\"fix(scope): some Message\",\n\t\t\"fix(scope): some message\\n\\nBREAKING CHANGE: it will be significant!\",\n\t\t\"fix(scope): some message\\n\\nbody\",\n\t\t\"fix(scope)!: some message\\n\\nbody\",\n\t],\n};\n\nconst errors = {\n\ttypeEnum: {\n\t\tlevel: 2,\n\t\tmessage:\n\t\t\t\"type must be one of [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test]\",\n\t\tname: \"type-enum\",\n\t\tvalid: false,\n\t},\n\ttypeCase: {\n\t\tlevel: 2,\n\t\tmessage: \"type must be lower-case\",\n\t\tname: \"type-case\",\n\t\tvalid: false,\n\t},\n\ttypeEmpty: {\n\t\tlevel: 2,\n\t\tmessage: \"type may not be empty\",\n\t\tname: \"type-empty\",\n\t\tvalid: false,\n\t},\n\tsubjectCase: {\n\t\tlevel: 2,\n\t\tmessage:\n\t\t\t\"subject must not be sentence-case, start-case, pascal-case, upper-case\",\n\t\tname: \"subject-case\",\n\t\tvalid: false,\n\t},\n\tsubjectEmpty: {\n\t\tlevel: 2,\n\t\tmessage: \"subject may not be empty\",\n\t\tname: \"subject-empty\",\n\t\tvalid: false,\n\t},\n\tsubjectFullStop: {\n\t\tlevel: 2,\n\t\tmessage: \"subject may not end with full stop\",\n\t\tname: \"subject-full-stop\",\n\t\tvalid: false,\n\t},\n\theaderMaxLength: {\n\t\tlevel: 2,\n\t\tmessage:\n\t\t\t\"header must not be longer than 100 characters, current length is 112\",\n\t\tname: \"header-max-length\",\n\t\tvalid: false,\n\t},\n\tfooterMaxLineLength: {\n\t\tlevel: 2,\n\t\tmessage: \"footer's lines must not be longer than 100 characters\",\n\t\tname: \"footer-max-line-length\",\n\t\tvalid: false,\n\t},\n\tbodyMaxLineLength: {\n\t\tlevel: 2,\n\t\tmessage: \"body's lines must not be longer than 100 characters\",\n\t\tname: \"body-max-line-length\",\n\t\tvalid: false,\n\t},\n};\n\nconst warnings = {\n\tfooterLeadingBlank: {\n\t\tlevel: 1,\n\t\tmessage: \"footer must have leading blank line\",\n\t\tname: \"footer-leading-blank\",\n\t\tvalid: false,\n\t},\n\tbodyLeadingBlank: {\n\t\tlevel: 1,\n\t\tmessage: \"body must have leading blank line\",\n\t\tname: \"body-leading-blank\",\n\t\tvalid: false,\n\t},\n};\n\ntest(\"type-enum\", async () => {\n\tconst result = await commitLint(messages.invalidTypeEnum);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors).toEqual([errors.typeEnum]);\n});\n\ntest(\"type-case\", async () => {\n\tconst result = await commitLint(messages.invalidTypeCase);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors).toEqual([errors.typeCase, errors.typeEnum]);\n});\n\ntest(\"type-empty\", async () => {\n\tconst result = await commitLint(messages.invalidTypeEmpty);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors).toEqual([errors.typeEmpty]);\n});\n\ntest(\"subject-case\", async () => {\n\tconst invalidInputs = await Promise.all(\n\t\tmessages.invalidSubjectCases.map((invalidInput) =>\n\t\t\tcommitLint(invalidInput),\n\t\t),\n\t);\n\n\tinvalidInputs.forEach((result) => {\n\t\texpect(result.valid).toBe(false);\n\t\texpect(result.errors).toEqual([errors.subjectCase]);\n\t});\n});\n\ntest(\"subject-empty\", async () => {\n\tconst result = await commitLint(messages.invalidSubjectEmpty);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors).toEqual([errors.subjectEmpty, errors.typeEmpty]);\n});\n\ntest(\"subject-full-stop\", async () => {\n\tconst result = await commitLint(messages.invalidSubjectFullStop);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors).toEqual([errors.subjectFullStop]);\n});\n\ntest(\"header-max-length\", async () => {\n\tconst result = await commitLint(messages.invalidHeaderMaxLength);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors).toEqual([errors.headerMaxLength]);\n});\n\ntest(\"footer-leading-blank\", async () => {\n\tconst result = await commitLint(messages.warningFooterLeadingBlank);\n\n\texpect(result.valid).toBe(true);\n\texpect(result.warnings).toEqual([warnings.footerLeadingBlank]);\n});\n\ntest(\"footer-max-line-length\", async () => {\n\tconst result = await commitLint(messages.invalidFooterMaxLineLength);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors).toEqual([errors.footerMaxLineLength]);\n});\n\ntest(\"body-leading-blank\", async () => {\n\tconst result = await commitLint(messages.warningBodyLeadingBlank);\n\n\texpect(result.valid).toBe(true);\n\texpect(result.warnings).toEqual([warnings.bodyLeadingBlank]);\n});\n\ntest(\"body-max-line-length\", async () => {\n\tconst result = await commitLint(messages.invalidBodyMaxLineLength);\n\n\texpect(result.valid).toBe(false);\n\texpect(result.errors).toEqual([errors.bodyMaxLineLength]);\n});\n\ntest(\"valid messages\", async () => {\n\tconst validInputs = await Promise.all(\n\t\tmessages.validMessages.map((input) => commitLint(input)),\n\t);\n\n\tvalidInputs.forEach((result) => {\n\t\texpect(result.valid).toBe(true);\n\t\texpect(result.errors).toEqual([]);\n\t\texpect(result.warnings).toEqual([]);\n\t});\n});\n"
  },
  {
    "path": "@commitlint/config-conventional/src/index.ts",
    "content": "import {\n\tRuleConfigCondition,\n\tRuleConfigSeverity,\n\tTargetCaseType,\n} from \"@commitlint/types\";\n\nexport default {\n\tparserPreset: \"conventional-changelog-conventionalcommits\",\n\trules: {\n\t\t\"body-leading-blank\": [RuleConfigSeverity.Warning, \"always\"] as const,\n\t\t\"body-max-line-length\": [RuleConfigSeverity.Error, \"always\", 100] as const,\n\t\t\"footer-leading-blank\": [RuleConfigSeverity.Warning, \"always\"] as const,\n\t\t\"footer-max-line-length\": [\n\t\t\tRuleConfigSeverity.Error,\n\t\t\t\"always\",\n\t\t\t100,\n\t\t] as const,\n\t\t\"header-max-length\": [RuleConfigSeverity.Error, \"always\", 100] as const,\n\t\t\"header-trim\": [RuleConfigSeverity.Error, \"always\"] as const,\n\t\t\"subject-case\": [\n\t\t\tRuleConfigSeverity.Error,\n\t\t\t\"never\",\n\t\t\t[\"sentence-case\", \"start-case\", \"pascal-case\", \"upper-case\"],\n\t\t] as [RuleConfigSeverity, RuleConfigCondition, TargetCaseType[]],\n\t\t\"subject-empty\": [RuleConfigSeverity.Error, \"never\"] as const,\n\t\t\"subject-full-stop\": [RuleConfigSeverity.Error, \"never\", \".\"] as const,\n\t\t\"type-case\": [RuleConfigSeverity.Error, \"always\", \"lower-case\"] as const,\n\t\t\"type-empty\": [RuleConfigSeverity.Error, \"never\"] as const,\n\t\t\"type-enum\": [\n\t\t\tRuleConfigSeverity.Error,\n\t\t\t\"always\",\n\t\t\t[\n\t\t\t\t\"build\",\n\t\t\t\t\"chore\",\n\t\t\t\t\"ci\",\n\t\t\t\t\"docs\",\n\t\t\t\t\"feat\",\n\t\t\t\t\"fix\",\n\t\t\t\t\"perf\",\n\t\t\t\t\"refactor\",\n\t\t\t\t\"revert\",\n\t\t\t\t\"style\",\n\t\t\t\t\"test\",\n\t\t\t],\n\t\t] as [RuleConfigSeverity, RuleConfigCondition, string[]],\n\t},\n\tprompt: {\n\t\tquestions: {\n\t\t\ttype: {\n\t\t\t\tdescription: \"Select the type of change that you're committing\",\n\t\t\t\tenum: {\n\t\t\t\t\tfeat: {\n\t\t\t\t\t\tdescription: \"A new feature\",\n\t\t\t\t\t\ttitle: \"Features\",\n\t\t\t\t\t\temoji: \"✨\",\n\t\t\t\t\t},\n\t\t\t\t\tfix: {\n\t\t\t\t\t\tdescription: \"A bug fix\",\n\t\t\t\t\t\ttitle: \"Bug Fixes\",\n\t\t\t\t\t\temoji: \"🐛\",\n\t\t\t\t\t},\n\t\t\t\t\tdocs: {\n\t\t\t\t\t\tdescription: \"Documentation only changes\",\n\t\t\t\t\t\ttitle: \"Documentation\",\n\t\t\t\t\t\temoji: \"📚\",\n\t\t\t\t\t},\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)\",\n\t\t\t\t\t\ttitle: \"Styles\",\n\t\t\t\t\t\temoji: \"💎\",\n\t\t\t\t\t},\n\t\t\t\t\trefactor: {\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"A code change that neither fixes a bug nor adds a feature\",\n\t\t\t\t\t\ttitle: \"Code Refactoring\",\n\t\t\t\t\t\temoji: \"📦\",\n\t\t\t\t\t},\n\t\t\t\t\tperf: {\n\t\t\t\t\t\tdescription: \"A code change that improves performance\",\n\t\t\t\t\t\ttitle: \"Performance Improvements\",\n\t\t\t\t\t\temoji: \"🚀\",\n\t\t\t\t\t},\n\t\t\t\t\ttest: {\n\t\t\t\t\t\tdescription: \"Adding missing tests or correcting existing tests\",\n\t\t\t\t\t\ttitle: \"Tests\",\n\t\t\t\t\t\temoji: \"🚨\",\n\t\t\t\t\t},\n\t\t\t\t\tbuild: {\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)\",\n\t\t\t\t\t\ttitle: \"Builds\",\n\t\t\t\t\t\temoji: \"🛠\",\n\t\t\t\t\t},\n\t\t\t\t\tci: {\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)\",\n\t\t\t\t\t\ttitle: \"Continuous Integrations\",\n\t\t\t\t\t\temoji: \"⚙️\",\n\t\t\t\t\t},\n\t\t\t\t\tchore: {\n\t\t\t\t\t\tdescription: \"Other changes that don't modify src or test files\",\n\t\t\t\t\t\ttitle: \"Chores\",\n\t\t\t\t\t\temoji: \"♻️\",\n\t\t\t\t\t},\n\t\t\t\t\trevert: {\n\t\t\t\t\t\tdescription: \"Reverts a previous commit\",\n\t\t\t\t\t\ttitle: \"Reverts\",\n\t\t\t\t\t\temoji: \"🗑\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tscope: {\n\t\t\t\tdescription:\n\t\t\t\t\t\"What is the scope of this change (e.g. component or file name)\",\n\t\t\t},\n\t\t\tsubject: {\n\t\t\t\tdescription:\n\t\t\t\t\t\"Write a short, imperative tense description of the change\",\n\t\t\t},\n\t\t\tbody: {\n\t\t\t\tdescription: \"Provide a longer description of the change\",\n\t\t\t},\n\t\t\tisBreaking: {\n\t\t\t\tdescription: \"Are there any breaking changes?\",\n\t\t\t},\n\t\t\tbreakingBody: {\n\t\t\t\tdescription:\n\t\t\t\t\t\"A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself\",\n\t\t\t},\n\t\t\tbreaking: {\n\t\t\t\tdescription: \"Describe the breaking changes\",\n\t\t\t},\n\t\t\tisIssueAffected: {\n\t\t\t\tdescription: \"Does this change affect any open issues?\",\n\t\t\t},\n\t\t\tissuesBody: {\n\t\t\t\tdescription:\n\t\t\t\t\t\"If issues are closed, the commit requires a body. Please enter a longer description of the commit itself\",\n\t\t\t},\n\t\t\tissues: {\n\t\t\t\tdescription: 'Add issue references (e.g. \"fix #123\", \"re #123\".)',\n\t\t\t},\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "@commitlint/config-conventional/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Bug Fixes\n\n* **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))\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04)\n\n\n### Features\n\n* support lerna 7 and 8 ([#4221](https://github.com/conventional-changelog/commitlint/issues/4221)) ([3b8da63](https://github.com/conventional-changelog/commitlint/commit/3b8da63f50f868555a3f026a76e96cd8d20638de))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n\n### Bug Fixes\n\n* update dependency semver to v7.6.0 ([#3900](https://github.com/conventional-changelog/commitlint/issues/3900)) ([df33003](https://github.com/conventional-changelog/commitlint/commit/df33003dce77bc5ff48678cddf9401dffedaeb57))\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n\n### Bug Fixes\n\n* **config-lerna-scopes:** add missing dependency ([#3607](https://github.com/conventional-changelog/commitlint/issues/3607)) ([2fff094](https://github.com/conventional-changelog/commitlint/commit/2fff0943899161b2159a4acddc9237c6ab60c7a5))\n* update dependency semver to v7.5.0 ([#3604](https://github.com/conventional-changelog/commitlint/issues/3604)) ([01e35e0](https://github.com/conventional-changelog/commitlint/commit/01e35e06cf9123a0c367e0d0ac79988ec4334e6a))\n\n\n\n\n\n## [17.6.2](https://github.com/conventional-changelog/commitlint/compare/v17.6.1...v17.6.2) (2023-05-03)\n\n\n### Bug Fixes\n\n* lerna package.json resolution ([#3600](https://github.com/conventional-changelog/commitlint/issues/3600)) ([6c5cd53](https://github.com/conventional-changelog/commitlint/commit/6c5cd535679ac9448a127a57e309276e699cebb9))\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n### Bug Fixes\n\n- update dependency semver to v7.3.8 ([#3441](https://github.com/conventional-changelog/commitlint/issues/3441)) ([7599ad6](https://github.com/conventional-changelog/commitlint/commit/7599ad6ab622ecbb6efa9ddba7acc3bbf66db5b5))\n\n## [17.2.1](https://github.com/conventional-changelog/commitlint/compare/v17.2.0...v17.2.1) (2022-11-01)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n## [17.0.2](https://github.com/conventional-changelog/commitlint/compare/v17.0.1...v17.0.2) (2022-06-01)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n### Bug Fixes\n\n- update dependency semver to v7.3.6 ([#3112](https://github.com/conventional-changelog/commitlint/issues/3112)) ([ad886fd](https://github.com/conventional-changelog/commitlint/commit/ad886fd7ea46bc2df346099f9d4f10defd51fe75))\n- update dependency semver to v7.3.7 ([#3119](https://github.com/conventional-changelog/commitlint/issues/3119)) ([c9c49b2](https://github.com/conventional-changelog/commitlint/commit/c9c49b2de935528d84a817de750cd65b8f765c48))\n\n## [16.2.2](https://github.com/conventional-changelog/commitlint/compare/v16.2.1...v16.2.2) (2022-02-14)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n### Tests\n\n- **config-lerna-scopes:** reuse npm bootstrap to simplify tests ([#2479](https://github.com/conventional-changelog/commitlint/issues/2479)) ([9a7a43a](https://github.com/conventional-changelog/commitlint/commit/9a7a43aa8a7eca18f2fe05c78d27dcb1a128930c)), closes [#2447](https://github.com/conventional-changelog/commitlint/issues/2447)\n\n### BREAKING CHANGES\n\n- **config-lerna-scopes:** upgrade to lerna v4\n\nCo-authored-by: Renovate Bot <bot@renovateapp.com>\nCo-authored-by: escapedcat <github@htmlcss.de>\n\n- test(config-lerna-scopes): reuse npm bootstrap to simplify tests\n\n- test(config-lerna-scopes): reuse npm bootstrap to simplify tests\n\n- test: fix issue after merge\n\n- test: one more fix after merge\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>\nCo-authored-by: Renovate Bot <bot@renovateapp.com>\nCo-authored-by: escapedcat <github@htmlcss.de>\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n### Bug Fixes\n\n- update dependency import-from to v4 ([#2629](https://github.com/conventional-changelog/commitlint/issues/2629)) ([5bcb604](https://github.com/conventional-changelog/commitlint/commit/5bcb60456cd9d4c8f0f0bae21ca7c3d1c73943ca))\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n### Bug Fixes\n\n- **config-lerna-scopes:** ignore packages without names ([#2514](https://github.com/conventional-changelog/commitlint/issues/2514)) ([df3bf71](https://github.com/conventional-changelog/commitlint/commit/df3bf71ab36a085ef35a1491025c0d2e2b92ff77))\n- update dependency semver to v7.3.5 ([#2519](https://github.com/conventional-changelog/commitlint/issues/2519)) ([5113f22](https://github.com/conventional-changelog/commitlint/commit/5113f22c620e7b187fd558e5befa541b448ea18b))\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n### Features\n\n- **config-lerna-scopes:** keep supporting lerna v3 ([51b0f4a](https://github.com/conventional-changelog/commitlint/commit/51b0f4a56f111c61419247755b1404b4e20d3a09))\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- update dependency semver to v7.3.4 ([#2336](https://github.com/conventional-changelog/commitlint/issues/2336)) ([790b61a](https://github.com/conventional-changelog/commitlint/commit/790b61afa668d0eab80bbe49db58d3d5d29bb16e))\n\n### Features\n\n- **config-lerna-scopes:** support yarn workspaces ([#2149](https://github.com/conventional-changelog/commitlint/issues/2149)) ([b244246](https://github.com/conventional-changelog/commitlint/commit/b2442469afe3b11c20b0101be7656ced43fab366))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n- refactor!: drop support for lerna v2 ([59667b3](https://github.com/conventional-changelog/commitlint/commit/59667b376118323b1312d3d1084b9178918f3d23))\n\n### BREAKING CHANGES\n\n- remove lerna v2 support and tests\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency semver to v7.3.2 ([#1369](https://github.com/conventional-changelog/commitlint/issues/1369)) ([3c09722](https://github.com/conventional-changelog/commitlint/commit/3c09722d2db85a94cd1f4bf25c6b4251b2c41bbb))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- **config-lerna-scopes:** correct lerna in peerDependencies ([#980](https://github.com/conventional-changelog/commitlint/issues/980)) ([f88f00d](https://github.com/conventional-changelog/commitlint/commit/f88f00d5d3d0a247b5635b50248bbb942b1ec962))\n- update dependency semver to v7.1.3 ([#995](https://github.com/conventional-changelog/commitlint/issues/995)) ([4ee307a](https://github.com/conventional-changelog/commitlint/commit/4ee307a1f8c861ae5d8a038560d166c5d00ea8ba))\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n## [7.5.1](https://github.com/conventional-changelog/commitlint/compare/v7.5.0...v7.5.1) (2019-02-09)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"5.2.6\"></a>\n\n## [5.2.6](https://github.com/conventional-changelog/commitlint/compare/v5.2.5...v5.2.6) (2017-12-21)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"5.2.0\"></a>\n\n# [5.2.0](https://github.com/conventional-changelog/commitlint/compare/v5.1.3...v5.2.0) (2017-11-30)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Features\n\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package @commitlint/config-lerna-scopes\n\n<a name=\"4.1.1\"></a>\n\n## [4.1.1](https://github.com/conventional-changelog/commitlint/compare/v4.1.0...v4.1.1) (2017-10-09)\n\n### Bug Fixes\n\n- **config-lerna-scopes:** fix package list get with recent lerna versions ([8f35dae](https://github.com/conventional-changelog/commitlint/commit/8f35dae))\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- **config-lerna-scopes:** support non-standard lerna repos ([71fc40e](https://github.com/conventional-changelog/commitlint/commit/71fc40e))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- **config-lerna-scopes:** support non-standard lerna repos ([71fc40e](https://github.com/conventional-changelog/commitlint/commit/71fc40e))\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- **config-lerna-scopes:** support non-standard lerna repos ([71fc40e](https://github.com/conventional-changelog/commitlint/commit/71fc40e))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n### Features\n\n- **config-lerna-scopes:** support non-standard lerna repos ([71fc40e](https://github.com/conventional-changelog/commitlint/commit/71fc40e))\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Features\n\n- **config-lerna-scopes:** support non-standard lerna repos ([903df4b](https://github.com/conventional-changelog/commitlint/commit/903df4b))\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/basic/lerna.json",
    "content": "{\n  \"version\": \"1.0.0\",\n  \"packages\": [\"packages/*\"]\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/basic/package.json",
    "content": "{\n  \"name\": \"basic\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/basic/packages/a/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/basic-a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/basic/packages/b/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/basic-b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/empty/lerna.json",
    "content": "{\n  \"version\": \"1.0.0\",\n  \"packages\": [\"packages/*\"]\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/empty/package.json",
    "content": "{\n  \"name\": \"empty\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/modules/lerna.json",
    "content": "{\n  \"version\": \"1.0.0\",\n  \"packages\": [\"packages/*\"]\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/modules/package.json",
    "content": "{\n  \"name\": \"basic\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/modules/packages/a/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/modules-a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/modules/packages/module/package.json",
    "content": "{\n  \"type\": \"module\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/nested/lerna.json",
    "content": "{\n  \"version\": \"1.0.0\",\n  \"packages\": [\"packages/**\"]\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/nested/package.json",
    "content": "{\n  \"name\": \"nested-workspaces\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/nested/packages/a/nested-a/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/nested-a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/nested/packages/b/nested-b/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/nested-b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/nested/packages/c/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/nested-c\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/no-packages-declaration/lerna.json",
    "content": "{\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/no-packages-declaration/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/no-packages-declaration\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/scoped/@packages/a/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/scoped-a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/scoped/@packages/b/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/scoped-b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/scoped/lerna.json",
    "content": "{\n  \"version\": \"1.0.0\",\n  \"packages\": [\"@packages/**\"]\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/scoped/package.json",
    "content": "{\n  \"name\": \"scoped\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/lerna.json",
    "content": "{\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/package.json",
    "content": "{\n  \"name\": \"@commitlint-lerna-scopes/transition-to-workspace-scopes\",\n  \"version\": \"1.0.0\",\n  \"workspaces\": [\"./packages/*\"]\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/fixtures/transition-to-workspace-scopes/packages/workspace-package/package.json",
    "content": "{\n    \"name\": \"@commitlint-lerna-scopes/workspace-package\",\n    \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/index.js",
    "content": "import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport fg from \"fast-glob\";\nimport configWorkspaceScopes from \"@commitlint/config-workspace-scopes\";\n\nexport default {\n\tutils: { getProjects },\n\trules: {\n\t\t\"scope-enum\": (ctx) =>\n\t\t\tgetProjects(ctx).then((packages) => [2, \"always\", packages]),\n\t},\n};\n\n/**\n * Turn glob paths with potential 'package.json' ending always into paths\n * with a package.json ending to find monorepo packages\n * @param {string[]} patterns\n * @returns A list of glob paths to resolve package.json files\n */\nfunction normalizePatterns(patterns) {\n\tconst normalizedPatterns = [];\n\tfor (const pattern of patterns) {\n\t\tnormalizedPatterns.push(pattern.replace(/\\/?$/, \"/package.json\"));\n\t}\n\treturn normalizedPatterns;\n}\n\n/**\n * Find all package.json contents in the defined cwd\n * @param {string} cwd\n * @returns A list of parsed package.json files as objects\n */\nasync function findPackages(cwd) {\n\tconst json = await fs.readFile(path.join(cwd, \"lerna.json\"), {\n\t\tencoding: \"utf-8\",\n\t});\n\n\tconst packages = JSON.parse(json)?.packages || [];\n\tif (packages.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst patterns = normalizePatterns(packages);\n\tconst entries = await fg(patterns, {\n\t\tcwd,\n\t\tignore: [\"**/node_modules/**\", \"**/bower_components/**\"],\n\t});\n\n\tconst pkgJsons = await Promise.all(\n\t\tArray.from(new Set(entries.map((entry) => path.join(cwd, entry)))).map(\n\t\t\t(pkgPath) => fs.readFile(pkgPath, { encoding: \"utf-8\" }),\n\t\t),\n\t);\n\n\treturn pkgJsons.map((pkgJson) => JSON.parse(pkgJson) || {});\n}\n\nasync function getProjects(context) {\n\tconst ctx = context || {};\n\tconst cwd = ctx.cwd || process.cwd();\n\n\t// try to read workspaces for backwards compatibility\n\tconst workspacePackages = await configWorkspaceScopes.utils.getPackages({\n\t\tcwd,\n\t});\n\t// native npm/yarn workspaces detected, inform user to use new package instead\n\tif (workspacePackages.length > 0) {\n\t\tconsole.warn(\n\t\t\t[\n\t\t\t\t`It seems that you are using npm/yarn workspaces instead of lernas \"packages\" declaration.`,\n\t\t\t\t`Support for workspaces will be removed in a future major version of this package.`,\n\t\t\t\t`Please make sure to transition to \"@commitlint/config-workspace-scopes\" in the near future.`,\n\t\t\t].join(\"\\n\"),\n\t\t);\n\t\treturn workspacePackages;\n\t}\n\n\tconst packages = await findPackages(cwd);\n\n\treturn packages\n\t\t.reduce((pkgNames, pkg) => {\n\t\t\tconst name = pkg.name;\n\t\t\tif (name) {\n\t\t\t\tpkgNames.push(name.charAt(0) === \"@\" ? name.split(\"/\")[1] : name);\n\t\t\t}\n\t\t\treturn pkgNames;\n\t\t}, [])\n\t\t.sort();\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/index.test.js",
    "content": "import { test, expect, vi } from \"vitest\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nimport { npm } from \"@commitlint/test\";\n\nimport config from \"./index.js\";\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\ntest(\"exports rules key\", () => {\n\texpect(config).toHaveProperty(\"rules\");\n});\n\ntest(\"rules hold object\", () => {\n\texpect(config).toMatchObject({\n\t\trules: expect.any(Object),\n\t});\n});\n\ntest(\"rules contain scope-enum\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.anything(),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum is function\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.any(Function),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum does not throw for missing context\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tawait expect(fn()).resolves.toBeTruthy();\n});\n\ntest(\"scope-enum has expected severity\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [severity] = await fn();\n\texpect(severity).toBe(2);\n});\n\ntest(\"scope-enum has expected modifier\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [, modifier] = await fn();\n\texpect(modifier).toBe(\"always\");\n});\n\ntest(\"returns empty value for empty lerna repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/empty\", __dirname);\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([]);\n});\n\ntest(\"returns all packages for nested lerna packages repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/nested\", __dirname);\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"nested-a\", \"nested-b\", \"nested-c\"]);\n});\n\ntest(\"returns expected value for basic lerna repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/basic\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"basic-a\", \"basic-b\"]);\n});\n\ntest(\"returns expected value for lerna repository containing modules\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/modules\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"modules-a\"]);\n});\n\ntest(\"returns expected value for scoped lerna repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/scoped\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"scoped-a\", \"scoped-b\"]);\n});\n\ntest(\"work with no declared packages\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\n\t\t\"fixtures/no-packages-declaration\",\n\t\t__dirname,\n\t);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([]);\n});\n\ntest(\"inform the user about the transition to config-workspace-scopes if the project is using native workspaces\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\n\t\t\"fixtures/transition-to-workspace-scopes\",\n\t\t__dirname,\n\t);\n\n\tconst consoleWarnSpy = vi.spyOn(console, \"warn\");\n\n\tconst [, , value] = await fn({ cwd });\n\n\texpect(consoleWarnSpy).toHaveBeenCalledWith(\n\t\texpect.stringContaining(`It seems that you are using npm/yarn workspaces`),\n\t);\n\n\texpect(value).toEqual([\"workspace-package\"]);\n});\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-lerna-scopes\",\n  \"type\": \"module\",\n  \"version\": \"20.4.3\",\n  \"description\": \"Shareable commitlint config enforcing lerna package and workspace names as scopes\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-lerna-scopes\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"lerna\"\n  ],\n  \"author\": \"Jan Biasi (https://github.com/janbiasi)\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"peerDependencies\": {\n    \"lerna\": \"*\"\n  },\n  \"peerDependenciesMeta\": {\n    \"lerna\": {\n      \"optional\": true\n    }\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"@commitlint/config-workspace-scopes\": \"^20.4.3\",\n    \"fast-glob\": \"^3.3.3\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-lerna-scopes/readme.md",
    "content": "# @commitlint/config-lerna-scopes\n\nLint your lerna project commits\n\nShareable `commitlint` config enforcing lerna package scopes.\nUse with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli).\n\n> [!IMPORTANT]  \n> 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.\n\n## Getting started\n\n```sh\nnpm install --save-dev @commitlint/config-lerna-scopes @commitlint/cli\necho \"export default {extends: ['@commitlint/config-lerna-scopes']};\" > commitlint.config.js\n```\n\n## Examples\n\n```text\n❯ cat commitlint.config.js\n{\n  extends: ['@commitlint/config-lerna-scopes']\n}\n\n❯ tree packages\n\npackages\n├── api\n├── app\n└── web\n\n❯ echo \"build(api): change something in api's build\" | commitlint\n⧗   input: build(api): change something in api's build\n✔   found 0 problems, 0 warnings\n\n❯ echo \"test(foo): this won't pass\" | commitlint\n⧗   input: test(foo): this won't pass\n✖   scope must be one of [api, app, web] [scope-enum]\n✖   found 1 problems, 0 warnings\n\n❯ echo \"ci: do some general maintenance\" | commitlint\n⧗   input: ci: do some general maintenance\n✔   found 0 problems, 0 warnings\n```\n\nConsult [Rules reference](https://commitlint.js.org/reference/rules) for a list of available rules.\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n\n### Bug Fixes\n\n* **config-nx-scopes:** add unique names to fixture projects ([#4622](https://github.com/conventional-changelog/commitlint/issues/4622)) ([5635cf0](https://github.com/conventional-changelog/commitlint/commit/5635cf0ab885005aa56f2917b9db5e9c2259722d))\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n\n### Bug Fixes\n\n* **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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [19.3.1](https://github.com/conventional-changelog/commitlint/compare/v19.3.0...v19.3.1) (2024-05-13)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [19.2.1](https://github.com/conventional-changelog/commitlint/compare/v19.2.0...v19.2.1) (2024-03-19)\n\n\n### Bug Fixes\n\n* **config-nx-scopes:** include file extension in nx imports ([#3979](https://github.com/conventional-changelog/commitlint/issues/3979)) ([583250b](https://github.com/conventional-changelog/commitlint/commit/583250b919cf1eb338de3e3f5c848fff611a6212))\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add `main` and `types` keys in package.json ([#3953](https://github.com/conventional-changelog/commitlint/issues/3953)) ([7ddaad4](https://github.com/conventional-changelog/commitlint/commit/7ddaad4bc4e71afe89f25cc02d3e19beba1ce6cd))\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [18.5.1](https://github.com/conventional-changelog/commitlint/compare/v18.5.0...v18.5.1) (2024-01-22)\n\n\n### Bug Fixes\n\n* **config-nx-scopes:** replace import with require ([#3865](https://github.com/conventional-changelog/commitlint/issues/3865)) ([#3867](https://github.com/conventional-changelog/commitlint/issues/3867)) ([3ede3e0](https://github.com/conventional-changelog/commitlint/commit/3ede3e0e9d5af1302fff896aba049b487b90c0bf))\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n\n### Bug Fixes\n\n* **config-nx-scopes:** restore compatibility with nx 17.2.0 and higher ([#3855](https://github.com/conventional-changelog/commitlint/issues/3855)) ([1e08a17](https://github.com/conventional-changelog/commitlint/commit/1e08a17eb354b40776be814e8d787eee44d5df2c)), closes [#3820](https://github.com/conventional-changelog/commitlint/issues/3820)\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n# [18.3.0](https://github.com/conventional-changelog/commitlint/compare/v18.2.0...v18.3.0) (2023-10-26)\n\n\n### Features\n\n* **config-nx-scopes:** support latest nx version ([#3728](https://github.com/conventional-changelog/commitlint/issues/3728)) ([22e6f74](https://github.com/conventional-changelog/commitlint/commit/22e6f74e3cae74497162c8ae8f5d3888e3b19f6e))\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [17.6.4](https://github.com/conventional-changelog/commitlint/compare/v17.6.3...v17.6.4) (2023-05-07)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n### Features\n\n- **config-nx-scopes:** add nx version ^15.0.0 as peerDependency ([#3416](https://github.com/conventional-changelog/commitlint/issues/3416)) ([f529a3f](https://github.com/conventional-changelog/commitlint/commit/f529a3f58e03d633bbd3949d397a38d9c993579b))\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n### Features\n\n- add ability to filter Nx projects in @commitlint/config-nx-scopes ([#3155](https://github.com/conventional-changelog/commitlint/issues/3155)) ([e595693](https://github.com/conventional-changelog/commitlint/commit/e595693eb9be51a874cff01580b883982083ba0e)), closes [#3152](https://github.com/conventional-changelog/commitlint/issues/3152)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/config-nx-scopes\n\n# [16.2.0](https://github.com/conventional-changelog/commitlint/compare/v16.1.0...v16.2.0) (2022-01-25)\n\n### Features\n\n- add support for Nx monorepos via @commitlint/config-nx-scopes ([#2995](https://github.com/conventional-changelog/commitlint/issues/2995)) ([11879ad](https://github.com/conventional-changelog/commitlint/commit/11879adacbef3c939311b1ff597a7b894fcca0dc))\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/basic/nx/a/package.json",
    "content": "{\n  \"name\": \"a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/basic/nx/a/project.json",
    "content": "{\n  \"name\": \"fixture-basic-a\",\n  \"root\": \"nx/a\",\n  \"sourceRoot\": \"nx/a/src\",\n  \"projectType\": \"library\",\n  \"targets\": {\n    \"lint\": {\n      \"executor\": \"@nx/linter:eslint\",\n      \"outputs\": [\n        \"{options.outputFile}\"\n      ],\n      \"options\": {\n        \"lintFilePatterns\": [\n          \"nx/a/**/*.ts\"\n        ]\n      }\n    },\n    \"test\": {\n      \"executor\": \"@nx/jest:jest\",\n      \"outputs\": [\n        \"coverage/nx/a\"\n      ],\n      \"options\": {\n        \"jestConfig\": \"nx/a/jest.config.js\",\n        \"passWithNoTests\": true\n      }\n    }\n  },\n  \"tags\": []\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/basic/nx/b/package.json",
    "content": "{\n  \"name\": \"b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/basic/nx/b/project.json",
    "content": "{\n  \"name\": \"fixture-basic-b\",\n  \"root\": \"nx/b\",\n  \"sourceRoot\": \"nx/b/src\",\n  \"projectType\": \"library\",\n  \"targets\": {\n    \"lint\": {\n      \"executor\": \"@nx/linter:eslint\",\n      \"outputs\": [\n        \"{options.outputFile}\"\n      ],\n      \"options\": {\n        \"lintFilePatterns\": [\n          \"nx/b/**/*.ts\"\n        ]\n      }\n    },\n    \"test\": {\n      \"executor\": \"@nx/jest:jest\",\n      \"outputs\": [\n        \"coverage/nx/b\"\n      ],\n      \"options\": {\n        \"jestConfig\": \"nx/b/jest.config.js\",\n        \"passWithNoTests\": true\n      }\n    }\n  },\n  \"tags\": []\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/basic/nx.json",
    "content": "{\n  \"npmScope\": \"secretarium\",\n  \"affected\": {\n    \"defaultBase\": \"main\"\n  },\n  \"cli\": {\n    \"defaultCollection\": \"@nx/react\"\n  },\n  \"tasksRunnerOptions\": {\n    \"default\": {\n      \"runner\": \"nx-cloud\",\n      \"options\": {\n        \"cacheableOperations\": [\n          \"build\",\n          \"lint\",\n          \"test\",\n          \"e2e\"\n        ]\n      }\n    }\n  },\n  \"generators\": {\n    \"@nx/react\": {\n      \"application\": {\n        \"style\": \"css\",\n        \"linter\": \"eslint\",\n        \"babel\": true\n      },\n      \"component\": {\n        \"style\": \"css\"\n      },\n      \"library\": {\n        \"style\": \"css\",\n        \"linter\": \"eslint\"\n      }\n    }\n  },\n  \"defaultProject\": \"a\"\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/basic/package.json",
    "content": "{\n  \"name\": \"basic\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"nx\": \"^16.0.0\"\n  }\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/empty/nx.json",
    "content": "{\n  \"npmScope\": \"empty\",\n  \"affected\": {\n    \"defaultBase\": \"main\"\n  },\n  \"implicitDependencies\": {\n    \"package.json\": {\n      \"dependencies\": \"*\",\n      \"devDependencies\": \"*\"\n    },\n    \".eslintrc.json\": \"*\"\n  },\n  \"tasksRunnerOptions\": {\n    \"default\": {\n      \"runner\": \"nx/tasks-runners/default\",\n      \"options\": {\n        \"cacheableOperations\": [\n          \"build\",\n          \"lint\",\n          \"test\",\n          \"e2e\"\n        ]\n      }\n    }\n  },\n  \"targetDependencies\": {\n    \"build\": [\n      {\n        \"target\": \"build\",\n        \"projects\": \"dependencies\"\n      }\n    ]\n  }\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/empty/package.json",
    "content": "{\n  \"name\": \"empty\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"nx\": \"^16.0.0\"\n  }\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx14/nx/c/package.json",
    "content": "{\n  \"name\": \"c\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx14/nx/c/project.json",
    "content": "{\n  \"name\": \"fixture-nx14-c\",\n  \"root\": \"nx/c\",\n  \"sourceRoot\": \"nx/c/src\",\n  \"projectType\": \"library\",\n  \"targets\": {\n    \"lint\": {\n      \"executor\": \"@nrwl/linter:eslint\",\n      \"outputs\": [\n        \"{options.outputFile}\"\n      ],\n      \"options\": {\n        \"lintFilePatterns\": [\n          \"nx/c/**/*.ts\"\n        ]\n      }\n    },\n    \"test\": {\n      \"executor\": \"@nrwl/jest:jest\",\n      \"outputs\": [\n        \"coverage/nx/c\"\n      ],\n      \"options\": {\n        \"jestConfig\": \"nx/c/jest.config.js\",\n        \"passWithNoTests\": true\n      }\n    }\n  },\n  \"tags\": []\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx14/nx/d/package.json",
    "content": "{\n  \"name\": \"d\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx14/nx/d/project.json",
    "content": "{\n  \"name\": \"fixture-nx14-d\",\n  \"root\": \"nx/d\",\n  \"sourceRoot\": \"nx/d/src\",\n  \"projectType\": \"library\",\n  \"targets\": {\n    \"lint\": {\n      \"executor\": \"@nrwl/linter:eslint\",\n      \"outputs\": [\n        \"{options.outputFile}\"\n      ],\n      \"options\": {\n        \"lintFilePatterns\": [\n          \"nx/d/**/*.ts\"\n        ]\n      }\n    },\n    \"test\": {\n      \"executor\": \"@nrwl/jest:jest\",\n      \"outputs\": [\n        \"coverage/nx/d\"\n      ],\n      \"options\": {\n        \"jestConfig\": \"nx/d/jest.config.js\",\n        \"passWithNoTests\": true\n      }\n    }\n  },\n  \"tags\": []\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx14/nx.json",
    "content": "{\n  \"npmScope\": \"secretarium\",\n  \"affected\": {\n    \"defaultBase\": \"main\"\n  },\n  \"cli\": {\n    \"defaultCollection\": \"@nrwl/react\"\n  },\n  \"tasksRunnerOptions\": {\n    \"default\": {\n      \"runner\": \"@nrwl/nx-cloud\",\n      \"options\": {\n        \"cacheableOperations\": [\n          \"build\",\n          \"lint\",\n          \"test\",\n          \"e2e\"\n        ]\n      }\n    }\n  },\n  \"generators\": {\n    \"@nrwl/react\": {\n      \"application\": {\n        \"style\": \"css\",\n        \"linter\": \"eslint\",\n        \"babel\": true\n      },\n      \"component\": {\n        \"style\": \"css\"\n      },\n      \"library\": {\n        \"style\": \"css\",\n        \"linter\": \"eslint\"\n      }\n    }\n  },\n  \"defaultProject\": \"c\"\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx14/package.json",
    "content": "{\n  \"name\": \"basic\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"nx\": \"^14.0.0\"\n  }\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx14/workspace.json",
    "content": "{\n  \"version\": 2,\n  \"projects\": {\n    \"c\": \"nx/c\",\n    \"d\": \"nx/d\"\n  }\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx15/nx/e/package.json",
    "content": "{\n  \"name\": \"e\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx15/nx/e/project.json",
    "content": "{\n  \"name\": \"fixture-nx15-e\",\n  \"root\": \"nx/e\",\n  \"sourceRoot\": \"nx/e/src\",\n  \"projectType\": \"library\",\n  \"targets\": {\n    \"lint\": {\n      \"executor\": \"@nrwl/linter:eslint\",\n      \"outputs\": [\n        \"{options.outputFile}\"\n      ],\n      \"options\": {\n        \"lintFilePatterns\": [\n          \"nx/e/**/*.ts\"\n        ]\n      }\n    },\n    \"test\": {\n      \"executor\": \"@nrwl/jest:jest\",\n      \"outputs\": [\n        \"coverage/nx/e\"\n      ],\n      \"options\": {\n        \"jestConfig\": \"nx/e/jest.config.js\",\n        \"passWithNoTests\": true\n      }\n    }\n  },\n  \"tags\": []\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx15/nx/f/package.json",
    "content": "{\n  \"name\": \"f\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx15/nx/f/project.json",
    "content": "{\n  \"name\": \"fixture-nx15-f\",\n  \"root\": \"nx/f\",\n  \"sourceRoot\": \"nx/f/src\",\n  \"projectType\": \"library\",\n  \"targets\": {\n    \"lint\": {\n      \"executor\": \"@nrwl/linter:eslint\",\n      \"outputs\": [\n        \"{options.outputFile}\"\n      ],\n      \"options\": {\n        \"lintFilePatterns\": [\n          \"nx/f/**/*.ts\"\n        ]\n      }\n    },\n    \"test\": {\n      \"executor\": \"@nrwl/jest:jest\",\n      \"outputs\": [\n        \"coverage/nx/f\"\n      ],\n      \"options\": {\n        \"jestConfig\": \"nx/f/jest.config.js\",\n        \"passWithNoTests\": true\n      }\n    }\n  },\n  \"tags\": []\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx15/nx.json",
    "content": "{\n  \"npmScope\": \"secretarium\",\n  \"affected\": {\n    \"defaultBase\": \"main\"\n  },\n  \"cli\": {\n    \"defaultCollection\": \"@nrwl/react\"\n  },\n  \"tasksRunnerOptions\": {\n    \"default\": {\n      \"runner\": \"@nrwl/nx-cloud\",\n      \"options\": {\n        \"cacheableOperations\": [\n          \"build\",\n          \"lint\",\n          \"test\",\n          \"e2e\"\n        ]\n      }\n    }\n  },\n  \"generators\": {\n    \"@nrwl/react\": {\n      \"application\": {\n        \"style\": \"css\",\n        \"linter\": \"eslint\",\n        \"babel\": true\n      },\n      \"component\": {\n        \"style\": \"css\"\n      },\n      \"library\": {\n        \"style\": \"css\",\n        \"linter\": \"eslint\"\n      }\n    }\n  },\n  \"defaultProject\": \"e\"\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx15/package.json",
    "content": "{\n  \"name\": \"basic\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"nx\": \"^15.0.0\"\n  }\n}"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx17/nx/g/package.json",
    "content": "{\n  \"name\": \"g\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx17/nx/g/project.json",
    "content": "{\n  \"name\": \"fixture-nx17-g\",\n  \"root\": \"nx/g\",\n  \"sourceRoot\": \"nx/g/src\",\n  \"projectType\": \"library\",\n  \"targets\": {\n    \"lint\": {\n      \"executor\": \"@nx/linter:eslint\",\n      \"outputs\": [\n        \"{options.outputFile}\"\n      ],\n      \"options\": {\n        \"lintFilePatterns\": [\n          \"nx/g/**/*.ts\"\n        ]\n      }\n    },\n    \"test\": {\n      \"executor\": \"@nx/jest:jest\",\n      \"outputs\": [\n        \"coverage/nx/g\"\n      ],\n      \"options\": {\n        \"jestConfig\": \"nx/g/jest.config.js\",\n        \"passWithNoTests\": true\n      }\n    }\n  },\n  \"tags\": []\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx17/nx/h/package.json",
    "content": "{\n  \"name\": \"h\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx17/nx/h/project.json",
    "content": "{\n  \"name\": \"fixture-nx17-h\",\n  \"root\": \"nx/h\",\n  \"sourceRoot\": \"nx/h/src\",\n  \"projectType\": \"library\",\n  \"targets\": {\n    \"lint\": {\n      \"executor\": \"@nx/linter:eslint\",\n      \"outputs\": [\n        \"{options.outputFile}\"\n      ],\n      \"options\": {\n        \"lintFilePatterns\": [\n          \"nx/h/**/*.ts\"\n        ]\n      }\n    },\n    \"test\": {\n      \"executor\": \"@nx/jest:jest\",\n      \"outputs\": [\n        \"coverage/nx/h\"\n      ],\n      \"options\": {\n        \"jestConfig\": \"nx/h/jest.config.js\",\n        \"passWithNoTests\": true\n      }\n    }\n  },\n  \"tags\": []\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx17/nx.json",
    "content": "{\n  \"affected\": {\n    \"defaultBase\": \"main\"\n  },\n  \"cli\": {\n    \"defaultCollection\": \"@nx/react\"\n  },\n  \"tasksRunnerOptions\": {\n    \"default\": {\n      \"runner\": \"nx-cloud\",\n      \"options\": {\n        \"cacheableOperations\": [\n          \"build\",\n          \"lint\",\n          \"test\",\n          \"e2e\"\n        ]\n      }\n    }\n  },\n  \"generators\": {\n    \"@nx/react\": {\n      \"application\": {\n        \"style\": \"css\",\n        \"linter\": \"eslint\",\n        \"babel\": true\n      },\n      \"component\": {\n        \"style\": \"css\"\n      },\n      \"library\": {\n        \"style\": \"css\",\n        \"linter\": \"eslint\"\n      }\n    }\n  },\n  \"defaultProject\": \"g\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/fixtures/nx17/package.json",
    "content": "{\n  \"name\": \"basic\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"nx\": \"^17.0.0\"\n  }\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/index.js",
    "content": "import { RuleConfigSeverity } from \"@commitlint/types\";\nimport { getProjects as getNXProjects } from \"nx/src/generators/utils/project-configuration.js\";\nimport { FsTree } from \"nx/src/generators/tree.js\";\n\nexport default {\n\tutils: { getProjects },\n\trules: {\n\t\t\"scope-enum\": (ctx) =>\n\t\t\tPromise.resolve([RuleConfigSeverity.Error, \"always\", getProjects(ctx)]),\n\t},\n};\n\n/**\n * @param {(params: Pick<Nx.ProjectConfiguration, 'name' | 'projectType' | 'tags'>) => boolean} selector\n */\nfunction getProjects(context, selector = () => true) {\n\tconst ctx = context || {};\n\tconst cwd = ctx.cwd || process.cwd();\n\n\tconst projects = getNXProjects(new FsTree(cwd, false));\n\treturn Array.from(projects.entries())\n\t\t.map(([name, project]) => ({\n\t\t\tname,\n\t\t\t...project,\n\t\t}))\n\t\t.filter((project) =>\n\t\t\tselector({\n\t\t\t\tname: project.name,\n\t\t\t\tprojectType: project.projectType,\n\t\t\t\ttags: project.tags,\n\t\t\t}),\n\t\t)\n\t\t.map((project) => project.name)\n\t\t.map((name) => (name.charAt(0) === \"@\" ? name.split(\"/\")[1] : name));\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/index.test.js",
    "content": "import { test, expect } from \"vitest\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { npm } from \"@commitlint/test\";\n\nimport config from \"./index.js\";\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\ntest(\"exports rules key\", () => {\n\texpect(config).toHaveProperty(\"rules\");\n});\n\ntest(\"rules hold object\", () => {\n\texpect(config).toMatchObject({\n\t\trules: expect.any(Object),\n\t});\n});\n\ntest(\"rules contain scope-enum\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.anything(),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum is function\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.any(Function),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum does not throw for missing context\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tawait expect(fn()).resolves.toBeTruthy();\n});\n\ntest(\"scope-enum has expected severity\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [severity] = await fn();\n\texpect(severity).toBe(2);\n});\n\ntest(\"scope-enum has expected modifier\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [, modifier] = await fn();\n\texpect(modifier).toBe(\"always\");\n});\n\ntest(\"returns empty value for empty nx repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/empty\", __dirname);\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([]);\n});\n\ntest(\"returns expected value for basic nx repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/basic\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"fixture-basic-a\", \"fixture-basic-b\"]);\n});\n\ntest(\"expect correct result from Nx 14\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/nx14\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"fixture-nx14-c\", \"fixture-nx14-d\"]);\n});\n\ntest(\"expect correct result from Nx 15\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/nx15\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"fixture-nx15-e\", \"fixture-nx15-f\"]);\n});\n\ntest(\"expect correct result from Nx 17\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/nx17\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"fixture-nx17-g\", \"fixture-nx17-h\"]);\n});\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2022 - present Florian Guitton\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-nx-scopes\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Shareable commitlint config enforcing nx project names as scopes\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-nx-scopes\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"nx\"\n  ],\n  \"author\": \"Florian Guitton <florian@secretarium.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"peerDependencies\": {\n    \"nx\": \">=14.0.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"nx\": {\n      \"optional\": true\n    }\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"@commitlint/types\": \"^20.5.0\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-nx-scopes/readme.md",
    "content": "# @commitlint/config-nx-scopes\n\nLint your nx project commits\n\nShareable `commitlint` config enforcing nx project and workspace names as scopes.\nUse with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli).\n\n## Getting started\n\n```\nnpm install --save-dev @commitlint/config-nx-scopes @commitlint/cli\necho \"module.exports = {extends: ['@commitlint/config-nx-scopes']};\" > commitlint.config.js\n```\n\n## Filtering projects\n\nYou can filter projects by providing a filter function as the second parameter to `getProjects()`. The function will be called with an object containing each projects' `name`, `projectType`, and `tags`. Simply return a boolean to indicate whether the project should be included or not.\n\nAs an example, the following code demonstrates how to select only applications that are not end-to-end tests.\n\nIn your .commitlintrc.js file:\n\n```javascript\nasync function getConfig() {\n  const {\n    default: {\n      utils: { getProjects },\n    },\n  } = await import(\"@commitlint/config-nx-scopes\");\n\n  return {\n    rules: {\n      \"scope-enum\": async (ctx) => [\n        2,\n        \"always\",\n        [\n          ...(await getProjects(\n            ctx,\n            ({ name, projectType }) =>\n              !name.includes(\"e2e\") && projectType == \"application\",\n          )),\n        ],\n      ],\n    },\n    // . . .\n  };\n}\n\nmodule.exports = getConfig();\n```\n\nHere is another example where projects tagged with 'stage:end-of-life' are not allowed to be used as the scope for a commit.\n\nIn your .commitlintrc.js file:\n\n```javascript\nasync function getConfig() {\n  const {\n    default: {\n      utils: { getProjects },\n    },\n  } = await import(\"@commitlint/config-nx-scopes\");\n\n  return {\n    rules: {\n      \"scope-enum\": async (ctx) => [\n        2,\n        \"always\",\n        [\n          ...(await getProjects(\n            ctx,\n            ({ tags }) => !tags.includes(\"stage:end-of-life\"),\n          )),\n        ],\n      ],\n    },\n    // . . .\n  };\n}\n\nmodule.exports = getConfig();\n```\n\n## Examples\n\n```\n❯ cat commitlint.config.js\n{\n  extends: ['@commitlint/config-nx-scopes']\n}\n\n❯ tree packages\n\npackages\n├── api\n├── app\n└── web\n\n❯ echo \"build(api): change something in api's build\" | commitlint\n⧗   input: build(api): change something in api's build\n✔   found 0 problems, 0 warnings\n\n❯ echo \"test(foo): this won't pass\" | commitlint\n⧗   input: test(foo): this won't pass\n✖   scope must be one of [api, app, web] [scope-enum]\n✖   found 1 problems, 0 warnings\n\n❯ echo \"ci: do some general maintenance\" | commitlint\n⧗   input: ci: do some general maintenance\n✔   found 0 problems, 0 warnings\n```\n\nConsult [Rules reference](https://commitlint.js.org/reference/rules) for a list of available rules.\n"
  },
  {
    "path": "@commitlint/config-patternplate/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n\n### Bug Fixes\n\n* update dependency glob to v11 [security] ([#4561](https://github.com/conventional-changelog/commitlint/issues/4561)) ([a89a08b](https://github.com/conventional-changelog/commitlint/commit/a89a08b2fd3c72a6cd09e00508fc2e972f27c64c))\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add `main` and `types` keys in package.json ([#3953](https://github.com/conventional-changelog/commitlint/issues/3953)) ([7ddaad4](https://github.com/conventional-changelog/commitlint/commit/7ddaad4bc4e71afe89f25cc02d3e19beba1ce6cd))\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Features\n\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package @commitlint/config-patternplate\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n"
  },
  {
    "path": "@commitlint/config-patternplate/README.md",
    "content": "# @commitlint/config-patternplate\n\nLint your commits, patternplate-style\n\nShareable `commitlint` config enforcing the patternplate commit convention.\nUse with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli).\n\n## Getting started\n\n```sh\nnpm install --save-dev @commitlint/config-patternplate @commitlint/cli\necho \"module.exports = {extends: ['@commitlint/config-patternplate']};\" > commitlint.config.js\n```\n\n## Rules\n\n`@commitlint/config-patternplate` extends the [shareable angular config](../config-angular#rules).\nAdditionally these rules apply:\n\n### Problems\n\nThe following rules are considered problems for `@commitlint/config-patternplate` and will yield a non-zero exit code when not met.\n\n#### scope-enum\n\n- **description**: `scope` is found in `value`\n- **rule**: `always`\n- **value**: determined based on pattern tree. `system` and all pattern ids present in `patterns` are allowed\n\nConsult [Rules reference](https://commitlint.js.org/reference/rules) for a list of available rules.\n"
  },
  {
    "path": "@commitlint/config-patternplate/index.js",
    "content": "import path from \"node:path\";\n\nimport configAngular from \"@commitlint/config-angular\";\nimport { glob } from \"glob\";\nimport mergeWith from \"lodash.mergewith\";\n\nfunction pathToId(root, filePath) {\n\tconst relativePath = path.relative(root, filePath);\n\treturn path.dirname(relativePath).split(path.sep).join(\"/\");\n}\n\nasync function getPatternIDs() {\n\tconst root = path.resolve(process.cwd(), \"./patterns\");\n\tconst pattern = path.resolve(root, \"**/pattern.json\");\n\tconst files = glob(pattern);\n\treturn files.map((result) => pathToId(root, result));\n}\n\nexport default mergeWith(configAngular, {\n\trules: {\n\t\t\"scope-enum\": () =>\n\t\t\tgetPatternIDs().then((ids) => [2, \"always\", ids.concat([\"system\"])]),\n\t},\n});\n"
  },
  {
    "path": "@commitlint/config-patternplate/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/config-patternplate/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-patternplate\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commits, patternplate-style\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-import\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-patternplate\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"patternplate\"\n  ],\n  \"author\": \"Mario Nebl <hello@herebecode.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"@commitlint/config-angular\": \"^20.5.0\",\n    \"glob\": \"^11.0.0\",\n    \"lodash.mergewith\": \"^4.6.2\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/lodash.mergewith\": \"^4.6.8\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n\n### Features\n\n* **config-pnpm-scopes:** allow global scope ([#4553](https://github.com/conventional-changelog/commitlint/issues/4553)) ([e571970](https://github.com/conventional-changelog/commitlint/commit/e57197061447eb9ea74b8d81ab003ad3b4652be6))\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n## [19.9.1](https://github.com/conventional-changelog/commitlint/compare/v19.9.0...v19.9.1) (2025-08-29)\n\n\n### Bug Fixes\n\n* 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))\n\n\n\n\n\n# [19.9.0](https://github.com/conventional-changelog/commitlint/compare/v19.8.1...v19.9.0) (2025-08-26)\n\n\n### Features\n\n* **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))\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add `main` and `types` keys in package.json ([#3953](https://github.com/conventional-changelog/commitlint/issues/3953)) ([7ddaad4](https://github.com/conventional-changelog/commitlint/commit/7ddaad4bc4e71afe89f25cc02d3e19beba1ce6cd))\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n\n### Bug Fixes\n\n* **config-pnpm-scopes:** refactor to remove peer dependencies ([#3564](https://github.com/conventional-changelog/commitlint/issues/3564)) ([f1f3bd5](https://github.com/conventional-changelog/commitlint/commit/f1f3bd5b7f33f7198719ed4aead3417e894a10ec)), closes [#3556](https://github.com/conventional-changelog/commitlint/issues/3556)\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/config-pnpm-scopes\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n### Features\n\n- **config-pnpm-scopes:** implement config-pnpm-scopes ([#3427](https://github.com/conventional-changelog/commitlint/issues/3427)) ([ca3ae8b](https://github.com/conventional-changelog/commitlint/commit/ca3ae8b14271c62910d228a622bec20b1be8ed63))\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/basic/package.json",
    "content": "{\n  \"name\": \"basic\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"devDependencies\": {}\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/basic/packages/a/package.json",
    "content": "{\n  \"name\": \"a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/basic/packages/b/package.json",
    "content": "{\n  \"name\": \"b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/basic/pnpm-workspace.yaml",
    "content": "packages:\n  - 'packages/*'\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/empty/package.json",
    "content": "{\n  \"name\": \"empty\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"devDependencies\": {}\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/empty/pnpm-workspace.yaml",
    "content": "packages:\n  - 'packages/*'\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/scoped/package.json",
    "content": "{\n  \"name\": \"basic\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"devDependencies\": {}\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/scoped/packages/a/package.json",
    "content": "{\n  \"name\": \"@scope/a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/scoped/packages/b/package.json",
    "content": "{\n  \"name\": \"@scope/b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/fixtures/scoped/pnpm-workspace.yaml",
    "content": "packages:\n  - 'packages/*'\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { npm } from \"@commitlint/test\";\n\nimport config from \"./index.js\";\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\ntest(\"exports rules key\", () => {\n\texpect(config).toHaveProperty(\"rules\");\n});\n\ntest(\"rules hold object\", () => {\n\texpect(config).toMatchObject({\n\t\trules: expect.any(Object),\n\t});\n});\n\ntest(\"rules contain scope-enum\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.anything(),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum is function\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.any(Function),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum does not throw for missing context\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tawait expect(fn()).resolves.toBeTruthy();\n});\n\ntest(\"scope-enum has expected severity\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [severity] = await fn();\n\texpect(severity).toBe(2);\n});\n\ntest(\"scope-enum has expected modifier\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [, modifier] = await fn();\n\texpect(modifier).toBe(\"always\");\n});\n\ntest(\"returns global scope for empty pnpm repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/empty\", __dirname);\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"global\"]);\n});\n\ntest(\"returns expected value for basic pnpm repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/basic\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"a\", \"b\", \"global\"]);\n});\n\ntest(\"returns expected value for scoped pnpm repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/scoped\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\n\texpect(value).toEqual([\"a\", \"b\", \"global\"]);\n});\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/index.ts",
    "content": "import path from \"node:path\";\n\nimport fg from \"fast-glob\";\nimport readYamlFileModule from \"read-yaml-file\";\nimport { readExactProjectManifest } from \"@pnpm/read-project-manifest\";\nconst readYamlFile = readYamlFileModule.default;\n\nexport default {\n\tutils: { getProjects },\n\trules: {\n\t\t\"scope-enum\": (ctx = {}) =>\n\t\t\tgetProjects(ctx).then((packages: any) => [2, \"always\", packages]),\n\t},\n};\n\nfunction requirePackagesManifest(dir: any) {\n\treturn readYamlFile(path.join(dir, \"pnpm-workspace.yaml\")).catch(\n\t\t(err: any) => {\n\t\t\tif (err.code === \"ENOENT\") {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tthrow err;\n\t\t},\n\t);\n}\n\nfunction normalizePatterns(patterns: any) {\n\tconst normalizedPatterns = [];\n\tfor (const pattern of patterns) {\n\t\tnormalizedPatterns.push(pattern.replace(/\\/?$/, \"/package.json\"));\n\t\tnormalizedPatterns.push(pattern.replace(/\\/?$/, \"/package.json5\"));\n\t\tnormalizedPatterns.push(pattern.replace(/\\/?$/, \"/package.yaml\"));\n\t}\n\treturn normalizedPatterns;\n}\n\nfunction findWorkspacePackages(cwd: any) {\n\treturn requirePackagesManifest(cwd)\n\t\t.then((manifest: any) => {\n\t\t\tconst patterns = normalizePatterns(\n\t\t\t\t(manifest && manifest.packages) || [\"**\"],\n\t\t\t);\n\t\t\tconst opts = {\n\t\t\t\tcwd,\n\t\t\t\tignore: [\"**/node_modules/**\", \"**/bower_components/**\"],\n\t\t\t};\n\n\t\t\treturn fg(patterns, opts);\n\t\t})\n\t\t.then((entries: any) => {\n\t\t\tconst paths = Array.from(\n\t\t\t\tnew Set(entries.map((entry: any) => path.join(cwd, entry))),\n\t\t\t);\n\n\t\t\treturn Promise.all(\n\t\t\t\tpaths.map((manifestPath: any) =>\n\t\t\t\t\treadExactProjectManifest(manifestPath),\n\t\t\t\t),\n\t\t\t);\n\t\t})\n\t\t.then((manifests: any) => {\n\t\t\treturn manifests.map((manifest: any) => manifest.manifest);\n\t\t});\n}\n\nfunction getProjects(context: any) {\n\tconst ctx = context || {};\n\tconst cwd = ctx.cwd || process.cwd();\n\n\treturn findWorkspacePackages(cwd).then((projects: any) => {\n\t\tconst scopes = projects.reduce((acc: any, project: any) => {\n\t\t\tconst name = project.name;\n\n\t\t\tif (name) {\n\t\t\t\tacc.add(name.charAt(0) === \"@\" ? name.split(\"/\")[1] : name);\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t}, new Set());\n\t\tscopes.add(\"global\");\n\n\t\treturn Array.from(scopes).sort();\n\t});\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2022 - present Dan Onoshko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-pnpm-scopes\",\n  \"type\": \"module\",\n  \"version\": \"20.4.3\",\n  \"description\": \"Shareable commitlint config enforcing pnpm workspaces names as scopes\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"test\": \"jest\",\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-pnpm-scopes\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"pnpm\"\n  ],\n  \"author\": \"Dan Onoshko <danon0404@gmail.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"@pnpm/read-project-manifest\": \"^5.0.10\",\n    \"fast-glob\": \"^3.3.1\",\n    \"read-yaml-file\": \"^2.1.0\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/node\": \"^18.19.17\",\n    \"typescript\": \"^5.2.2\"\n  },\n  \"exports\": {\n    \".\": {\n      \"import\": \"./dist/index.js\",\n      \"require\": \"./dist/index.js\",\n      \"types\": \"./dist/index.d.ts\"\n    }\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/readme.md",
    "content": "# @commitlint/config-pnpm-scopes\n\nLint your pnpm workspaces project commits\n\nShareable `commitlint` config enforcing pnpm workspaces names as scopes.\nUse with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli).\n\n## Getting started\n\n```\nnpm install --save-dev @commitlint/config-pnpm-scopes @commitlint/cli\necho \"module.exports = {extends: ['@commitlint/config-pnpm-scopes']};\" > commitlint.config.js\n```\n\n## Examples\n\n```\n❯ cat commitlint.config.js\n{\n  extends: ['@commitlint/config-pnpm-scopes']\n}\n\n❯ tree packages\n\npackages\n├── api\n├── app\n└── web\n\n❯ echo \"build(api): change something in api's build\" | commitlint\n⧗   input: build(api): change something in api's build\n✔   found 0 problems, 0 warnings\n\n❯ echo \"test(foo): this won't pass\" | commitlint\n⧗   input: test(foo): this won't pass\n✖   scope must be one of [api, app, web] [scope-enum]\n✖   found 1 problems, 0 warnings\n\n❯ echo \"ci: do some general maintenance\" | commitlint\n⧗   input: ci: do some general maintenance\n✔   found 0 problems, 0 warnings\n```\n\nConsult [Rules reference](https://commitlint.js.org/reference/rules) for a list of available rules.\n"
  },
  {
    "path": "@commitlint/config-pnpm-scopes/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./\",\n    \"outDir\": \"./dist\"\n  },\n  \"include\": [\"*.ts\"],\n  \"exclude\": [\"./dist/**/*\"],\n  \"references\": [{ \"path\": \"../types\" }]\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add `main` and `types` keys in package.json ([#3953](https://github.com/conventional-changelog/commitlint/issues/3953)) ([7ddaad4](https://github.com/conventional-changelog/commitlint/commit/7ddaad4bc4e71afe89f25cc02d3e19beba1ce6cd))\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/config-rush-scopes\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n### Features\n\n- **config-rush-scopes:** add config for rush monorepo ([#2878](https://github.com/conventional-changelog/commitlint/issues/2878)) ([befa677](https://github.com/conventional-changelog/commitlint/commit/befa677c3c2bed38085a62da161366784d971906))\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/fixtures/basic/packages/a/package.json",
    "content": "{\n  \"name\": \"a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/fixtures/basic/packages/b/package.json",
    "content": "{\n  \"name\": \"b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/fixtures/basic/rush.json",
    "content": "/**\n * This is the main configuration file for Rush.\n * For full documentation, please see https://rushjs.io\n */\n {\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json\",\n  /**\n   * (Required) This specifies the version of the Rush engine to be used in this repo.\n   * Rush's \"version selector\" feature ensures that the globally installed tool will\n   * behave like this release, regardless of which version is installed globally.\n   *\n   * The common/scripts/install-run-rush.js automation script also uses this version.\n   *\n   * NOTE: If you upgrade to a new major version of Rush, you should replace the \"v5\"\n   * path segment in the \"$schema\" field for all your Rush config files.  This will ensure\n   * correct error-underlining and tab-completion for editors such as VS Code.\n   */\n  \"rushVersion\": \"5.56.0\",\n  /**\n   * The next field selects which package manager should be installed and determines its version.\n   * Rush installs its own local copy of the package manager to ensure that your build process\n   * is fully isolated from whatever tools are present in the local environment.\n   *\n   * Specify one of: \"pnpmVersion\", \"npmVersion\", or \"yarnVersion\".  See the Rush documentation\n   * for details about these alternatives.\n   */\n  \"pnpmVersion\": \"6.20.3\",\n  // \"npmVersion\": \"6.14.15\",\n  // \"yarnVersion\": \"1.9.4\",\n  /**\n   * Options that are only used when the PNPM package manager is selected\n   */\n  \"pnpmOptions\": {\n    /**\n     * Specifies the location of the PNPM store.  There are two possible values:\n     *\n     * - \"local\" - use the \"pnpm-store\" folder in the current configured temp folder:\n     *   \"common/temp/pnpm-store\" by default.\n     * - \"global\" - use PNPM's global store, which has the benefit of being shared\n     *    across multiple repo folders, but the disadvantage of less isolation for builds\n     *    (e.g. bugs or incompatibilities when two repos use different releases of PNPM)\n     *\n     * RUSH_PNPM_STORE_PATH will override the directory that will be used as the store\n     *\n     * In all cases, the store path will be overridden by the environment variable RUSH_PNPM_STORE_PATH.\n     *\n     * The default value is \"local\".\n     */\n    // \"pnpmStore\": \"local\",\n    /**\n     * If true, then Rush will add the \"--strict-peer-dependencies\" option when invoking PNPM.\n     * This causes \"rush install\" to fail if there are unsatisfied peer dependencies, which is\n     * an invalid state that can cause build failures or incompatible dependency versions.\n     * (For historical reasons, JavaScript package managers generally do not treat this invalid\n     * state as an error.)\n     *\n     * The default value is false to avoid legacy compatibility issues.\n     * It is strongly recommended to set strictPeerDependencies=true.\n     */\n    // \"strictPeerDependencies\": true,\n    /**\n     * Configures the strategy used to select versions during installation.\n     *\n     * This feature requires PNPM version 3.1 or newer.  It corresponds to the \"--resolution-strategy\" command-line\n     * option for PNPM.  Possible values are \"fast\" and \"fewer-dependencies\".  PNPM's default is \"fast\", but this may\n     * be incompatible with certain packages, for example the \"@types\" packages from DefinitelyTyped.  Rush's default\n     * is \"fewer-dependencies\", which causes PNPM to avoid installing a newer version if an already installed version\n     * can be reused; this is more similar to NPM's algorithm.\n     *\n     * After modifying this field, it's recommended to run \"rush update --full\" so that the package manager\n     * will recalculate all version selections.\n     */\n    // \"resolutionStrategy\": \"fast\",\n    /**\n     * If true, then `rush install` will report an error if manual modifications\n     * were made to the PNPM shrinkwrap file without running \"rush update\" afterwards.\n     *\n     * This feature protects against accidental inconsistencies that may be introduced\n     * if the PNPM shrinkwrap file (\"pnpm-lock.yaml\") is manually edited.  When this\n     * feature is enabled, \"rush update\" will append a hash to the file as a YAML comment,\n     * and then \"rush update\" and \"rush install\" will validate the hash.  Note that this does not prohibit\n     * manual modifications, but merely requires \"rush update\" be run\n     * afterwards, ensuring that PNPM can report or repair any potential inconsistencies.\n     *\n     * To temporarily disable this validation when invoking \"rush install\", use the\n     * \"--bypass-policy\" command-line parameter.\n     *\n     * The default value is false.\n     */\n    // \"preventManualShrinkwrapChanges\": true,\n    /**\n     * If true, then `rush install` will use the PNPM workspaces feature to perform the\n     * install.\n     *\n     * This feature uses PNPM to perform the entire monorepo install. When using workspaces, Rush will\n     * generate a \"pnpm-workspace.yaml\" file referencing all local projects to install. Rush will\n     * also generate a \"pnpmfile.js\" which is used to provide preferred versions support. When install\n     * is run, this pnpmfile will be used to replace dependency version ranges with a smaller subset\n     * of the original range. If the preferred version is not fully a subset of the original version\n     * range, it will be left as-is. After this, the pnpmfile.js provided in the repository (if one\n     * exists) will be called to further modify package dependencies.\n     *\n     * This option is experimental. The default value is false.\n     */\n    // \"useWorkspaces\": true\n  },\n  /**\n   * Older releases of the Node.js engine may be missing features required by your system.\n   * Other releases may have bugs.  In particular, the \"latest\" version will not be a\n   * Long Term Support (LTS) version and is likely to have regressions.\n   *\n   * Specify a SemVer range to ensure developers use a Node.js version that is appropriate\n   * for your repo.\n   *\n   * LTS schedule: https://nodejs.org/en/about/releases/\n   * LTS versions: https://nodejs.org/en/download/releases/\n   */\n  \"nodeSupportedVersionRange\": \">=16.9.0 <17.0.0\",\n  /**\n   * Odd-numbered major versions of Node.js are experimental.  Even-numbered releases\n   * spend six months in a stabilization period before the first Long Term Support (LTS) version.\n   * For example, 8.9.0 was the first LTS version of Node.js 8.  Pre-LTS versions are not recommended\n   * for production usage because they frequently have bugs.  They may cause Rush itself\n   * to malfunction.\n   *\n   * Rush normally prints a warning if it detects a pre-LTS Node.js version.  If you are testing\n   * pre-LTS versions in preparation for supporting the first LTS version, you can use this setting\n   * to disable Rush's warning.\n   */\n  // \"suppressNodeLtsWarning\": false,\n  /**\n   * If you would like the version specifiers for your dependencies to be consistent, then\n   * uncomment this line. This is effectively similar to running \"rush check\" before any\n   * of the following commands:\n   *\n   *   rush install, rush update, rush link, rush version, rush publish\n   *\n   * In some cases you may want this turned on, but need to allow certain packages to use a different\n   * version. In those cases, you will need to add an entry to the \"allowedAlternativeVersions\"\n   * section of the common-versions.json.\n   */\n  // \"ensureConsistentVersions\": true,\n  /**\n   * Large monorepos can become intimidating for newcomers if project folder paths don't follow\n   * a consistent and recognizable pattern.  When the system allows nested folder trees,\n   * we've found that teams will often use subfolders to create islands that isolate\n   * their work from others (\"shipping the org\").  This hinders collaboration and code sharing.\n   *\n   * The Rush developers recommend a \"category folder\" model, where buildable project folders\n   * must always be exactly two levels below the repo root.  The parent folder acts as the category.\n   * This provides a basic facility for grouping related projects (e.g. \"apps\", \"libraries\",\n   * \"tools\", \"prototypes\") while still encouraging teams to organize their projects into\n   * a unified taxonomy.  Limiting to 2 levels seems very restrictive at first, but if you have\n   * 20 categories and 20 projects in each category, this scheme can easily accommodate hundreds\n   * of projects.  In practice, you will find that the folder hierarchy needs to be rebalanced\n   * occasionally, but if that's painful, it's a warning sign that your development style may\n   * discourage refactoring.  Reorganizing the categories should be an enlightening discussion\n   * that brings people together, and maybe also identifies poor coding practices (e.g. file\n   * references that reach into other project's folders without using Node.js module resolution).\n   *\n   * The defaults are projectFolderMinDepth=1 and projectFolderMaxDepth=2.\n   *\n   * To remove these restrictions, you could set projectFolderMinDepth=1\n   * and set projectFolderMaxDepth to a large number.\n   */\n  // \"projectFolderMinDepth\": 2,\n  // \"projectFolderMaxDepth\": 2,\n  /**\n   * Today the npmjs.com registry enforces fairly strict naming rules for packages, but in the early\n   * days there was no standard and hardly any enforcement.  A few large legacy projects are still using\n   * nonstandard package names, and private registries sometimes allow it.  Set \"allowMostlyStandardPackageNames\"\n   * to true to relax Rush's enforcement of package names.  This allows upper case letters and in the future may\n   * relax other rules, however we want to minimize these exceptions.  Many popular tools use certain punctuation\n   * characters as delimiters, based on the assumption that they will never appear in a package name; thus if we relax\n   * the rules too much it is likely to cause very confusing malfunctions.\n   *\n   * The default value is false.\n   */\n  // \"allowMostlyStandardPackageNames\": true,\n  /**\n   * This feature helps you to review and approve new packages before they are introduced\n   * to your monorepo.  For example, you may be concerned about licensing, code quality,\n   * performance, or simply accumulating too many libraries with overlapping functionality.\n   * The approvals are tracked in two config files \"browser-approved-packages.json\"\n   * and \"nonbrowser-approved-packages.json\".  See the Rush documentation for details.\n   */\n  // \"approvedPackagesPolicy\": {\n  //   /**\n  //    * The review categories allow you to say for example \"This library is approved for usage\n  //    * in prototypes, but not in production code.\"\n  //    *\n  //    * Each project can be associated with one review category, by assigning the \"reviewCategory\" field\n  //    * in the \"projects\" section of rush.json.  The approval is then recorded in the files\n  //    * \"common/config/rush/browser-approved-packages.json\" and \"nonbrowser-approved-packages.json\"\n  //    * which are automatically generated during \"rush update\".\n  //    *\n  //    * Designate categories with whatever granularity is appropriate for your review process,\n  //    * or you could just have a single category called \"default\".\n  //    */\n  //   \"reviewCategories\": [\n  //     // Some example categories:\n  //     \"production\", // projects that ship to production\n  //     \"tools\",      // non-shipping projects that are part of the developer toolchain\n  //     \"prototypes\"  // experiments that should mostly be ignored by the review process\n  //   ],\n  //\n  //   /**\n  //    * A list of NPM package scopes that will be excluded from review.\n  //    * We recommend to exclude TypeScript typings (the \"@types\" scope), because\n  //    * if the underlying package was already approved, this would imply that the typings\n  //    * are also approved.\n  //    */\n  //   // \"ignoredNpmScopes\": [\"@types\"]\n  // },\n  /**\n   * If you use Git as your version control system, this section has some additional\n   * optional features you can use.\n   */\n  \"gitPolicy\": {\n    /**\n     * Work at a big company?  Tired of finding Git commits at work with unprofessional Git\n     * emails such as \"beer-lover@my-college.edu\"?  Rush can validate people's Git email address\n     * before they get started.\n     *\n     * Define a list of regular expressions describing allowable e-mail patterns for Git commits.\n     * They are case-insensitive anchored JavaScript RegExps.  Example: \".*@example\\.com\"\n     *\n     * IMPORTANT: Because these are regular expressions encoded as JSON string literals,\n     * RegExp escapes need two backslashes, and ordinary periods should be \"\\\\.\".\n     */\n    // \"allowedEmailRegExps\": [\n    //   \"[^@]+@users\\\\.noreply\\\\.github\\\\.com\",\n    //   \"travis@example\\\\.org\"\n    // ],\n    /**\n     * When Rush reports that the address is malformed, the notice can include an example\n     * of a recommended email.  Make sure it conforms to one of the allowedEmailRegExps\n     * expressions.\n     */\n    // \"sampleEmail\": \"mrexample@users.noreply.github.com\",\n    /**\n     * The commit message to use when committing changes during 'rush publish'.\n     *\n     * For example, if you want to prevent these commits from triggering a CI build,\n     * you might configure your system's trigger to look for a special string such as \"[skip-ci]\"\n     * in the commit message, and then customize Rush's message to contain that string.\n     */\n    \"versionBumpCommitMessage\": \"chore: bump versions [skip ci]\",\n    /**\n     * The commit message to use when committing changes during 'rush version'.\n     *\n     * For example, if you want to prevent these commits from triggering a CI build,\n     * you might configure your system's trigger to look for a special string such as \"[skip-ci]\"\n     * in the commit message, and then customize Rush's message to contain that string.\n     */\n    \"changeLogUpdateCommitMessage\": \"docs: update changelogs [skip ci]\"\n  },\n  \"repository\": {\n    /**\n     * The URL of this Git repository, used by \"rush change\" to determine the base branch for your PR.\n     *\n     * The \"rush change\" command needs to determine which files are affected by your PR diff.\n     * If you merged or cherry-picked commits from the master branch into your PR branch, those commits\n     * should be excluded from this diff (since they belong to some other PR).  In order to do that,\n     * Rush needs to know where to find the base branch for your PR.  This information cannot be\n     * determined from Git alone, since the \"pull request\" feature is not a Git concept.  Ideally\n     * Rush would use a vendor-specific protocol to query the information from GitHub, Azure DevOps, etc.\n     * But to keep things simple, \"rush change\" simply assumes that your PR is against the \"master\" branch\n     * of the Git remote indicated by the repository.url setting in rush.json.  If you are working in\n     * a GitHub \"fork\" of the real repo, this setting will be different from the repository URL of your\n     * your PR branch, and in this situation \"rush change\" will also automatically invoke \"git fetch\"\n     * to retrieve the latest activity for the remote master branch.\n     */\n    /** TODO: CHANGE THIS **/\n    \"url\": \"https://github.com/microsoft/rush-example\",\n    /**\n     * The default branch name. This tells \"rush change\" which remote branch to compare against.\n     * The default value is \"master\"\n     */\n    \"defaultBranch\": \"master\",\n    /**\n     * The default remote. This tells \"rush change\" which remote to compare against if the remote URL is\n     * not set or if a remote matching the provided remote URL is not found.\n     */\n    \"defaultRemote\": \"origin\"\n  },\n  /**\n   * Event hooks are customized script actions that Rush executes when specific events occur\n   */\n  \"eventHooks\": {\n    /**\n     * The list of shell commands to run before the Rush installation starts\n     */\n    \"preRushInstall\": [\n      // \"common/scripts/pre-rush-install.js\"\n    ],\n    /**\n     * The list of shell commands to run after the Rush installation finishes\n     */\n    \"postRushInstall\": [],\n    /**\n     * The list of shell commands to run before the Rush build command starts\n     */\n    \"preRushBuild\": [],\n    /**\n     * The list of shell commands to run after the Rush build command finishes\n     */\n    \"postRushBuild\": []\n  },\n  /**\n   * Installation variants allow you to maintain a parallel set of configuration files that can be\n   * used to build the entire monorepo with an alternate set of dependencies.  For example, suppose\n   * you upgrade all your projects to use a new release of an important framework, but during a transition period\n   * you intend to maintain compatibility with the old release.  In this situation, you probably want your\n   * CI validation to build the entire repo twice: once with the old release, and once with the new release.\n   *\n   * Rush \"installation variants\" correspond to sets of config files located under this folder:\n   *\n   *   common/config/rush/variants/<variant_name>\n   *\n   * The variant folder can contain an alternate common-versions.json file.  Its \"preferredVersions\" field can be used\n   * to select older versions of dependencies (within a loose SemVer range specified in your package.json files).\n   * To install a variant, run \"rush install --variant <variant_name>\".\n   *\n   * For more details and instructions, see this article:  https://rushjs.io/pages/advanced/installation_variants/\n   */\n  \"variants\": [\n    // {\n    //   /**\n    //    * The folder name for this variant.\n    //    */\n    //   \"variantName\": \"old-sdk\",\n    //\n    //   /**\n    //    * An informative description\n    //    */\n    //   \"description\": \"Build this repo using the previous release of the SDK\"\n    // }\n  ],\n  /**\n   * Rush can collect anonymous telemetry about everyday developer activity such as\n   * success/failure of installs, builds, and other operations.  You can use this to identify\n   * problems with your toolchain or Rush itself.  THIS TELEMETRY IS NOT SHARED WITH MICROSOFT.\n   * It is written into JSON files in the common/temp folder.  It's up to you to write scripts\n   * that read these JSON files and do something with them.  These scripts are typically registered\n   * in the \"eventHooks\" section.\n   */\n  // \"telemetryEnabled\": false,\n  /**\n   * Allows creation of hotfix changes. This feature is experimental so it is disabled by default.\n   * If this is set, 'rush change' only allows a 'hotfix' change type to be specified. This change type\n   * will be used when publishing subsequent changes from the monorepo.\n   */\n  // \"hotfixChangeEnabled\": false,\n  /**\n   * (Required) This is the inventory of projects to be managed by Rush.\n   *\n   * Rush does not automatically scan for projects using wildcards, for a few reasons:\n   * 1. Depth-first scans are expensive, particularly when tools need to repeatedly collect the list.\n   * 2. On a caching CI machine, scans can accidentally pick up files left behind from a previous build.\n   * 3. It's useful to have a centralized inventory of all projects and their important metadata.\n   */\n  \"projects\": [\n    {\n      \"packageName\": \"a\",\n      \"projectFolder\": \"packages/a\"\n    },\n    {\n      \"packageName\": \"b\",\n      \"projectFolder\": \"packages/b\"\n    }\n    // {\n    //   /**\n    //    * The NPM package name of the project (must match package.json)\n    //    */\n    //   \"packageName\": \"my-app\",\n    //\n    //   /**\n    //    * The path to the project folder, relative to the rush.json config file.\n    //    */\n    //   \"projectFolder\": \"apps/my-app\",\n    //\n    //   /**\n    //    * An optional category for usage in the \"browser-approved-packages.json\"\n    //    * and \"nonbrowser-approved-packages.json\" files.  The value must be one of the\n    //    * strings from the \"reviewCategories\" defined above.\n    //    */\n    //   \"reviewCategory\": \"production\",\n    //\n    //   /**\n    //    * A list of local projects that appear as devDependencies for this project, but cannot be\n    //    * locally linked because it would create a cyclic dependency; instead, the last published\n    //    * version will be installed in the Common folder.\n    //    */\n    //   \"cyclicDependencyProjects\": [\n    //     // \"my-toolchain\"\n    //   ],\n    //\n    //   /**\n    //    * If true, then this project will be ignored by the \"rush check\" command.\n    //    * The default value is false.\n    //    */\n    //   // \"skipRushCheck\": false,\n    //\n    //   /**\n    //    * A flag indicating that changes to this project will be published to npm, which affects\n    //    * the Rush change and publish workflows. The default value is false.\n    //    * NOTE: \"versionPolicyName\" and \"shouldPublish\" are alternatives; you cannot specify them both.\n    //    */\n    //   // \"shouldPublish\": false,\n    //\n    //   /**\n    //    * Facilitates postprocessing of a project's files prior to publishing.\n    //    *\n    //    * If specified, the \"publishFolder\" is the relative path to a subfolder of the project folder.\n    //    * The \"rush publish\" command will publish the subfolder instead of the project folder.  The subfolder\n    //    * must contain its own package.json file, which is typically a build output.\n    //    */\n    //   // \"publishFolder\": \"temp/publish\",\n    //\n    //   /**\n    //    * An optional version policy associated with the project.  Version policies are defined\n    //    * in \"version-policies.json\" file.  See the \"rush publish\" documentation for more info.\n    //    * NOTE: \"versionPolicyName\" and \"shouldPublish\" are alternatives; you cannot specify them both.\n    //    */\n    //   // \"versionPolicyName\": \"\"\n    // },\n    //\n    // {\n    //   \"packageName\": \"my-controls\",\n    //   \"projectFolder\": \"libraries/my-controls\",\n    //   \"reviewCategory\": \"production\"\n    // },\n    //\n    // {\n    //   \"packageName\": \"my-toolchain\",\n    //   \"projectFolder\": \"tools/my-toolchain\",\n    //   \"reviewCategory\": \"tools\"\n    // }\n  ]\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/fixtures/empty/rush.json",
    "content": "/**\n * This is the main configuration file for Rush.\n * For full documentation, please see https://rushjs.io\n */\n {\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json\",\n  /**\n   * (Required) This specifies the version of the Rush engine to be used in this repo.\n   * Rush's \"version selector\" feature ensures that the globally installed tool will\n   * behave like this release, regardless of which version is installed globally.\n   *\n   * The common/scripts/install-run-rush.js automation script also uses this version.\n   *\n   * NOTE: If you upgrade to a new major version of Rush, you should replace the \"v5\"\n   * path segment in the \"$schema\" field for all your Rush config files.  This will ensure\n   * correct error-underlining and tab-completion for editors such as VS Code.\n   */\n  \"rushVersion\": \"5.56.0\",\n  /**\n   * The next field selects which package manager should be installed and determines its version.\n   * Rush installs its own local copy of the package manager to ensure that your build process\n   * is fully isolated from whatever tools are present in the local environment.\n   *\n   * Specify one of: \"pnpmVersion\", \"npmVersion\", or \"yarnVersion\".  See the Rush documentation\n   * for details about these alternatives.\n   */\n  \"pnpmVersion\": \"6.20.3\",\n  // \"npmVersion\": \"6.14.15\",\n  // \"yarnVersion\": \"1.9.4\",\n  /**\n   * Options that are only used when the PNPM package manager is selected\n   */\n  \"pnpmOptions\": {\n    /**\n     * Specifies the location of the PNPM store.  There are two possible values:\n     *\n     * - \"local\" - use the \"pnpm-store\" folder in the current configured temp folder:\n     *   \"common/temp/pnpm-store\" by default.\n     * - \"global\" - use PNPM's global store, which has the benefit of being shared\n     *    across multiple repo folders, but the disadvantage of less isolation for builds\n     *    (e.g. bugs or incompatibilities when two repos use different releases of PNPM)\n     *\n     * RUSH_PNPM_STORE_PATH will override the directory that will be used as the store\n     *\n     * In all cases, the store path will be overridden by the environment variable RUSH_PNPM_STORE_PATH.\n     *\n     * The default value is \"local\".\n     */\n    // \"pnpmStore\": \"local\",\n    /**\n     * If true, then Rush will add the \"--strict-peer-dependencies\" option when invoking PNPM.\n     * This causes \"rush install\" to fail if there are unsatisfied peer dependencies, which is\n     * an invalid state that can cause build failures or incompatible dependency versions.\n     * (For historical reasons, JavaScript package managers generally do not treat this invalid\n     * state as an error.)\n     *\n     * The default value is false to avoid legacy compatibility issues.\n     * It is strongly recommended to set strictPeerDependencies=true.\n     */\n    // \"strictPeerDependencies\": true,\n    /**\n     * Configures the strategy used to select versions during installation.\n     *\n     * This feature requires PNPM version 3.1 or newer.  It corresponds to the \"--resolution-strategy\" command-line\n     * option for PNPM.  Possible values are \"fast\" and \"fewer-dependencies\".  PNPM's default is \"fast\", but this may\n     * be incompatible with certain packages, for example the \"@types\" packages from DefinitelyTyped.  Rush's default\n     * is \"fewer-dependencies\", which causes PNPM to avoid installing a newer version if an already installed version\n     * can be reused; this is more similar to NPM's algorithm.\n     *\n     * After modifying this field, it's recommended to run \"rush update --full\" so that the package manager\n     * will recalculate all version selections.\n     */\n    // \"resolutionStrategy\": \"fast\",\n    /**\n     * If true, then `rush install` will report an error if manual modifications\n     * were made to the PNPM shrinkwrap file without running \"rush update\" afterwards.\n     *\n     * This feature protects against accidental inconsistencies that may be introduced\n     * if the PNPM shrinkwrap file (\"pnpm-lock.yaml\") is manually edited.  When this\n     * feature is enabled, \"rush update\" will append a hash to the file as a YAML comment,\n     * and then \"rush update\" and \"rush install\" will validate the hash.  Note that this does not prohibit\n     * manual modifications, but merely requires \"rush update\" be run\n     * afterwards, ensuring that PNPM can report or repair any potential inconsistencies.\n     *\n     * To temporarily disable this validation when invoking \"rush install\", use the\n     * \"--bypass-policy\" command-line parameter.\n     *\n     * The default value is false.\n     */\n    // \"preventManualShrinkwrapChanges\": true,\n    /**\n     * If true, then `rush install` will use the PNPM workspaces feature to perform the\n     * install.\n     *\n     * This feature uses PNPM to perform the entire monorepo install. When using workspaces, Rush will\n     * generate a \"pnpm-workspace.yaml\" file referencing all local projects to install. Rush will\n     * also generate a \"pnpmfile.js\" which is used to provide preferred versions support. When install\n     * is run, this pnpmfile will be used to replace dependency version ranges with a smaller subset\n     * of the original range. If the preferred version is not fully a subset of the original version\n     * range, it will be left as-is. After this, the pnpmfile.js provided in the repository (if one\n     * exists) will be called to further modify package dependencies.\n     *\n     * This option is experimental. The default value is false.\n     */\n    // \"useWorkspaces\": true\n  },\n  /**\n   * Older releases of the Node.js engine may be missing features required by your system.\n   * Other releases may have bugs.  In particular, the \"latest\" version will not be a\n   * Long Term Support (LTS) version and is likely to have regressions.\n   *\n   * Specify a SemVer range to ensure developers use a Node.js version that is appropriate\n   * for your repo.\n   *\n   * LTS schedule: https://nodejs.org/en/about/releases/\n   * LTS versions: https://nodejs.org/en/download/releases/\n   */\n  \"nodeSupportedVersionRange\": \">=16.9.0 <17.0.0\",\n  /**\n   * Odd-numbered major versions of Node.js are experimental.  Even-numbered releases\n   * spend six months in a stabilization period before the first Long Term Support (LTS) version.\n   * For example, 8.9.0 was the first LTS version of Node.js 8.  Pre-LTS versions are not recommended\n   * for production usage because they frequently have bugs.  They may cause Rush itself\n   * to malfunction.\n   *\n   * Rush normally prints a warning if it detects a pre-LTS Node.js version.  If you are testing\n   * pre-LTS versions in preparation for supporting the first LTS version, you can use this setting\n   * to disable Rush's warning.\n   */\n  // \"suppressNodeLtsWarning\": false,\n  /**\n   * If you would like the version specifiers for your dependencies to be consistent, then\n   * uncomment this line. This is effectively similar to running \"rush check\" before any\n   * of the following commands:\n   *\n   *   rush install, rush update, rush link, rush version, rush publish\n   *\n   * In some cases you may want this turned on, but need to allow certain packages to use a different\n   * version. In those cases, you will need to add an entry to the \"allowedAlternativeVersions\"\n   * section of the common-versions.json.\n   */\n  // \"ensureConsistentVersions\": true,\n  /**\n   * Large monorepos can become intimidating for newcomers if project folder paths don't follow\n   * a consistent and recognizable pattern.  When the system allows nested folder trees,\n   * we've found that teams will often use subfolders to create islands that isolate\n   * their work from others (\"shipping the org\").  This hinders collaboration and code sharing.\n   *\n   * The Rush developers recommend a \"category folder\" model, where buildable project folders\n   * must always be exactly two levels below the repo root.  The parent folder acts as the category.\n   * This provides a basic facility for grouping related projects (e.g. \"apps\", \"libraries\",\n   * \"tools\", \"prototypes\") while still encouraging teams to organize their projects into\n   * a unified taxonomy.  Limiting to 2 levels seems very restrictive at first, but if you have\n   * 20 categories and 20 projects in each category, this scheme can easily accommodate hundreds\n   * of projects.  In practice, you will find that the folder hierarchy needs to be rebalanced\n   * occasionally, but if that's painful, it's a warning sign that your development style may\n   * discourage refactoring.  Reorganizing the categories should be an enlightening discussion\n   * that brings people together, and maybe also identifies poor coding practices (e.g. file\n   * references that reach into other project's folders without using Node.js module resolution).\n   *\n   * The defaults are projectFolderMinDepth=1 and projectFolderMaxDepth=2.\n   *\n   * To remove these restrictions, you could set projectFolderMinDepth=1\n   * and set projectFolderMaxDepth to a large number.\n   */\n  // \"projectFolderMinDepth\": 2,\n  // \"projectFolderMaxDepth\": 2,\n  /**\n   * Today the npmjs.com registry enforces fairly strict naming rules for packages, but in the early\n   * days there was no standard and hardly any enforcement.  A few large legacy projects are still using\n   * nonstandard package names, and private registries sometimes allow it.  Set \"allowMostlyStandardPackageNames\"\n   * to true to relax Rush's enforcement of package names.  This allows upper case letters and in the future may\n   * relax other rules, however we want to minimize these exceptions.  Many popular tools use certain punctuation\n   * characters as delimiters, based on the assumption that they will never appear in a package name; thus if we relax\n   * the rules too much it is likely to cause very confusing malfunctions.\n   *\n   * The default value is false.\n   */\n  // \"allowMostlyStandardPackageNames\": true,\n  /**\n   * This feature helps you to review and approve new packages before they are introduced\n   * to your monorepo.  For example, you may be concerned about licensing, code quality,\n   * performance, or simply accumulating too many libraries with overlapping functionality.\n   * The approvals are tracked in two config files \"browser-approved-packages.json\"\n   * and \"nonbrowser-approved-packages.json\".  See the Rush documentation for details.\n   */\n  // \"approvedPackagesPolicy\": {\n  //   /**\n  //    * The review categories allow you to say for example \"This library is approved for usage\n  //    * in prototypes, but not in production code.\"\n  //    *\n  //    * Each project can be associated with one review category, by assigning the \"reviewCategory\" field\n  //    * in the \"projects\" section of rush.json.  The approval is then recorded in the files\n  //    * \"common/config/rush/browser-approved-packages.json\" and \"nonbrowser-approved-packages.json\"\n  //    * which are automatically generated during \"rush update\".\n  //    *\n  //    * Designate categories with whatever granularity is appropriate for your review process,\n  //    * or you could just have a single category called \"default\".\n  //    */\n  //   \"reviewCategories\": [\n  //     // Some example categories:\n  //     \"production\", // projects that ship to production\n  //     \"tools\",      // non-shipping projects that are part of the developer toolchain\n  //     \"prototypes\"  // experiments that should mostly be ignored by the review process\n  //   ],\n  //\n  //   /**\n  //    * A list of NPM package scopes that will be excluded from review.\n  //    * We recommend to exclude TypeScript typings (the \"@types\" scope), because\n  //    * if the underlying package was already approved, this would imply that the typings\n  //    * are also approved.\n  //    */\n  //   // \"ignoredNpmScopes\": [\"@types\"]\n  // },\n  /**\n   * If you use Git as your version control system, this section has some additional\n   * optional features you can use.\n   */\n  \"gitPolicy\": {\n    /**\n     * Work at a big company?  Tired of finding Git commits at work with unprofessional Git\n     * emails such as \"beer-lover@my-college.edu\"?  Rush can validate people's Git email address\n     * before they get started.\n     *\n     * Define a list of regular expressions describing allowable e-mail patterns for Git commits.\n     * They are case-insensitive anchored JavaScript RegExps.  Example: \".*@example\\.com\"\n     *\n     * IMPORTANT: Because these are regular expressions encoded as JSON string literals,\n     * RegExp escapes need two backslashes, and ordinary periods should be \"\\\\.\".\n     */\n    // \"allowedEmailRegExps\": [\n    //   \"[^@]+@users\\\\.noreply\\\\.github\\\\.com\",\n    //   \"travis@example\\\\.org\"\n    // ],\n    /**\n     * When Rush reports that the address is malformed, the notice can include an example\n     * of a recommended email.  Make sure it conforms to one of the allowedEmailRegExps\n     * expressions.\n     */\n    // \"sampleEmail\": \"mrexample@users.noreply.github.com\",\n    /**\n     * The commit message to use when committing changes during 'rush publish'.\n     *\n     * For example, if you want to prevent these commits from triggering a CI build,\n     * you might configure your system's trigger to look for a special string such as \"[skip-ci]\"\n     * in the commit message, and then customize Rush's message to contain that string.\n     */\n    \"versionBumpCommitMessage\": \"chore: bump versions [skip ci]\",\n    /**\n     * The commit message to use when committing changes during 'rush version'.\n     *\n     * For example, if you want to prevent these commits from triggering a CI build,\n     * you might configure your system's trigger to look for a special string such as \"[skip-ci]\"\n     * in the commit message, and then customize Rush's message to contain that string.\n     */\n    \"changeLogUpdateCommitMessage\": \"docs: update changelogs [skip ci]\"\n  },\n  \"repository\": {\n    /**\n     * The URL of this Git repository, used by \"rush change\" to determine the base branch for your PR.\n     *\n     * The \"rush change\" command needs to determine which files are affected by your PR diff.\n     * If you merged or cherry-picked commits from the master branch into your PR branch, those commits\n     * should be excluded from this diff (since they belong to some other PR).  In order to do that,\n     * Rush needs to know where to find the base branch for your PR.  This information cannot be\n     * determined from Git alone, since the \"pull request\" feature is not a Git concept.  Ideally\n     * Rush would use a vendor-specific protocol to query the information from GitHub, Azure DevOps, etc.\n     * But to keep things simple, \"rush change\" simply assumes that your PR is against the \"master\" branch\n     * of the Git remote indicated by the repository.url setting in rush.json.  If you are working in\n     * a GitHub \"fork\" of the real repo, this setting will be different from the repository URL of your\n     * your PR branch, and in this situation \"rush change\" will also automatically invoke \"git fetch\"\n     * to retrieve the latest activity for the remote master branch.\n     */\n    /** TODO: CHANGE THIS **/\n    \"url\": \"https://github.com/microsoft/rush-example\",\n    /**\n     * The default branch name. This tells \"rush change\" which remote branch to compare against.\n     * The default value is \"master\"\n     */\n    \"defaultBranch\": \"master\",\n    /**\n     * The default remote. This tells \"rush change\" which remote to compare against if the remote URL is\n     * not set or if a remote matching the provided remote URL is not found.\n     */\n    \"defaultRemote\": \"origin\"\n  },\n  /**\n   * Event hooks are customized script actions that Rush executes when specific events occur\n   */\n  \"eventHooks\": {\n    /**\n     * The list of shell commands to run before the Rush installation starts\n     */\n    \"preRushInstall\": [\n      // \"common/scripts/pre-rush-install.js\"\n    ],\n    /**\n     * The list of shell commands to run after the Rush installation finishes\n     */\n    \"postRushInstall\": [],\n    /**\n     * The list of shell commands to run before the Rush build command starts\n     */\n    \"preRushBuild\": [],\n    /**\n     * The list of shell commands to run after the Rush build command finishes\n     */\n    \"postRushBuild\": []\n  },\n  /**\n   * Installation variants allow you to maintain a parallel set of configuration files that can be\n   * used to build the entire monorepo with an alternate set of dependencies.  For example, suppose\n   * you upgrade all your projects to use a new release of an important framework, but during a transition period\n   * you intend to maintain compatibility with the old release.  In this situation, you probably want your\n   * CI validation to build the entire repo twice: once with the old release, and once with the new release.\n   *\n   * Rush \"installation variants\" correspond to sets of config files located under this folder:\n   *\n   *   common/config/rush/variants/<variant_name>\n   *\n   * The variant folder can contain an alternate common-versions.json file.  Its \"preferredVersions\" field can be used\n   * to select older versions of dependencies (within a loose SemVer range specified in your package.json files).\n   * To install a variant, run \"rush install --variant <variant_name>\".\n   *\n   * For more details and instructions, see this article:  https://rushjs.io/pages/advanced/installation_variants/\n   */\n  \"variants\": [\n    // {\n    //   /**\n    //    * The folder name for this variant.\n    //    */\n    //   \"variantName\": \"old-sdk\",\n    //\n    //   /**\n    //    * An informative description\n    //    */\n    //   \"description\": \"Build this repo using the previous release of the SDK\"\n    // }\n  ],\n  /**\n   * Rush can collect anonymous telemetry about everyday developer activity such as\n   * success/failure of installs, builds, and other operations.  You can use this to identify\n   * problems with your toolchain or Rush itself.  THIS TELEMETRY IS NOT SHARED WITH MICROSOFT.\n   * It is written into JSON files in the common/temp folder.  It's up to you to write scripts\n   * that read these JSON files and do something with them.  These scripts are typically registered\n   * in the \"eventHooks\" section.\n   */\n  // \"telemetryEnabled\": false,\n  /**\n   * Allows creation of hotfix changes. This feature is experimental so it is disabled by default.\n   * If this is set, 'rush change' only allows a 'hotfix' change type to be specified. This change type\n   * will be used when publishing subsequent changes from the monorepo.\n   */\n  // \"hotfixChangeEnabled\": false,\n  /**\n   * (Required) This is the inventory of projects to be managed by Rush.\n   *\n   * Rush does not automatically scan for projects using wildcards, for a few reasons:\n   * 1. Depth-first scans are expensive, particularly when tools need to repeatedly collect the list.\n   * 2. On a caching CI machine, scans can accidentally pick up files left behind from a previous build.\n   * 3. It's useful to have a centralized inventory of all projects and their important metadata.\n   */\n  \"projects\": [\n    // {\n    //   /**\n    //    * The NPM package name of the project (must match package.json)\n    //    */\n    //   \"packageName\": \"my-app\",\n    //\n    //   /**\n    //    * The path to the project folder, relative to the rush.json config file.\n    //    */\n    //   \"projectFolder\": \"apps/my-app\",\n    //\n    //   /**\n    //    * An optional category for usage in the \"browser-approved-packages.json\"\n    //    * and \"nonbrowser-approved-packages.json\" files.  The value must be one of the\n    //    * strings from the \"reviewCategories\" defined above.\n    //    */\n    //   \"reviewCategory\": \"production\",\n    //\n    //   /**\n    //    * A list of local projects that appear as devDependencies for this project, but cannot be\n    //    * locally linked because it would create a cyclic dependency; instead, the last published\n    //    * version will be installed in the Common folder.\n    //    */\n    //   \"cyclicDependencyProjects\": [\n    //     // \"my-toolchain\"\n    //   ],\n    //\n    //   /**\n    //    * If true, then this project will be ignored by the \"rush check\" command.\n    //    * The default value is false.\n    //    */\n    //   // \"skipRushCheck\": false,\n    //\n    //   /**\n    //    * A flag indicating that changes to this project will be published to npm, which affects\n    //    * the Rush change and publish workflows. The default value is false.\n    //    * NOTE: \"versionPolicyName\" and \"shouldPublish\" are alternatives; you cannot specify them both.\n    //    */\n    //   // \"shouldPublish\": false,\n    //\n    //   /**\n    //    * Facilitates postprocessing of a project's files prior to publishing.\n    //    *\n    //    * If specified, the \"publishFolder\" is the relative path to a subfolder of the project folder.\n    //    * The \"rush publish\" command will publish the subfolder instead of the project folder.  The subfolder\n    //    * must contain its own package.json file, which is typically a build output.\n    //    */\n    //   // \"publishFolder\": \"temp/publish\",\n    //\n    //   /**\n    //    * An optional version policy associated with the project.  Version policies are defined\n    //    * in \"version-policies.json\" file.  See the \"rush publish\" documentation for more info.\n    //    * NOTE: \"versionPolicyName\" and \"shouldPublish\" are alternatives; you cannot specify them both.\n    //    */\n    //   // \"versionPolicyName\": \"\"\n    // },\n    //\n    // {\n    //   \"packageName\": \"my-controls\",\n    //   \"projectFolder\": \"libraries/my-controls\",\n    //   \"reviewCategory\": \"production\"\n    // },\n    //\n    // {\n    //   \"packageName\": \"my-toolchain\",\n    //   \"projectFolder\": \"tools/my-toolchain\",\n    //   \"reviewCategory\": \"tools\"\n    // }\n  ]\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/fixtures/scoped/@packages/a/package.json",
    "content": "{\n  \"name\": \"@packages/a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/fixtures/scoped/@packages/b/package.json",
    "content": "{\n  \"name\": \"@packages/b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/fixtures/scoped/rush.json",
    "content": "/**\n * This is the main configuration file for Rush.\n * For full documentation, please see https://rushjs.io\n */\n {\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json\",\n  /**\n   * (Required) This specifies the version of the Rush engine to be used in this repo.\n   * Rush's \"version selector\" feature ensures that the globally installed tool will\n   * behave like this release, regardless of which version is installed globally.\n   *\n   * The common/scripts/install-run-rush.js automation script also uses this version.\n   *\n   * NOTE: If you upgrade to a new major version of Rush, you should replace the \"v5\"\n   * path segment in the \"$schema\" field for all your Rush config files.  This will ensure\n   * correct error-underlining and tab-completion for editors such as VS Code.\n   */\n  \"rushVersion\": \"5.56.0\",\n  /**\n   * The next field selects which package manager should be installed and determines its version.\n   * Rush installs its own local copy of the package manager to ensure that your build process\n   * is fully isolated from whatever tools are present in the local environment.\n   *\n   * Specify one of: \"pnpmVersion\", \"npmVersion\", or \"yarnVersion\".  See the Rush documentation\n   * for details about these alternatives.\n   */\n  \"pnpmVersion\": \"6.20.3\",\n  // \"npmVersion\": \"6.14.15\",\n  // \"yarnVersion\": \"1.9.4\",\n  /**\n   * Options that are only used when the PNPM package manager is selected\n   */\n  \"pnpmOptions\": {\n    /**\n     * Specifies the location of the PNPM store.  There are two possible values:\n     *\n     * - \"local\" - use the \"pnpm-store\" folder in the current configured temp folder:\n     *   \"common/temp/pnpm-store\" by default.\n     * - \"global\" - use PNPM's global store, which has the benefit of being shared\n     *    across multiple repo folders, but the disadvantage of less isolation for builds\n     *    (e.g. bugs or incompatibilities when two repos use different releases of PNPM)\n     *\n     * RUSH_PNPM_STORE_PATH will override the directory that will be used as the store\n     *\n     * In all cases, the store path will be overridden by the environment variable RUSH_PNPM_STORE_PATH.\n     *\n     * The default value is \"local\".\n     */\n    // \"pnpmStore\": \"local\",\n    /**\n     * If true, then Rush will add the \"--strict-peer-dependencies\" option when invoking PNPM.\n     * This causes \"rush install\" to fail if there are unsatisfied peer dependencies, which is\n     * an invalid state that can cause build failures or incompatible dependency versions.\n     * (For historical reasons, JavaScript package managers generally do not treat this invalid\n     * state as an error.)\n     *\n     * The default value is false to avoid legacy compatibility issues.\n     * It is strongly recommended to set strictPeerDependencies=true.\n     */\n    // \"strictPeerDependencies\": true,\n    /**\n     * Configures the strategy used to select versions during installation.\n     *\n     * This feature requires PNPM version 3.1 or newer.  It corresponds to the \"--resolution-strategy\" command-line\n     * option for PNPM.  Possible values are \"fast\" and \"fewer-dependencies\".  PNPM's default is \"fast\", but this may\n     * be incompatible with certain packages, for example the \"@types\" packages from DefinitelyTyped.  Rush's default\n     * is \"fewer-dependencies\", which causes PNPM to avoid installing a newer version if an already installed version\n     * can be reused; this is more similar to NPM's algorithm.\n     *\n     * After modifying this field, it's recommended to run \"rush update --full\" so that the package manager\n     * will recalculate all version selections.\n     */\n    // \"resolutionStrategy\": \"fast\",\n    /**\n     * If true, then `rush install` will report an error if manual modifications\n     * were made to the PNPM shrinkwrap file without running \"rush update\" afterwards.\n     *\n     * This feature protects against accidental inconsistencies that may be introduced\n     * if the PNPM shrinkwrap file (\"pnpm-lock.yaml\") is manually edited.  When this\n     * feature is enabled, \"rush update\" will append a hash to the file as a YAML comment,\n     * and then \"rush update\" and \"rush install\" will validate the hash.  Note that this does not prohibit\n     * manual modifications, but merely requires \"rush update\" be run\n     * afterwards, ensuring that PNPM can report or repair any potential inconsistencies.\n     *\n     * To temporarily disable this validation when invoking \"rush install\", use the\n     * \"--bypass-policy\" command-line parameter.\n     *\n     * The default value is false.\n     */\n    // \"preventManualShrinkwrapChanges\": true,\n    /**\n     * If true, then `rush install` will use the PNPM workspaces feature to perform the\n     * install.\n     *\n     * This feature uses PNPM to perform the entire monorepo install. When using workspaces, Rush will\n     * generate a \"pnpm-workspace.yaml\" file referencing all local projects to install. Rush will\n     * also generate a \"pnpmfile.js\" which is used to provide preferred versions support. When install\n     * is run, this pnpmfile will be used to replace dependency version ranges with a smaller subset\n     * of the original range. If the preferred version is not fully a subset of the original version\n     * range, it will be left as-is. After this, the pnpmfile.js provided in the repository (if one\n     * exists) will be called to further modify package dependencies.\n     *\n     * This option is experimental. The default value is false.\n     */\n    // \"useWorkspaces\": true\n  },\n  /**\n   * Older releases of the Node.js engine may be missing features required by your system.\n   * Other releases may have bugs.  In particular, the \"latest\" version will not be a\n   * Long Term Support (LTS) version and is likely to have regressions.\n   *\n   * Specify a SemVer range to ensure developers use a Node.js version that is appropriate\n   * for your repo.\n   *\n   * LTS schedule: https://nodejs.org/en/about/releases/\n   * LTS versions: https://nodejs.org/en/download/releases/\n   */\n  \"nodeSupportedVersionRange\": \">=16.9.0 <17.0.0\",\n  /**\n   * Odd-numbered major versions of Node.js are experimental.  Even-numbered releases\n   * spend six months in a stabilization period before the first Long Term Support (LTS) version.\n   * For example, 8.9.0 was the first LTS version of Node.js 8.  Pre-LTS versions are not recommended\n   * for production usage because they frequently have bugs.  They may cause Rush itself\n   * to malfunction.\n   *\n   * Rush normally prints a warning if it detects a pre-LTS Node.js version.  If you are testing\n   * pre-LTS versions in preparation for supporting the first LTS version, you can use this setting\n   * to disable Rush's warning.\n   */\n  // \"suppressNodeLtsWarning\": false,\n  /**\n   * If you would like the version specifiers for your dependencies to be consistent, then\n   * uncomment this line. This is effectively similar to running \"rush check\" before any\n   * of the following commands:\n   *\n   *   rush install, rush update, rush link, rush version, rush publish\n   *\n   * In some cases you may want this turned on, but need to allow certain packages to use a different\n   * version. In those cases, you will need to add an entry to the \"allowedAlternativeVersions\"\n   * section of the common-versions.json.\n   */\n  // \"ensureConsistentVersions\": true,\n  /**\n   * Large monorepos can become intimidating for newcomers if project folder paths don't follow\n   * a consistent and recognizable pattern.  When the system allows nested folder trees,\n   * we've found that teams will often use subfolders to create islands that isolate\n   * their work from others (\"shipping the org\").  This hinders collaboration and code sharing.\n   *\n   * The Rush developers recommend a \"category folder\" model, where buildable project folders\n   * must always be exactly two levels below the repo root.  The parent folder acts as the category.\n   * This provides a basic facility for grouping related projects (e.g. \"apps\", \"libraries\",\n   * \"tools\", \"prototypes\") while still encouraging teams to organize their projects into\n   * a unified taxonomy.  Limiting to 2 levels seems very restrictive at first, but if you have\n   * 20 categories and 20 projects in each category, this scheme can easily accommodate hundreds\n   * of projects.  In practice, you will find that the folder hierarchy needs to be rebalanced\n   * occasionally, but if that's painful, it's a warning sign that your development style may\n   * discourage refactoring.  Reorganizing the categories should be an enlightening discussion\n   * that brings people together, and maybe also identifies poor coding practices (e.g. file\n   * references that reach into other project's folders without using Node.js module resolution).\n   *\n   * The defaults are projectFolderMinDepth=1 and projectFolderMaxDepth=2.\n   *\n   * To remove these restrictions, you could set projectFolderMinDepth=1\n   * and set projectFolderMaxDepth to a large number.\n   */\n  // \"projectFolderMinDepth\": 2,\n  // \"projectFolderMaxDepth\": 2,\n  /**\n   * Today the npmjs.com registry enforces fairly strict naming rules for packages, but in the early\n   * days there was no standard and hardly any enforcement.  A few large legacy projects are still using\n   * nonstandard package names, and private registries sometimes allow it.  Set \"allowMostlyStandardPackageNames\"\n   * to true to relax Rush's enforcement of package names.  This allows upper case letters and in the future may\n   * relax other rules, however we want to minimize these exceptions.  Many popular tools use certain punctuation\n   * characters as delimiters, based on the assumption that they will never appear in a package name; thus if we relax\n   * the rules too much it is likely to cause very confusing malfunctions.\n   *\n   * The default value is false.\n   */\n  // \"allowMostlyStandardPackageNames\": true,\n  /**\n   * This feature helps you to review and approve new packages before they are introduced\n   * to your monorepo.  For example, you may be concerned about licensing, code quality,\n   * performance, or simply accumulating too many libraries with overlapping functionality.\n   * The approvals are tracked in two config files \"browser-approved-packages.json\"\n   * and \"nonbrowser-approved-packages.json\".  See the Rush documentation for details.\n   */\n  // \"approvedPackagesPolicy\": {\n  //   /**\n  //    * The review categories allow you to say for example \"This library is approved for usage\n  //    * in prototypes, but not in production code.\"\n  //    *\n  //    * Each project can be associated with one review category, by assigning the \"reviewCategory\" field\n  //    * in the \"projects\" section of rush.json.  The approval is then recorded in the files\n  //    * \"common/config/rush/browser-approved-packages.json\" and \"nonbrowser-approved-packages.json\"\n  //    * which are automatically generated during \"rush update\".\n  //    *\n  //    * Designate categories with whatever granularity is appropriate for your review process,\n  //    * or you could just have a single category called \"default\".\n  //    */\n  //   \"reviewCategories\": [\n  //     // Some example categories:\n  //     \"production\", // projects that ship to production\n  //     \"tools\",      // non-shipping projects that are part of the developer toolchain\n  //     \"prototypes\"  // experiments that should mostly be ignored by the review process\n  //   ],\n  //\n  //   /**\n  //    * A list of NPM package scopes that will be excluded from review.\n  //    * We recommend to exclude TypeScript typings (the \"@types\" scope), because\n  //    * if the underlying package was already approved, this would imply that the typings\n  //    * are also approved.\n  //    */\n  //   // \"ignoredNpmScopes\": [\"@types\"]\n  // },\n  /**\n   * If you use Git as your version control system, this section has some additional\n   * optional features you can use.\n   */\n  \"gitPolicy\": {\n    /**\n     * Work at a big company?  Tired of finding Git commits at work with unprofessional Git\n     * emails such as \"beer-lover@my-college.edu\"?  Rush can validate people's Git email address\n     * before they get started.\n     *\n     * Define a list of regular expressions describing allowable e-mail patterns for Git commits.\n     * They are case-insensitive anchored JavaScript RegExps.  Example: \".*@example\\.com\"\n     *\n     * IMPORTANT: Because these are regular expressions encoded as JSON string literals,\n     * RegExp escapes need two backslashes, and ordinary periods should be \"\\\\.\".\n     */\n    // \"allowedEmailRegExps\": [\n    //   \"[^@]+@users\\\\.noreply\\\\.github\\\\.com\",\n    //   \"travis@example\\\\.org\"\n    // ],\n    /**\n     * When Rush reports that the address is malformed, the notice can include an example\n     * of a recommended email.  Make sure it conforms to one of the allowedEmailRegExps\n     * expressions.\n     */\n    // \"sampleEmail\": \"mrexample@users.noreply.github.com\",\n    /**\n     * The commit message to use when committing changes during 'rush publish'.\n     *\n     * For example, if you want to prevent these commits from triggering a CI build,\n     * you might configure your system's trigger to look for a special string such as \"[skip-ci]\"\n     * in the commit message, and then customize Rush's message to contain that string.\n     */\n    \"versionBumpCommitMessage\": \"chore: bump versions [skip ci]\",\n    /**\n     * The commit message to use when committing changes during 'rush version'.\n     *\n     * For example, if you want to prevent these commits from triggering a CI build,\n     * you might configure your system's trigger to look for a special string such as \"[skip-ci]\"\n     * in the commit message, and then customize Rush's message to contain that string.\n     */\n    \"changeLogUpdateCommitMessage\": \"docs: update changelogs [skip ci]\"\n  },\n  \"repository\": {\n    /**\n     * The URL of this Git repository, used by \"rush change\" to determine the base branch for your PR.\n     *\n     * The \"rush change\" command needs to determine which files are affected by your PR diff.\n     * If you merged or cherry-picked commits from the master branch into your PR branch, those commits\n     * should be excluded from this diff (since they belong to some other PR).  In order to do that,\n     * Rush needs to know where to find the base branch for your PR.  This information cannot be\n     * determined from Git alone, since the \"pull request\" feature is not a Git concept.  Ideally\n     * Rush would use a vendor-specific protocol to query the information from GitHub, Azure DevOps, etc.\n     * But to keep things simple, \"rush change\" simply assumes that your PR is against the \"master\" branch\n     * of the Git remote indicated by the repository.url setting in rush.json.  If you are working in\n     * a GitHub \"fork\" of the real repo, this setting will be different from the repository URL of your\n     * your PR branch, and in this situation \"rush change\" will also automatically invoke \"git fetch\"\n     * to retrieve the latest activity for the remote master branch.\n     */\n    /** TODO: CHANGE THIS **/\n    \"url\": \"https://github.com/microsoft/rush-example\",\n    /**\n     * The default branch name. This tells \"rush change\" which remote branch to compare against.\n     * The default value is \"master\"\n     */\n    \"defaultBranch\": \"master\",\n    /**\n     * The default remote. This tells \"rush change\" which remote to compare against if the remote URL is\n     * not set or if a remote matching the provided remote URL is not found.\n     */\n    \"defaultRemote\": \"origin\"\n  },\n  /**\n   * Event hooks are customized script actions that Rush executes when specific events occur\n   */\n  \"eventHooks\": {\n    /**\n     * The list of shell commands to run before the Rush installation starts\n     */\n    \"preRushInstall\": [\n      // \"common/scripts/pre-rush-install.js\"\n    ],\n    /**\n     * The list of shell commands to run after the Rush installation finishes\n     */\n    \"postRushInstall\": [],\n    /**\n     * The list of shell commands to run before the Rush build command starts\n     */\n    \"preRushBuild\": [],\n    /**\n     * The list of shell commands to run after the Rush build command finishes\n     */\n    \"postRushBuild\": []\n  },\n  /**\n   * Installation variants allow you to maintain a parallel set of configuration files that can be\n   * used to build the entire monorepo with an alternate set of dependencies.  For example, suppose\n   * you upgrade all your projects to use a new release of an important framework, but during a transition period\n   * you intend to maintain compatibility with the old release.  In this situation, you probably want your\n   * CI validation to build the entire repo twice: once with the old release, and once with the new release.\n   *\n   * Rush \"installation variants\" correspond to sets of config files located under this folder:\n   *\n   *   common/config/rush/variants/<variant_name>\n   *\n   * The variant folder can contain an alternate common-versions.json file.  Its \"preferredVersions\" field can be used\n   * to select older versions of dependencies (within a loose SemVer range specified in your package.json files).\n   * To install a variant, run \"rush install --variant <variant_name>\".\n   *\n   * For more details and instructions, see this article:  https://rushjs.io/pages/advanced/installation_variants/\n   */\n  \"variants\": [\n    // {\n    //   /**\n    //    * The folder name for this variant.\n    //    */\n    //   \"variantName\": \"old-sdk\",\n    //\n    //   /**\n    //    * An informative description\n    //    */\n    //   \"description\": \"Build this repo using the previous release of the SDK\"\n    // }\n  ],\n  /**\n   * Rush can collect anonymous telemetry about everyday developer activity such as\n   * success/failure of installs, builds, and other operations.  You can use this to identify\n   * problems with your toolchain or Rush itself.  THIS TELEMETRY IS NOT SHARED WITH MICROSOFT.\n   * It is written into JSON files in the common/temp folder.  It's up to you to write scripts\n   * that read these JSON files and do something with them.  These scripts are typically registered\n   * in the \"eventHooks\" section.\n   */\n  // \"telemetryEnabled\": false,\n  /**\n   * Allows creation of hotfix changes. This feature is experimental so it is disabled by default.\n   * If this is set, 'rush change' only allows a 'hotfix' change type to be specified. This change type\n   * will be used when publishing subsequent changes from the monorepo.\n   */\n  // \"hotfixChangeEnabled\": false,\n  /**\n   * (Required) This is the inventory of projects to be managed by Rush.\n   *\n   * Rush does not automatically scan for projects using wildcards, for a few reasons:\n   * 1. Depth-first scans are expensive, particularly when tools need to repeatedly collect the list.\n   * 2. On a caching CI machine, scans can accidentally pick up files left behind from a previous build.\n   * 3. It's useful to have a centralized inventory of all projects and their important metadata.\n   */\n  \"projects\": [\n    {\n      \"packageName\": \"@packages/a\",\n      \"projectFolder\": \"@packages/a\"\n    },\n    {\n      \"packageName\": \"@packages/b\",\n      \"projectFolder\": \"@packages/b\"\n    }\n    // {\n    //   /**\n    //    * The NPM package name of the project (must match package.json)\n    //    */\n    //   \"packageName\": \"my-app\",\n    //\n    //   /**\n    //    * The path to the project folder, relative to the rush.json config file.\n    //    */\n    //   \"projectFolder\": \"apps/my-app\",\n    //\n    //   /**\n    //    * An optional category for usage in the \"browser-approved-packages.json\"\n    //    * and \"nonbrowser-approved-packages.json\" files.  The value must be one of the\n    //    * strings from the \"reviewCategories\" defined above.\n    //    */\n    //   \"reviewCategory\": \"production\",\n    //\n    //   /**\n    //    * A list of local projects that appear as devDependencies for this project, but cannot be\n    //    * locally linked because it would create a cyclic dependency; instead, the last published\n    //    * version will be installed in the Common folder.\n    //    */\n    //   \"cyclicDependencyProjects\": [\n    //     // \"my-toolchain\"\n    //   ],\n    //\n    //   /**\n    //    * If true, then this project will be ignored by the \"rush check\" command.\n    //    * The default value is false.\n    //    */\n    //   // \"skipRushCheck\": false,\n    //\n    //   /**\n    //    * A flag indicating that changes to this project will be published to npm, which affects\n    //    * the Rush change and publish workflows. The default value is false.\n    //    * NOTE: \"versionPolicyName\" and \"shouldPublish\" are alternatives; you cannot specify them both.\n    //    */\n    //   // \"shouldPublish\": false,\n    //\n    //   /**\n    //    * Facilitates postprocessing of a project's files prior to publishing.\n    //    *\n    //    * If specified, the \"publishFolder\" is the relative path to a subfolder of the project folder.\n    //    * The \"rush publish\" command will publish the subfolder instead of the project folder.  The subfolder\n    //    * must contain its own package.json file, which is typically a build output.\n    //    */\n    //   // \"publishFolder\": \"temp/publish\",\n    //\n    //   /**\n    //    * An optional version policy associated with the project.  Version policies are defined\n    //    * in \"version-policies.json\" file.  See the \"rush publish\" documentation for more info.\n    //    * NOTE: \"versionPolicyName\" and \"shouldPublish\" are alternatives; you cannot specify them both.\n    //    */\n    //   // \"versionPolicyName\": \"\"\n    // },\n    //\n    // {\n    //   \"packageName\": \"my-controls\",\n    //   \"projectFolder\": \"libraries/my-controls\",\n    //   \"reviewCategory\": \"production\"\n    // },\n    //\n    // {\n    //   \"packageName\": \"my-toolchain\",\n    //   \"projectFolder\": \"tools/my-toolchain\",\n    //   \"reviewCategory\": \"tools\"\n    // }\n  ]\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/index.js",
    "content": "import Path from \"node:path\";\nimport fs from \"fs/promises\";\n\nimport jsonc from \"jsonc\";\n\nexport default {\n\tutils: { getPackages },\n\trules: {\n\t\t\"scope-enum\": (ctx) =>\n\t\t\tgetPackages(ctx).then((packages) => [2, \"always\", packages]),\n\t},\n};\n\nfunction getPackages(context) {\n\treturn Promise.resolve()\n\t\t.then(() => {\n\t\t\tconst ctx = context || {};\n\t\t\tconst cwd = ctx.cwd || process.cwd();\n\n\t\t\treturn fs\n\t\t\t\t.readFile(Path.join(cwd, \"rush.json\"), { encoding: \"utf8\" })\n\t\t\t\t.then((content) => jsonc.parse(content))\n\t\t\t\t.then(({ projects }) => projects)\n\t\t\t\t.catch(() => []);\n\t\t})\n\t\t.then((packages) => {\n\t\t\treturn packages\n\t\t\t\t.map((pkg) => pkg.packageName)\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.map((name) => (name.charAt(0) === \"@\" ? name.split(\"/\")[1] : name));\n\t\t});\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/index.test.js",
    "content": "import { test, expect } from \"vitest\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { npm } from \"@commitlint/test\";\n\nimport config from \"./index.js\";\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\ntest(\"exports rules key\", () => {\n\texpect(config).toHaveProperty(\"rules\");\n});\n\ntest(\"rules hold object\", () => {\n\texpect(config).toMatchObject({\n\t\trules: expect.any(Object),\n\t});\n});\n\ntest(\"rules contain scope-enum\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.anything(),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum is function\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.any(Function),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum does not throw for missing context\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tawait expect(fn()).resolves.toBeTruthy();\n});\n\ntest(\"scope-enum has expected severity\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [severity] = await fn();\n\texpect(severity).toBe(2);\n});\n\ntest(\"scope-enum has expected modifier\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [, modifier] = await fn();\n\texpect(modifier).toBe(\"always\");\n});\n\ntest(\"returns empty value for empty rush repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/empty\", __dirname);\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([]);\n});\n\ntest(\"returns expected value for basic rush repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/basic\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"a\", \"b\"]);\n});\n\ntest(\"returns expected value for scoped lerna repository\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/scoped\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\n\texpect(value).toEqual([\"a\", \"b\"]);\n});\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-rush-scopes\",\n  \"type\": \"module\",\n  \"version\": \"20.4.3\",\n  \"description\": \"Shareable commitlint config enforcing rush package and workspace names as scopes\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-rush-scopes\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"rush\"\n  ],\n  \"author\": {\n    \"name\": \"Alexander Vyzhanov\",\n    \"email\": \"lembdev@gmail.com\"\n  },\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"jsonc\": \"^2.0.0\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-rush-scopes/readme.md",
    "content": "# @commitlint/config-rush-scopes\n\nLint your rush project commits\n\nShareable `commitlint` config enforcing rush package and workspace names as scopes.\nUse with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli).\n\n## Getting started\n\n```sh\nnpm install --save-dev @commitlint/config-rush-scopes @commitlint/cli\necho \"export default {extends: ['@commitlint/config-rush-scopes']};\" > commitlint.config.js\n```\n\n## Examples\n\n```text\n❯ cat commitlint.config.js\n{\n  extends: ['@commitlint/config-rush-scopes']\n}\n\n❯ tree packages\n\npackages\n├── api\n├── app\n└── web\n\n❯ echo \"build(api): change something in api's build\" | commitlint\n⧗   input: build(api): change something in api's build\n✔   found 0 problems, 0 warnings\n\n❯ echo \"test(foo): this won't pass\" | commitlint\n⧗   input: test(foo): this won't pass\n✖   scope must be one of [api, app, web] [scope-enum]\n✖   found 1 problems, 0 warnings\n\n❯ echo \"ci: do some general maintenance\" | commitlint\n⧗   input: ci: do some general maintenance\n✔   found 0 problems, 0 warnings\n```\n\nConsult [Rules reference](https://commitlint.js.org/reference/rules) for a list of available rules.\n"
  },
  {
    "path": "@commitlint/config-validator/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/config-validator\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n### Features\n\n- **load:** accept functions as parser presets ([#2982](https://github.com/conventional-changelog/commitlint/issues/2982)) ([420e8d6](https://github.com/conventional-changelog/commitlint/commit/420e8d6a4d5663ade953272275a9e0fa7c5ddff0)), closes [#2964](https://github.com/conventional-changelog/commitlint/issues/2964) [#2964](https://github.com/conventional-changelog/commitlint/issues/2964)\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n### Features\n\n- config validation ([#2412](https://github.com/conventional-changelog/commitlint/issues/2412)) ([c717202](https://github.com/conventional-changelog/commitlint/commit/c7172022097b11f46b33617e4a94d751243c1049)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n"
  },
  {
    "path": "@commitlint/config-validator/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-validator\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"config validator for commitlint.config.js\",\n  \"main\": \"lib/validate.js\",\n  \"types\": \"lib/validate.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-import\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-validator\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"dependencies\": {\n    \"@commitlint/types\": \"^20.5.0\",\n    \"ajv\": \"^8.11.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-validator/src/__snapshots__/validate.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`validation should fail for > defaultIgnoresNotBoolean 1`] = `\n[Error: Commitlint configuration in defaultIgnoresNotBoolean.js is invalid:\n\t- Property \"defaultIgnores\" has the wrong type - must be boolean.\n]\n`;\n\nexports[`validation should fail for > extendsAsObject 1`] = `\n[Error: Commitlint configuration in extendsAsObject.js is invalid:\n\t- Property \"extends\" has the wrong type - must be array.\n\t- Property \"extends\" has the wrong type - must be string.\n\t- \"/extends\" must match exactly one schema in oneOf. Value: {\"test\":1}.\n]\n`;\n\nexports[`validation should fail for > extendsWithFunction 1`] = `\n[Error: Commitlint configuration in extendsWithFunction.js is invalid:\n\t- Property \"extends/0\" has the wrong type - must be string.\n\t- Property \"extends\" has the wrong type - must be string.\n\t- \"/extends\" must match exactly one schema in oneOf. Value: [null].\n]\n`;\n\nexports[`validation should fail for > formatterAsObject 1`] = `\n[Error: Commitlint configuration in formatterAsObject.js is invalid:\n\t- Property \"formatter\" has the wrong type - must be string.\n]\n`;\n\nexports[`validation should fail for > helpUrlAsArray 1`] = `\n[Error: Commitlint configuration in helpUrlAsArray.js is invalid:\n\t- Property \"helpUrl\" has the wrong type - must be string.\n]\n`;\n\nexports[`validation should fail for > helpUrlNotString 1`] = `\n[Error: Commitlint configuration in helpUrlNotString.js is invalid:\n\t- Property \"helpUrl\" has the wrong type - must be string.\n]\n`;\n\nexports[`validation should fail for > ignoresFunction 1`] = `\n[Error: Commitlint configuration in ignoresFunction.js is invalid:\n\t- Property \"ignores\" has the wrong type - must be array.\n]\n`;\n\nexports[`validation should fail for > ignoresNotFunction 1`] = `\n[Error: Commitlint configuration in ignoresNotFunction.js is invalid:\n\t- \"/ignores/0\" should be a function. Value: 1.\n]\n`;\n\nexports[`validation should fail for > parserPreset 1`] = `\n[Error: Commitlint configuration in parserPreset.js is invalid:\n\t- Property \"parserPreset\" has the wrong type - must be string.\n\t- Property \"parserPreset\" has the wrong type - must be object.\n\t- \"/parserPreset\" should be a function. Value: [].\n\t- \"/parserPreset\" must match exactly one schema in oneOf. Value: [].\n]\n`;\n\nexports[`validation should fail for > pluginsNotArray 1`] = `\n[Error: Commitlint configuration in pluginsNotArray.js is invalid:\n\t- Property \"plugins\" has the wrong type - must be array.\n]\n`;\n\nexports[`validation should fail for > rules1 1`] = `\n[Error: Commitlint configuration in rules1.js is invalid:\n\t- \"/rules/a/0\" must be equal to one of the allowed values. Value: 3.\n\t- \"/rules/a\" should be a function. Value: [3].\n\t- \"/rules/a\" must match exactly one schema in oneOf. Value: [3].\n]\n`;\n\nexports[`validation should fail for > rules2 1`] = `\n[Error: Commitlint configuration in rules2.js is invalid:\n\t- \"/rules/b\" must NOT have more than 3 items. Value: [1,\"test\",2,2].\n\t- \"/rules/b\" should be a function. Value: [1,\"test\",2,2].\n\t- \"/rules/b\" must match exactly one schema in oneOf. Value: [1,\"test\",2,2].\n]\n`;\n\nexports[`validation should fail for > rules3 1`] = `\n[Error: Commitlint configuration in rules3.js is invalid:\n\t- \"/rules/c\" must NOT have fewer than 1 items. Value: [].\n\t- \"/rules/c\" should be a function. Value: [].\n\t- \"/rules/c\" must match exactly one schema in oneOf. Value: [].\n]\n`;\n\nexports[`validation should fail for > rules4 1`] = `\n[Error: Commitlint configuration in rules4.js is invalid:\n\t- Property \"rules/d/0\" has the wrong type - must be number.\n\t- \"/rules/d/0\" must be equal to one of the allowed values. Value: [].\n\t- \"/rules/d\" should be a function. Value: [[],[],[]].\n\t- \"/rules/d\" must match exactly one schema in oneOf. Value: [[],[],[]].\n]\n`;\n\nexports[`validation should fail for > rules5 1`] = `\n[Error: Commitlint configuration in rules5.js is invalid:\n\t- Property \"rules/e\" has the wrong type - must be array.\n\t- \"/rules/e\" should be a function. Value: {}.\n\t- \"/rules/e\" must match exactly one schema in oneOf. Value: {}.\n]\n`;\n\nexports[`validation should fail for > rulesAsArray 1`] = `\n[Error: Commitlint configuration in rulesAsArray.js is invalid:\n\t- Property \"rules\" has the wrong type - must be object.\n]\n`;\n\nexports[`validation should fail for > whenConfigIsNotObject 1`] = `\n[Error: Commitlint configuration in whenConfigIsNotObject.js is invalid:\n\t- Config has the wrong type - must be object.\n]\n`;\n\nexports[`validation should fail for > whenConfigIsNotObject2 1`] = `\n[Error: Commitlint configuration in whenConfigIsNotObject2.js is invalid:\n\t- Config has the wrong type - must be object.\n]\n`;\n\nexports[`validation should fail for > withPluginsAsObject 1`] = `\n[Error: Commitlint configuration in withPluginsAsObject.js is invalid:\n\t- Property \"plugins/0\" has the wrong type - must be string.\n\t- \"/plugins/0\" must have required property 'rules'. Value: {}.\n\t- \"/plugins/0\" must match a schema in anyOf. Value: {}.\n]\n`;\n"
  },
  {
    "path": "@commitlint/config-validator/src/commitlint.schema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema\",\n  \"type\": \"object\",\n  \"definitions\": {\n    \"rule\": {\n      \"oneOf\": [\n        {\n          \"description\": \"A rule\",\n          \"type\": \"array\",\n          \"items\": [\n            {\n              \"description\": \"Level: 0 disables the rule. For 1 it will be considered a warning, for 2 an error\",\n              \"type\": \"number\",\n              \"enum\": [0, 1, 2]\n            },\n            {\n              \"description\": \"Applicable: always|never: never inverts the rule\",\n              \"type\": \"string\",\n              \"enum\": [\"always\", \"never\"]\n            },\n            {\n              \"description\": \"Value: the value for this rule\"\n            }\n          ],\n          \"minItems\": 1,\n          \"maxItems\": 3,\n          \"additionalItems\": false\n        },\n        {\n          \"description\": \"A rule\",\n          \"typeof\": \"function\"\n        }\n      ]\n    }\n  },\n  \"properties\": {\n    \"extends\": {\n      \"description\": \"Resolveable ids to commitlint configurations to extend\",\n      \"oneOf\": [\n        {\n          \"type\": \"array\",\n          \"items\": { \"type\": \"string\" }\n        },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"parserPreset\": {\n      \"description\": \"Resolveable id to conventional-changelog parser preset to import and use\",\n      \"oneOf\": [\n        { \"type\": \"string\" },\n        {\n          \"type\": \"object\",\n          \"properties\": {\n            \"name\": { \"type\": \"string\" },\n            \"path\": { \"type\": \"string\" },\n            \"parserOpts\": {}\n          },\n          \"additionalProperties\": true\n        },\n        { \"typeof\": \"function\" }\n      ]\n    },\n    \"helpUrl\": {\n      \"description\": \"Custom URL to show upon failure\",\n      \"type\": \"string\"\n    },\n    \"formatter\": {\n      \"description\": \"Resolveable id to package, from node_modules, which formats the output\",\n      \"type\": \"string\"\n    },\n    \"rules\": {\n      \"description\": \"Rules to check against\",\n      \"type\": \"object\",\n      \"propertyNames\": { \"type\": \"string\" },\n      \"additionalProperties\": { \"$ref\": \"#/definitions/rule\" }\n    },\n    \"plugins\": {\n      \"description\": \"Resolveable ids of commitlint plugins from node_modules\",\n      \"type\": \"array\",\n      \"items\": {\n        \"anyOf\": [\n          { \"type\": \"string\" },\n          {\n            \"type\": \"object\",\n            \"required\": [\"rules\"],\n            \"properties\": {\n              \"rules\": {\n                \"type\": \"object\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"ignores\": {\n      \"type\": \"array\",\n      \"items\": { \"typeof\": \"function\" },\n      \"description\": \"Additional commits to ignore, defined by ignore matchers\"\n    },\n    \"defaultIgnores\": {\n      \"description\": \"Whether commitlint uses the default ignore rules\",\n      \"type\": \"boolean\"\n    }\n  }\n}\n"
  },
  {
    "path": "@commitlint/config-validator/src/formatErrors.ts",
    "content": "import type { ErrorObject } from \"ajv\";\n\n/**\n * Formats an array of schema validation errors.\n * @param errors An array of error messages to format.\n * @returns Formatted error message\n * Based on https://github.com/eslint/eslint/blob/master/lib/shared/config-validator.js#L237-L261\n */\nexport function formatErrors(errors: ErrorObject[]): string {\n\treturn errors\n\t\t.map((error) => {\n\t\t\tif (\n\t\t\t\terror.keyword === \"additionalProperties\" &&\n\t\t\t\t\"additionalProperty\" in error.params\n\t\t\t) {\n\t\t\t\tconst formattedPropertyPath = error.instancePath.length\n\t\t\t\t\t? `${error.instancePath.slice(1)}.${error.params.additionalProperty}`\n\t\t\t\t\t: error.params.additionalProperty;\n\n\t\t\t\treturn `Unexpected top-level property \"${formattedPropertyPath}\"`;\n\t\t\t}\n\t\t\tif (error.keyword === \"type\") {\n\t\t\t\tconst formattedField = error.instancePath.slice(1);\n\t\t\t\tif (!formattedField) {\n\t\t\t\t\treturn `Config has the wrong type - ${error.message}`;\n\t\t\t\t}\n\t\t\t\treturn `Property \"${formattedField}\" has the wrong type - ${error.message}`;\n\t\t\t}\n\t\t\tconst field =\n\t\t\t\t(error.instancePath[0] === \".\"\n\t\t\t\t\t? error.instancePath.slice(1)\n\t\t\t\t\t: error.instancePath) || \"Config\";\n\t\t\tif (error.keyword === \"typeof\") {\n\t\t\t\treturn `\"${field}\" should be a ${error.schema}. Value: ${JSON.stringify(\n\t\t\t\t\terror.data,\n\t\t\t\t)}`;\n\t\t\t}\n\n\t\t\treturn `\"${field}\" ${error.message}. Value: ${JSON.stringify(\n\t\t\t\terror.data,\n\t\t\t)}`;\n\t\t})\n\t\t.map((message) => `\\t- ${message}.\\n`)\n\t\t.join(\"\");\n}\n"
  },
  {
    "path": "@commitlint/config-validator/src/validate.test.ts",
    "content": "import { describe, test, expect } from \"vitest\";\nimport { RuleConfigSeverity, UserConfig } from \"@commitlint/types\";\n\nimport { validateConfig } from \"./validate.js\";\n\nconst validSchemas: Record<string, UserConfig> = {\n\tempty: {},\n\twithEmptyExtends: { extends: [] },\n\twithStringExtends: { extends: \"test\" },\n\twithSingleExtends: { extends: [\"test\"] },\n\twithMultipleExtends: { extends: [\"test\", \"test2\"] },\n\twithFormatter: { formatter: \"\" },\n\twithHelpUrl: { helpUrl: \"\" },\n\twithRules: {\n\t\trules: {\n\t\t\ta: [RuleConfigSeverity.Disabled],\n\t\t\tb: [RuleConfigSeverity.Warning, \"never\"],\n\t\t\tc: [RuleConfigSeverity.Error, \"never\", true],\n\t\t},\n\t},\n\twithParserPresetString: { parserPreset: \"test\" },\n\twithParserPresetObject: { parserPreset: {} },\n\twithParserPresetObject2: { parserPreset: { name: \"string\", path: \"string\" } },\n\twithParserPresetObjectPromise: {\n\t\tparserPreset: Promise.resolve({ name: \"string\" }),\n\t},\n\twithParserPresetOpts: { parserPreset: { parserOpts: { test: 1 } } },\n\twithParserPresetOptsPromise: {\n\t\tparserPreset: { parserOpts: Promise.resolve({ test: 1 }) },\n\t},\n\twithEmptyIgnores: { ignores: [] },\n\twithIgnores: { ignores: [() => true] },\n\twithDefaultIgnoresTrue: { defaultIgnores: true },\n\twithDefaultIgnoresFalse: { defaultIgnores: false },\n\twithEmptyPlugins: { plugins: [] },\n\twithPluginsAsString: { plugins: [\"test\"] },\n\twithPluginsAsObject: { plugins: [{ rules: {} }] },\n\tshouldSkipAllowAdditionalProperties: { foo: 1 },\n};\n\nconst invalidSchemas: Record<string, any> = {\n\twhenConfigIsNotObject: [],\n\twhenConfigIsNotObject2: \"\",\n\textendsAsObject: { extends: { test: 1 } },\n\textendsWithFunction: { extends: [() => true] },\n\tformatterAsObject: { formatter: {} },\n\thelpUrlAsArray: { helpUrl: [] },\n\trulesAsArray: { rules: [\"a\"] },\n\trules1: { rules: { a: [3] } },\n\trules2: { rules: { b: [1, \"test\", 2, 2] } },\n\trules3: { rules: { c: [] } },\n\trules4: { rules: { d: [[], [], []] } },\n\trules5: { rules: { e: {} } },\n\tparserPreset: { parserPreset: [] },\n\tignoresFunction: { ignores: () => true },\n\tignoresNotFunction: { ignores: [1] },\n\tdefaultIgnoresNotBoolean: { defaultIgnores: \"true\" },\n\tpluginsNotArray: { plugins: \"test\" },\n\twithPluginsAsObject: { plugins: [{}] },\n\thelpUrlNotString: { helpUrl: {} },\n};\n\ndescribe(\"validation should pass for\", () => {\n\ttest.each(Object.entries(validSchemas))(\"%s\", (file, config) => {\n\t\texpect(() => validateConfig(`${file}.js`, config)).not.toThrow();\n\t});\n});\n\ndescribe(\"validation should fail for\", () => {\n\ttest.each(Object.entries(invalidSchemas))(\"%s\", (file, config) => {\n\t\texpect(() =>\n\t\t\tvalidateConfig(`${file}.js`, config),\n\t\t).toThrowErrorMatchingSnapshot();\n\t});\n});\n"
  },
  {
    "path": "@commitlint/config-validator/src/validate.ts",
    "content": "import { createRequire } from \"node:module\";\n\nimport { UserConfig } from \"@commitlint/types\";\nimport _Ajv from \"ajv\";\n\nimport { formatErrors } from \"./formatErrors.js\";\n\nconst require = createRequire(import.meta.url);\n\nconst schema: typeof import(\"./commitlint.schema.json\") = require(\"./commitlint.schema.json\");\n\nconst TYPE_OF = [\n\t\"undefined\",\n\t\"string\",\n\t\"number\",\n\t\"object\",\n\t\"function\",\n\t\"boolean\",\n\t\"symbol\",\n];\n\n// FIXME: https://github.com/ajv-validator/ajv/issues/2132\nconst Ajv = _Ajv as unknown as typeof _Ajv.default;\n\nexport function validateConfig(\n\tsource: string,\n\tconfig: unknown,\n): asserts config is UserConfig {\n\tconst ajv = new Ajv({\n\t\tmeta: false,\n\t\tstrict: false,\n\t\tuseDefaults: true,\n\t\tvalidateSchema: false,\n\t\tverbose: true,\n\t});\n\n\tajv.addKeyword({\n\t\tkeyword: \"typeof\",\n\t\tvalidate: function typeOfFunc(schema: any, data: any) {\n\t\t\treturn typeof data === schema;\n\t\t},\n\t\tmetaSchema: { type: \"string\", enum: TYPE_OF },\n\t\tschema: true,\n\t});\n\n\tconst validate = ajv.compile(schema);\n\tconst isValid = validate(config);\n\n\tif (!isValid && validate.errors && validate.errors.length) {\n\t\tthrow new Error(\n\t\t\t`Commitlint configuration in ${source} is invalid:\\n${formatErrors(\n\t\t\t\tvalidate.errors,\n\t\t\t)}`,\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "@commitlint/config-validator/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src/**/*.ts\", \"./src/**/*.json\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../types\" }]\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/config-workspace-scopes\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/config-workspace-scopes\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n\n### Bug Fixes\n\n* update dependency glob to v11 [security] ([#4561](https://github.com/conventional-changelog/commitlint/issues/4561)) ([a89a08b](https://github.com/conventional-changelog/commitlint/commit/a89a08b2fd3c72a6cd09e00508fc2e972f27c64c))\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/config-workspace-scopes\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/config-workspace-scopes\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Bug Fixes\n\n* **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))\n\n\n### Features\n\n* **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))\n\n\n### Performance Improvements\n\n* 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))\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/basic/@packages/a/package.json",
    "content": "{\n  \"name\": \"@packages/a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/basic/@packages/b/package.json",
    "content": "{\n  \"name\": \"@packages/b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/basic/package.json",
    "content": "{\n  \"name\": \"yarn\",\n  \"version\": \"1.0.0\",\n  \"workspaces\": [\n    \"@packages/*\"\n  ]\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/empty/package.json",
    "content": "{\n  \"name\": \"empty\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/nested-workspaces/@packages/a/nested-a/package.json",
    "content": "{\n  \"name\": \"@packages/nested-a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/nested-workspaces/@packages/b/nested-b/package.json",
    "content": "{\n  \"name\": \"@packages/nested-b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/nested-workspaces/package.json",
    "content": "{\n  \"name\": \"nested-workspaces\",\n  \"version\": \"1.0.0\",\n  \"workspaces\": [\n    \"@packages/**\"\n  ]\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/scoped/@packages/a/package.json",
    "content": "{\n  \"name\": \"@packages/a\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/scoped/@packages/b/package.json",
    "content": "{\n  \"name\": \"@packages/b\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/scoped/lerna.json",
    "content": "{\n  \"lerna\": \"4\",\n  \"version\": \"1.0.0\",\n  \"packages\": [\"@packages/*\"]\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/fixtures/scoped/package.json",
    "content": "{\n  \"name\": \"scoped\",\n  \"version\": \"1.0.0\",\n  \"workspaces\": [\n    \"@packages/**\"\n  ]\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/index.js",
    "content": "import { createRequire } from \"node:module\";\nimport Path from \"node:path\";\n\nimport { globSync } from \"glob\";\n\nconst require = createRequire(import.meta.url);\n\nexport default {\n\tutils: { getPackages },\n\trules: {\n\t\t\"scope-enum\": (ctx) =>\n\t\t\tgetPackages(ctx).then((packages) => [2, \"always\", packages]),\n\t},\n};\n\nfunction getPackages(context) {\n\treturn Promise.resolve()\n\t\t.then(() => {\n\t\t\tconst ctx = context || {};\n\t\t\tconst cwd = ctx.cwd || process.cwd();\n\n\t\t\tconst { workspaces } = require(Path.join(cwd, \"package.json\"));\n\t\t\tif (!Array.isArray(workspaces)) {\n\t\t\t\t// no workspaces configured, skipping\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst wsGlobs = workspaces.flatMap((ws) => {\n\t\t\t\tconst path = Path.posix.join(ws, \"package.json\");\n\t\t\t\treturn globSync(path, { cwd, ignore: [\"**/node_modules/**\"] });\n\t\t\t});\n\n\t\t\treturn wsGlobs.sort().map((pJson) => require(Path.join(cwd, pJson)));\n\t\t})\n\t\t.then((packages) => {\n\t\t\treturn packages\n\t\t\t\t.map((pkg) => pkg.name)\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.map((name) => (name.charAt(0) === \"@\" ? name.split(\"/\")[1] : name));\n\t\t});\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/index.test.js",
    "content": "import { test, expect } from \"vitest\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { npm } from \"@commitlint/test\";\n\nimport config from \"./index.js\";\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\ntest(\"exports rules key\", () => {\n\texpect(config).toHaveProperty(\"rules\");\n});\n\ntest(\"rules hold object\", () => {\n\texpect(config).toMatchObject({\n\t\trules: expect.any(Object),\n\t});\n});\n\ntest(\"rules contain scope-enum\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.anything(),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum is function\", () => {\n\texpect(config).toMatchObject({\n\t\trules: {\n\t\t\t\"scope-enum\": expect.any(Function),\n\t\t},\n\t});\n});\n\ntest(\"scope-enum does not throw for missing context\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tawait expect(fn()).resolves.toBeTruthy();\n});\n\ntest(\"scope-enum has expected severity\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [severity] = await fn();\n\texpect(severity).toBe(2);\n});\n\ntest(\"scope-enum has expected modifier\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst [, modifier] = await fn();\n\texpect(modifier).toBe(\"always\");\n});\n\ntest(\"returns empty value for empty workspaces\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/empty\", __dirname);\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([]);\n});\n\ntest(\"returns expected value for basic workspaces\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/basic\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"a\", \"b\"]);\n});\n\ntest(\"returns expected value for scoped workspaces\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/scoped\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual([\"a\", \"b\"]);\n});\n\ntest(\"returns expected value for workspaces has nested packages\", async () => {\n\tconst { \"scope-enum\": fn } = config.rules;\n\tconst cwd = await npm.bootstrap(\"fixtures/nested-workspaces\", __dirname);\n\n\tconst [, , value] = await fn({ cwd });\n\texpect(value).toEqual(expect.arrayContaining([\"nested-a\", \"nested-b\"]));\n\texpect(value).toEqual(\n\t\texpect.not.arrayContaining([\"dependency-a\", \"dependency-b\"]),\n\t);\n});\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2024 - present Jan Biasi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/package.json",
    "content": "{\n  \"name\": \"@commitlint/config-workspace-scopes\",\n  \"type\": \"module\",\n  \"version\": \"20.4.3\",\n  \"description\": \"Shareable commitlint config enforcing workspace names as scopes\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/config-lerna-scopes\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"commitlint-config\",\n    \"npm-workspaces\",\n    \"yarn-workspaces\"\n  ],\n  \"author\": \"Jan Biasi (https://github.com/janbiasi)\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"dependencies\": {\n    \"glob\": \"^11.0.0\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/glob\": \"^8.1.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/config-workspace-scopes/readme.md",
    "content": "# @commitlint/config-workspace-scopes\n\nShareable `commitlint` config enforcing workspace names as scopes.\nUse with [@commitlint/cli](../cli) and [@commitlint/prompt-cli](../prompt-cli).\n\n## Getting started\n\n```sh\nnpm install --save-dev @commitlint/config-workspace-scopes @commitlint/cli\necho \"export default {extends: ['@commitlint/config-workspace-scopes']};\" > commitlint.config.js\n```\n\n## Examples\n\n```text\n❯ cat package.json\n{\n  \"workspaces\": [\"packages/*\"]\n}\n\n❯ cat commitlint.config.js\n{\n  extends: ['@commitlint/config-workspace-scopes']\n}\n\n❯ tree packages\n\npackages\n├── api\n├── app\n└── web\n\n❯ echo \"build(api): change something in api's build\" | commitlint\n⧗   input: build(api): change something in api's build\n✔   found 0 problems, 0 warnings\n\n❯ echo \"test(foo): this won't pass\" | commitlint\n⧗   input: test(foo): this won't pass\n✖   scope must be one of [api, app, web] [scope-enum]\n✖   found 1 problems, 0 warnings\n\n❯ echo \"ci: do some general maintenance\" | commitlint\n⧗   input: ci: do some general maintenance\n✔   found 0 problems, 0 warnings\n```\n\nConsult [Rules reference](https://commitlint.js.org/reference/rules) for a list of available rules.\n"
  },
  {
    "path": "@commitlint/core/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [19.2.1](https://github.com/conventional-changelog/commitlint/compare/v19.2.0...v19.2.1) (2024-03-19)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [18.4.1](https://github.com/conventional-changelog/commitlint/compare/v18.4.0...v18.4.1) (2023-11-12)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [18.2.0](https://github.com/conventional-changelog/commitlint/compare/v18.1.0...v18.2.0) (2023-10-26)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.7.2](https://github.com/conventional-changelog/commitlint/compare/v17.7.1...v17.7.2) (2023-09-28)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.7.1](https://github.com/conventional-changelog/commitlint/compare/v17.7.0...v17.7.1) (2023-08-10)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.5.1](https://github.com/conventional-changelog/commitlint/compare/v17.5.0...v17.5.1) (2023-03-28)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n## [17.4.1](https://github.com/conventional-changelog/commitlint/compare/v17.4.0...v17.4.1) (2023-01-09)\n\n**Note:** Version bump only for package @commitlint/core\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [17.1.2](https://github.com/conventional-changelog/commitlint/compare/v17.1.1...v17.1.2) (2022-08-29)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [17.1.1](https://github.com/conventional-changelog/commitlint/compare/v17.1.0...v17.1.1) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [13.2.1](https://github.com/conventional-changelog/commitlint/compare/v13.2.0...v13.2.1) (2021-10-09)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [8.3.1](https://github.com/conventional-changelog/commitlint/compare/v8.3.0...v8.3.1) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [7.6.1](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.1) (2019-05-09)\n\n**Note:** Version bump only for package @commitlint/core\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [7.5.2](https://github.com/conventional-changelog/commitlint/compare/v7.5.1...v7.5.2) (2019-02-11)\n\n**Note:** Version bump only for package @commitlint/core\n\n## [7.5.1](https://github.com/conventional-changelog/commitlint/compare/v7.5.0...v7.5.1) (2019-02-09)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.4.0\"></a>\n\n# [7.4.0](https://github.com/conventional-changelog/commitlint/compare/v7.3.2...v7.4.0) (2019-01-27)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"7.3.2\"></a>\n\n## [7.3.2](https://github.com/conventional-changelog/commitlint/compare/v7.3.1...v7.3.2) (2019-01-15)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"6.2.0\"></a>\n\n# [6.2.0](https://github.com/conventional-changelog/commitlint/compare/v6.1.3...v6.2.0) (2018-05-01)\n\n**Note:** Version bump only for package @commitlint/core\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/core\n"
  },
  {
    "path": "@commitlint/core/README.md",
    "content": ""
  },
  {
    "path": "@commitlint/core/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/core/package.json",
    "content": "{\n  \"name\": \"@commitlint/core\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/core.js\",\n  \"types\": \"lib/core.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-import\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/core\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@commitlint/format\": \"^20.5.0\",\n    \"@commitlint/lint\": \"^20.5.0\",\n    \"@commitlint/load\": \"^20.5.0\",\n    \"@commitlint/read\": \"^20.5.0\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/core/src/core.ts",
    "content": "import format from \"@commitlint/format\";\nimport load from \"@commitlint/load\";\nimport lint from \"@commitlint/lint\";\nimport read from \"@commitlint/read\";\n\nexport { format, load, lint, read };\n"
  },
  {
    "path": "@commitlint/core/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src/**/*.ts\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/.gitignore",
    "content": ".vscode\n"
  },
  {
    "path": "@commitlint/cz-commitlint/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n\n### Features\n\n* **cz-commitlint:** add exclamation mark support for breaking changes ([#4655](https://github.com/conventional-changelog/commitlint/issues/4655)) ([3b124a7](https://github.com/conventional-changelog/commitlint/commit/3b124a78000dc2ad353884b72db5ba0c78a642a3))\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n\n### Features\n\n* **cz-commitlint:** support customizable commit prompt with emojis ([#4540](https://github.com/conventional-changelog/commitlint/issues/4540)) ([803c05b](https://github.com/conventional-changelog/commitlint/commit/803c05b6d722676ed499585ed713d185d1670462))\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add missing cjs entry in package ([#3967](https://github.com/conventional-changelog/commitlint/issues/3967)) ([9cea6fd](https://github.com/conventional-changelog/commitlint/commit/9cea6fdb7b1bf7cfc9a86e882e2742379b4b6aec))\n\n\n### Features\n\n* add CJS export for cz-commitlint ([#3963](https://github.com/conventional-changelog/commitlint/issues/3963)) ([6ae3c6a](https://github.com/conventional-changelog/commitlint/commit/6ae3c6a827de8622d827146ffb0984a9e62fe505)), closes [/github.com/conventional-changelog/commitlint/pull/3850#issuecomment-1984932236](https://github.com//github.com/conventional-changelog/commitlint/pull/3850/issues/issuecomment-1984932236) [#3949](https://github.com/conventional-changelog/commitlint/issues/3949)\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [18.4.1](https://github.com/conventional-changelog/commitlint/compare/v18.4.0...v18.4.1) (2023-11-12)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [18.2.0](https://github.com/conventional-changelog/commitlint/compare/v18.1.0...v18.2.0) (2023-10-26)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [17.7.2](https://github.com/conventional-changelog/commitlint/compare/v17.7.1...v17.7.2) (2023-09-28)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [17.7.1](https://github.com/conventional-changelog/commitlint/compare/v17.7.0...v17.7.1) (2023-08-10)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n## [17.4.1](https://github.com/conventional-changelog/commitlint/compare/v17.4.0...v17.4.1) (2023-01-09)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n## [17.1.2](https://github.com/conventional-changelog/commitlint/compare/v17.1.1...v17.1.2) (2022-08-29)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n## [17.1.1](https://github.com/conventional-changelog/commitlint/compare/v17.1.0...v17.1.1) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n## [16.0.3](https://github.com/conventional-changelog/commitlint/compare/v16.0.2...v16.0.3) (2022-01-19)\n\n### Bug Fixes\n\n- commit body should be empty by default ([#2980](https://github.com/conventional-changelog/commitlint/issues/2980)) ([e6582e0](https://github.com/conventional-changelog/commitlint/commit/e6582e03608621e46f617a097b4880750ae85021))\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n### Bug Fixes\n\n- **cz-commitlint:** combine commit body with issuesBody/breakingBody when body has an empty string ([#2915](https://github.com/conventional-changelog/commitlint/issues/2915)) ([a038b41](https://github.com/conventional-changelog/commitlint/commit/a038b419f7f1d2073977ec1e6fe59ffcbba38931))\n\n### Features\n\n- **cz-commitlint:** support select scope with radio list by setting disableMultipleScopes ([#2911](https://github.com/conventional-changelog/commitlint/issues/2911)) ([9d8d73f](https://github.com/conventional-changelog/commitlint/commit/9d8d73f36e0c62c8cd9e3e913b66a5ca46ebf622)), closes [#2782](https://github.com/conventional-changelog/commitlint/issues/2782)\n\n### BREAKING CHANGES\n\n- **cz-commitlint:** users who is using multiple scopes need to set enableMultipleScopes to true\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n- support multiple scopes and multiple cases & fix sentence-case is not consistent with commitlint/cli (#2806) ([2c71a7e](https://github.com/conventional-changelog/commitlint/commit/2c71a7e2965a2beff805982d37243b79a48c9360)), closes [#2806](https://github.com/conventional-changelog/commitlint/issues/2806) [#2782](https://github.com/conventional-changelog/commitlint/issues/2782)\n\n### BREAKING CHANGES\n\n- add prompt.settings configuration\n\n## [13.2.1](https://github.com/conventional-changelog/commitlint/compare/v13.2.0...v13.2.1) (2021-10-09)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n### Bug Fixes\n\n- **cz-commitlint:** fix minor formatting issues ([99d8881](https://github.com/conventional-changelog/commitlint/commit/99d8881d0d951deded6d9e31bbb279d04101549b))\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/cz-commitlint\n"
  },
  {
    "path": "@commitlint/cz-commitlint/README.md",
    "content": "> Commitizen adapter using the commitlint.config.js\n\n# @commitlint/cz-commitlint\n\nThis is a commitizen adapter, using this adapter, commitizen works based on commitlint.config.js.\n\nSubmit by commitizen, lint by commitlint, just need maintain one configuration file, Consistent and Scalable.\n\nThe interactive process is inspired by [cz-conventional-changelog](https://github.com/commitizen/cz-conventional-changelog).\n\n## Getting started\n\n### Configure commitizen adapter\n\n```bash\nnpm install --save-dev @commitlint/cz-commitlint commitizen inquirer@9  # inquirer is required as peer dependency\n# or yarn\nyarn add -D @commitlint/cz-commitlint commitizen inquirer@9             # inquirer is required as peer dependency\n```\n\nIn package.json\n\n```json\n{\n  \"scripts\": {\n    \"commit\": \"git-cz\"\n  },\n  \"config\": {\n    \"commitizen\": {\n      \"path\": \"@commitlint/cz-commitlint\"\n    }\n  }\n}\n```\n\n### Configure commitlint\n\n**⚠️ Important: The required version of commitlint and shared configuration is above 12.1.2, update them if already existed in project**\n\n```bash\n# Install commitlint cli and conventional config\nnpm install --save-dev @commitlint/config-conventional @commitlint/cli\n# or yarn\nyarn add @commitlint/config-conventional @commitlint/cli -D\n\n# Simple: config with conventional\necho \"module.exports = {extends: ['@commitlint/config-conventional']};\" > commitlint.config.js\n```\n\n### Try it out\n\n```bash\ngit add .\nnpm run commit\n# or yarn\nyarn commit\n```\n\n## Related\n\n- [Commitlint Reference Prompt](https://commitlint.js.org/reference/prompt) - How to customize prompt information by setting commitlint.config.js\n"
  },
  {
    "path": "@commitlint/cz-commitlint/TODO",
    "content": "[x] jest Test\n[x] insert prompt settings to commitlint.config.js\n[] support multi line\n[] support emoji and title\n[] recognize \"signed-off-by\" and \"references-empty\" rules\n"
  },
  {
    "path": "@commitlint/cz-commitlint/index.cjs",
    "content": "'use strict';\n\n/** @type {Awaited<typeof import('./lib/index.js')>['prompter']} */\nexports.prompter = async (...args) => {\n\t(await import('./lib/index.js')).prompter(...args);\n};\n"
  },
  {
    "path": "@commitlint/cz-commitlint/license.md",
    "content": "The MIT License (MIT)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/cz-commitlint/package.json",
    "content": "{\n  \"name\": \"@commitlint/cz-commitlint\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Commitizen adapter using the commitlint.config.js\",\n  \"main\": \"./lib/index.js\",\n  \"exports\": {\n    \"import\": \"./lib/index.js\",\n    \"require\": \"./index.cjs\"\n  },\n  \"files\": [\n    \"index.cjs\",\n    \"lib\"\n  ],\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"cz\",\n    \"commitizen\",\n    \"cz-commitlint\"\n  ],\n  \"scripts\": {\n    \"commit\": \"git-cz\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/cz-commitlint\"\n  },\n  \"engineStrict\": true,\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"author\": \"Curly Brackets <water.curly@outlook.com>\",\n  \"license\": \"MIT\",\n  \"config\": {\n    \"commitizen\": {\n      \"path\": \"./@commitlint/cz-commitlint\"\n    }\n  },\n  \"dependencies\": {\n    \"@commitlint/ensure\": \"^20.5.0\",\n    \"@commitlint/load\": \"^20.5.0\",\n    \"@commitlint/types\": \"^20.5.0\",\n    \"is-plain-obj\": \"^4.1.0\",\n    \"picocolors\": \"^1.1.1\",\n    \"word-wrap\": \"^1.2.5\"\n  },\n  \"peerDependencies\": {\n    \"commitizen\": \"^4.0.3\",\n    \"inquirer\": \"^9.0.0\"\n  },\n  \"devDependencies\": {\n    \"@types/inquirer\": \"^9.0.7\",\n    \"commitizen\": \"^4.2.4\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/Process.test.ts",
    "content": "import { describe, test, expect, vi, beforeEach, afterEach } from \"vitest\";\nimport {\n\tQualifiedRules,\n\tRuleConfigSeverity,\n\tUserPromptConfig,\n} from \"@commitlint/types\";\nimport { Answers, DistinctQuestion } from \"inquirer\";\n\nimport process from \"./Process.js\";\n\nconst mockShowTitle = vi.fn();\nconst mockShowValidation = vi.fn((message) => message);\n\n// mock inquirer\nconst mockPrompt = vi.fn(async function (\n\tquestions: DistinctQuestion[],\n\tanswers: Answers,\n) {\n\tfor (const { name, message, when, filter, validate } of questions) {\n\t\tif (typeof when !== \"function\" || (await when(answers))) {\n\t\t\tconst title =\n\t\t\t\tmessage && typeof message === \"function\"\n\t\t\t\t\t? await message(answers)\n\t\t\t\t\t: typeof message === \"string\"\n\t\t\t\t\t\t? message\n\t\t\t\t\t\t: \"\";\n\t\t\tmockShowTitle(title);\n\n\t\t\tconst validation =\n\t\t\t\ttypeof validate !== \"function\" ||\n\t\t\t\t(await validate((name && answers[name]) ?? \"\", answers));\n\n\t\t\tif (typeof validation === \"string\") {\n\t\t\t\tmockShowValidation(validation);\n\t\t\t\tbreak;\n\t\t\t} else if (filter && name && answers[name]) {\n\t\t\t\tanswers[name] = filter(answers[name], answers);\n\t\t\t}\n\t\t}\n\t}\n});\n\nfunction InquirerFactory(answers: Answers) {\n\tconst inquirer = {\n\t\tasync prompt(questions: DistinctQuestion[]) {\n\t\t\tawait mockPrompt(questions, answers);\n\t\t\treturn answers;\n\t\t},\n\t};\n\n\treturn inquirer;\n}\n\nconst MESSAGES = {\n\tskip: \"(press enter to skip)\",\n\tmax: \"upper %d chars\",\n\tmin: \"%d chars at least\",\n\temptyWarning: \"%s can not be empty\",\n\tupperLimitWarning: \"%s: %s over limit %d\",\n\tlowerLimitWarning: \"%s: %s below limit %d\",\n};\n\nlet rules: QualifiedRules;\nlet prompts: UserPromptConfig;\n\nafterEach(() => {\n\tmockShowTitle.mockClear();\n\tmockShowValidation.mockClear();\n});\n\ndescribe(\"conventional-changlog\", () => {\n\tbeforeEach(() => {\n\t\trules = {\n\t\t\t\"body-leading-blank\": [RuleConfigSeverity.Warning, \"always\"],\n\t\t\t\"body-max-line-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\t\"footer-leading-blank\": [RuleConfigSeverity.Warning, \"always\"],\n\t\t\t\"footer-max-line-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\t\"header-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\t\"subject-case\": [\n\t\t\t\tRuleConfigSeverity.Error,\n\t\t\t\t\"never\",\n\t\t\t\t[\"sentence-case\", \"start-case\", \"pascal-case\", \"upper-case\"],\n\t\t\t],\n\t\t\t\"subject-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t\t\"subject-full-stop\": [RuleConfigSeverity.Error, \"never\", \".\"],\n\t\t\t\"type-case\": [RuleConfigSeverity.Error, \"always\", \"lower-case\"],\n\t\t\t\"type-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t\t\"type-enum\": [\n\t\t\t\tRuleConfigSeverity.Error,\n\t\t\t\t\"always\",\n\t\t\t\t[\n\t\t\t\t\t\"build\",\n\t\t\t\t\t\"chore\",\n\t\t\t\t\t\"ci\",\n\t\t\t\t\t\"docs\",\n\t\t\t\t\t\"feat\",\n\t\t\t\t\t\"fix\",\n\t\t\t\t\t\"perf\",\n\t\t\t\t\t\"refactor\",\n\t\t\t\t\t\"revert\",\n\t\t\t\t\t\"style\",\n\t\t\t\t\t\"test\",\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t\tprompts = {\n\t\t\tmessages: MESSAGES,\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\tdescription: \"Select the type of change that you're committing:\",\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tfeat: {\n\t\t\t\t\t\t\tdescription: \"A new feature\",\n\t\t\t\t\t\t\ttitle: \"Features\",\n\t\t\t\t\t\t\temoji: \"✨\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: {\n\t\t\t\t\t\t\tdescription: \"A bug fix\",\n\t\t\t\t\t\t\ttitle: \"Bug Fixes\",\n\t\t\t\t\t\t\temoji: \"🐛\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdocs: {\n\t\t\t\t\t\t\tdescription: \"Documentation only changes\",\n\t\t\t\t\t\t\ttitle: \"Documentation\",\n\t\t\t\t\t\t\temoji: \"📚\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)\",\n\t\t\t\t\t\t\ttitle: \"Styles\",\n\t\t\t\t\t\t\temoji: \"💎\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\trefactor: {\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"A code change that neither fixes a bug nor adds a feature\",\n\t\t\t\t\t\t\ttitle: \"Code Refactoring\",\n\t\t\t\t\t\t\temoji: \"📦\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tperf: {\n\t\t\t\t\t\t\tdescription: \"A code change that improves performance\",\n\t\t\t\t\t\t\ttitle: \"Performance Improvements\",\n\t\t\t\t\t\t\temoji: \"🚀\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttest: {\n\t\t\t\t\t\t\tdescription: \"Adding missing tests or correcting existing tests\",\n\t\t\t\t\t\t\ttitle: \"Tests\",\n\t\t\t\t\t\t\temoji: \"🚨\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuild: {\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)\",\n\t\t\t\t\t\t\ttitle: \"Builds\",\n\t\t\t\t\t\t\temoji: \"🛠\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tci: {\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)\",\n\t\t\t\t\t\t\ttitle: \"Continuous Integrations\",\n\t\t\t\t\t\t\temoji: \"⚙️\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchore: {\n\t\t\t\t\t\t\tdescription: \"Other changes that don't modify src or test files\",\n\t\t\t\t\t\t\ttitle: \"Chores\",\n\t\t\t\t\t\t\temoji: \"♻️\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\trevert: {\n\t\t\t\t\t\t\tdescription: \"Reverts a previous commit\",\n\t\t\t\t\t\t\ttitle: \"Reverts\",\n\t\t\t\t\t\t\temoji: \"🗑\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tscope: {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"What is the scope of this change (e.g. component or file name)\",\n\t\t\t\t},\n\t\t\t\tsubject: {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Write a short, imperative tense description of the change\",\n\t\t\t\t},\n\t\t\t\tbody: {\n\t\t\t\t\tdescription: \"Provide a longer description of the change\",\n\t\t\t\t},\n\t\t\t\tisBreaking: {\n\t\t\t\t\tdescription: \"Are there any breaking changes?\",\n\t\t\t\t},\n\t\t\t\tbreakingBody: {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself\",\n\t\t\t\t},\n\t\t\t\tbreaking: {\n\t\t\t\t\tdescription: \"Describe the breaking changes\",\n\t\t\t\t},\n\t\t\t\tisIssueAffected: {\n\t\t\t\t\tdescription: \"Does this change affect any open issues?\",\n\t\t\t\t},\n\t\t\t\tissuesBody: {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"If issues are closed, the commit requires a body. Please enter a longer description of the commit itself\",\n\t\t\t\t},\n\t\t\t\tissues: {\n\t\t\t\t\tdescription: 'Add issue references (e.g. \"fix #123\", \"re #123\".)',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t});\n\ttest(\"should process works well\", () => {\n\t\tconst answers = {\n\t\t\ttype: \"refactor\",\n\t\t\tscope: \"prompt\",\n\t\t\tsubject: \"refactor prompt based on inquirer\",\n\t\t\tbody: \"inspired by commitizen/cz-conventional-changelog\",\n\t\t\tisBreaking: true,\n\t\t\tbreaking: \"refactor types\",\n\t\t\tisIssueAffected: true,\n\t\t\tissues: \"https://github.com/conventional-changelog/commitlint/issues/94\",\n\t\t};\n\t\treturn process(rules, prompts, InquirerFactory(answers)).then(\n\t\t\t(commitMessage) => {\n\t\t\t\texpect(commitMessage).toBe(\n\t\t\t\t\t\"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\",\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t});\n\n\ttest(\"should show validation and stop process when subject is empty\", () => {\n\t\tconst answers = {\n\t\t\ttype: \"refactor\",\n\t\t\tscope: \"prompt\",\n\t\t\tbody: \"inspired by commitizen/cz-conventional-changelog\",\n\t\t\tisBreaking: true,\n\t\t\tbreaking: \"refactor types\",\n\t\t\tisIssueAffected: true,\n\t\t\tissues: \"https://github.com/conventional-changelog/commitlint/issues/94\",\n\t\t};\n\t\treturn process(rules, prompts, InquirerFactory(answers)).then(() => {\n\t\t\texpect(mockShowValidation).toHaveBeenCalledWith(\n\t\t\t\t\"subject can not be empty\",\n\t\t\t);\n\t\t\texpect(mockShowTitle).toHaveBeenCalledTimes(3);\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/Process.ts",
    "content": "import { QualifiedRules, UserPromptConfig } from \"@commitlint/types\";\nimport type { Answers, DistinctQuestion } from \"inquirer\";\n\nimport {\n\tcombineCommitMessage as combineBody,\n\tgetQuestions as getBodyQuestions,\n} from \"./SectionBody.js\";\nimport {\n\tcombineCommitMessage as combineFooter,\n\tgetQuestions as getFooterQuestions,\n} from \"./SectionFooter.js\";\nimport {\n\tcombineCommitMessage as combineHeader,\n\tgetQuestions as getHeaderQuestions,\n} from \"./SectionHeader.js\";\nimport { setPromptConfig } from \"./store/prompts.js\";\nimport { setRules } from \"./store/rules.js\";\n\nexport default async function (\n\trules: QualifiedRules,\n\tprompts: UserPromptConfig,\n\tinquirer: {\n\t\tprompt(questions: DistinctQuestion[]): Promise<Answers>;\n\t},\n): Promise<string> {\n\tsetRules(rules);\n\tsetPromptConfig(prompts);\n\tconst questions = [\n\t\t...getHeaderQuestions(),\n\t\t...getBodyQuestions(),\n\t\t...getFooterQuestions(),\n\t];\n\tconst answers = await inquirer.prompt(questions);\n\tconst header = combineHeader(answers);\n\tconst body = combineBody(answers);\n\tconst footer = combineFooter(answers);\n\n\treturn [header, body, footer].filter(Boolean).join(\"\\n\");\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/Question.test.ts",
    "content": "import { describe, test, expect, vi } from \"vitest\";\nimport pc from \"picocolors\";\nimport inquirer, { Answers, InputQuestionOptions } from \"inquirer\";\n\nimport Question from \"./Question.js\";\n\nconst MESSAGES = {\n\tskip: \"(press enter to skip)\",\n\tmax: \"upper %d chars\",\n\tmin: \"%d chars at least\",\n\temptyWarning: \"%s can not be empty\",\n\tupperLimitWarning: \"%s: %s over limit %d\",\n\tlowerLimitWarning: \"%s: %s below limit %d\",\n};\nconst QUESTION_CONFIG = {\n\ttitle: \"please input\",\n\tmessages: MESSAGES,\n};\n\nconst caseFn = (input: string | string[], delimiter?: string) =>\n\t(Array.isArray(input) ? input : [input])\n\t\t.map((segment) => segment[0].toUpperCase() + segment.slice(1))\n\t\t.join(delimiter);\n\ndescribe(\"name\", () => {\n\ttest(\"should throw error when name is not a meaningful string\", () => {\n\t\texpect(\n\t\t\t() =>\n\t\t\t\tnew Question(\"\" as any, {\n\t\t\t\t\t...QUESTION_CONFIG,\n\t\t\t\t}),\n\t\t).toThrow();\n\n\t\texpect(\n\t\t\t() =>\n\t\t\t\tnew Question(\n\t\t\t\t\tfunction () {\n\t\t\t\t\t\treturn \"scope\";\n\t\t\t\t\t} as any,\n\t\t\t\t\t{\n\t\t\t\t\t\t...QUESTION_CONFIG,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t).toThrow();\n\t});\n\n\ttest(\"should set name when name is valid\", () => {\n\t\texpect(\n\t\t\tnew Question(\"test\" as any, {\n\t\t\t\t...QUESTION_CONFIG,\n\t\t\t}).question,\n\t\t).toHaveProperty(\"name\", \"test\");\n\t});\n});\n\ndescribe(\"type\", () => {\n\ttest('should return \"list\" type when enumList is array and multipleSelectDefaultDelimiter is undefined', () => {\n\t\tconst question = new Question(\"scope\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tenumList: [\"cli\", \"core\"],\n\t\t}).question;\n\t\texpect(question).toHaveProperty(\"type\", \"list\");\n\t\texpect(question).toHaveProperty(\"choices\", [\"cli\", \"core\"]);\n\t\texpect(question).not.toHaveProperty(\"transformer\");\n\t});\n\n\ttest('should return \"checkbox\" type when enumList is array and multipleSelectDefaultDelimiter is defined', () => {\n\t\tconst question = new Question(\"scope\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tenumList: [\"cli\", \"core\"],\n\t\t\tmultipleSelectDefaultDelimiter: \",\",\n\t\t}).question;\n\t\texpect(question).toHaveProperty(\"type\", \"checkbox\");\n\t\texpect(question).toHaveProperty(\"choices\", [\"cli\", \"core\"]);\n\t\texpect(question).not.toHaveProperty(\"transformer\");\n\t});\n\n\ttest('should contain \"skip\" list item when enumList is array and skip is true', () => {\n\t\tconst question = new Question(\"scope\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tenumList: [\"cli\", \"core\"],\n\t\t\tskip: true,\n\t\t}).question;\n\t\texpect(question).toHaveProperty(\"type\", \"list\");\n\t\texpect(question).toHaveProperty(\"choices\", [\n\t\t\t\"cli\",\n\t\t\t\"core\",\n\t\t\tnew inquirer.Separator(),\n\t\t\t{\n\t\t\t\tname: \"empty\",\n\t\t\t\tvalue: \"\",\n\t\t\t},\n\t\t]);\n\t\texpect(question).not.toHaveProperty(\"transformer\");\n\t});\n\n\ttest('should return \"confirm\" type when name is start with \"is\"', () => {\n\t\tconst question = new Question(\"isSubmit\" as any, {\n\t\t\t...QUESTION_CONFIG,\n\t\t}).question;\n\t\texpect(question).toHaveProperty(\"type\", \"confirm\");\n\t\texpect(question).not.toHaveProperty(\"choices\");\n\t\texpect(question).not.toHaveProperty(\"transformer\");\n\t});\n\n\ttest('should return \"input\" type in other cases', () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t}).question;\n\t\texpect(question).toHaveProperty(\"type\", \"input\");\n\t\texpect(question).not.toHaveProperty(\"choices\");\n\t\texpect(question).toHaveProperty(\"transformer\", expect.any(Function));\n\t});\n});\n\ndescribe(\"message\", () => {\n\ttest(\"should display title when it is not input\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tenumList: [\"cli\", \"core\"],\n\t\t}).question;\n\t\texpect(question).toHaveProperty(\"message\", expect.any(Function));\n\t\texpect((question.message as any)()).toBe(\"please input:\");\n\t});\n\n\ttest(\"should display skip hint when it is input and can skip\", () => {\n\t\tconst question = new Question(\"body\" as any, {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tskip: true,\n\t\t}).question;\n\t\texpect(question).toHaveProperty(\"message\", expect.any(Function));\n\t\texpect((question.message as any)()).toBe(\n\t\t\t\"please input (press enter to skip):\\n\",\n\t\t);\n\t});\n\n\ttest(\"should not display skip hint when it is input and without skip string\", () => {\n\t\tconst question = new Question(\"scope\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tmessages: {},\n\t\t\tskip: true,\n\t\t} as any).question;\n\t\texpect(question).toHaveProperty(\"message\", expect.any(Function));\n\t\texpect((question.message as any)()).toBe(\"please input:\\n\");\n\t});\n\n\ttest(\"should display upper limit hint when it is input and has max length\", () => {\n\t\tconst question = new Question(\"scope\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tmaxLength: 80,\n\t\t} as any).question;\n\t\texpect(question).toHaveProperty(\"message\", expect.any(Function));\n\t\texpect((question.message as any)()).toBe(\"please input: upper 80 chars\\n\");\n\t});\n\n\ttest(\"should display lower limit hint when it is input and has min length\", () => {\n\t\tconst question = new Question(\"scope\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tminLength: 10,\n\t\t} as any).question;\n\t\texpect(question).toHaveProperty(\"message\", expect.any(Function));\n\t\texpect((question.message as any)()).toBe(\n\t\t\t\"please input: 10 chars at least\\n\",\n\t\t);\n\t});\n\n\ttest(\"should display hints with correct format\", () => {\n\t\tconst question = new Question(\"scope\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tminLength: 10,\n\t\t\tmaxLength: 80,\n\t\t\tskip: true,\n\t\t} as any).question;\n\t\texpect(question).toHaveProperty(\"message\", expect.any(Function));\n\t\texpect((question.message as any)()).toBe(\n\t\t\t\"please input (press enter to skip): 10 chars at least, upper 80 chars\\n\",\n\t\t);\n\t});\n\n\ttest(\"should execute function beforeQuestionStart when init message\", () => {\n\t\tconst mockFn = vi.fn();\n\t\tclass CustomQuestion extends Question {\n\t\t\tbeforeQuestionStart(answers: Answers): void {\n\t\t\t\tmockFn(answers);\n\t\t\t}\n\t\t}\n\t\tconst question = new CustomQuestion(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t} as any).question;\n\t\texpect(question).toHaveProperty(\"message\", expect.any(Function));\n\n\t\tconst answers = {\n\t\t\theader: \"This is header\",\n\t\t\tfooter: \"This is footer\",\n\t\t};\n\t\t(question.message as any)(answers);\n\t\texpect(mockFn).toHaveBeenCalledWith(answers);\n\t});\n});\n\ndescribe(\"filter\", () => {\n\ttest(\"should auto fix case and full-stop\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tcaseFn,\n\t\t\tfullStopFn: (input: string) => input + \"!\",\n\t\t}).question;\n\n\t\texpect(question.filter?.(\"xxxx\", {})).toBe(\"Xxxx!\");\n\t});\n\n\ttest(\"should transform each item with same case when input is array\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tcaseFn,\n\t\t\tfullStopFn: (input: string) => input + \"!\",\n\t\t}).question;\n\n\t\texpect(question.filter?.([\"xxxx\", \"yyyy\"], {})).toBe(\"Xxxx,Yyyy!\");\n\t});\n\n\ttest(\"should concat items with multipleSelectDefaultDelimiter when input is array\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tcaseFn,\n\t\t\tfullStopFn: (input: string) => input + \"!\",\n\t\t\tmultipleSelectDefaultDelimiter: \"|\",\n\t\t}).question;\n\n\t\texpect(question.filter?.([\"xxxx\", \"yyyy\"], {})).toBe(\"Xxxx|Yyyy!\");\n\t});\n\n\ttest(\"should split the string to items when multipleValueDelimiters is defined\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tcaseFn,\n\t\t\tfullStopFn: (input: string) => input + \"!\",\n\t\t\tmultipleValueDelimiters: /,|\\|/g,\n\t\t}).question;\n\n\t\texpect(question.filter?.(\"xxxx,yyyy|zzzz\", {})).toBe(\"Xxxx,Yyyy|Zzzz!\");\n\t\texpect(question.filter?.(\"xxxx-yyyy-zzzz\", {})).toBe(\"Xxxx-yyyy-zzzz!\");\n\t});\n\n\ttest(\"should works well when does not pass caseFn/fullStopFn\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t}).question;\n\n\t\texpect(question.filter?.(\"xxxx\", {})).toBe(\"xxxx\");\n\t});\n});\n\ndescribe(\"validate\", () => {\n\ttest(\"should display empty warning when can not skip but string is empty\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tskip: false,\n\t\t}).question;\n\n\t\texpect(question.validate?.(\"\")).toBe(\"body can not be empty\");\n\t});\n\n\ttest(\"should ignore empty validation when can skip\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tskip: true,\n\t\t}).question;\n\n\t\texpect(question.validate?.(\"\")).toBe(true);\n\t});\n\n\ttest(\"should display upper limit warning when char count is over upper limit\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tmaxLength: 5,\n\t\t}).question;\n\n\t\texpect(question.validate?.(\"xxxxxx\")).toBe(\"body: body over limit 1\");\n\t});\n\n\ttest(\"should display lower limit warning when char count is less than lower limit\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tminLength: 5,\n\t\t}).question;\n\n\t\texpect(question.validate?.(\"xxx\")).toBe(\"body: body below limit 2\");\n\t});\n\n\ttest(\"should validate the final submit string\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tcaseFn: () => \"\",\n\t\t\tskip: false,\n\t\t}).question;\n\n\t\texpect(question.validate?.(\"xxxx\")).not.toBe(true);\n\t});\n});\n\ndescribe(\"transformer\", () => {\n\ttest(\"should auto transform case and full-stop\", () => {\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tcaseFn,\n\t\t\tfullStopFn: (input: string) => input + \"!\",\n\t\t}).question;\n\n\t\texpect(\n\t\t\t(question as InputQuestionOptions)?.transformer?.(\"xxxx\", {}, {}),\n\t\t).toBe(\"Xxxx!\");\n\t});\n\n\ttest(\"should char count with green color when in the limit range\", () => {\n\t\tlet question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tmaxLength: 5,\n\t\t}).question;\n\n\t\texpect(\n\t\t\t(question as InputQuestionOptions)?.transformer?.(\"xxx\", {}, {}),\n\t\t).toEqual(pc.green(`(3) xxx`));\n\n\t\tquestion = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tminLength: 2,\n\t\t}).question;\n\n\t\texpect(\n\t\t\t(question as InputQuestionOptions)?.transformer?.(\"xxx\", {}, {}),\n\t\t).toEqual(pc.green(`(3) xxx`));\n\t});\n\n\ttest(\"should char count with red color when over the limit range\", () => {\n\t\tlet question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tmaxLength: 5,\n\t\t}).question;\n\n\t\texpect(\n\t\t\t(question as InputQuestionOptions)?.transformer?.(\"xxxxxx\", {}, {}),\n\t\t).toEqual(pc.red(`(6) xxxxxx`));\n\n\t\tquestion = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\tminLength: 2,\n\t\t}).question;\n\n\t\texpect(\n\t\t\t(question as InputQuestionOptions)?.transformer?.(\"x\", {}, {}),\n\t\t).toEqual(pc.red(`(1) x`));\n\t});\n});\n\ndescribe(\"inquirer question\", () => {\n\ttest('should pass \"when\" and \"default\" field to inquirer question', () => {\n\t\tconst when = (answers: Answers) => !!answers.header;\n\t\tconst question = new Question(\"body\", {\n\t\t\t...QUESTION_CONFIG,\n\t\t\twhen,\n\t\t\tdefaultValue: \"update\",\n\t\t}).question;\n\n\t\texpect(question).toHaveProperty(\"default\", \"update\");\n\t\texpect(question).toHaveProperty(\"when\", when);\n\t});\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/Question.ts",
    "content": "import { PromptMessages, PromptName } from \"@commitlint/types\";\nimport pc from \"picocolors\";\nimport inquirer, {\n\tAnswers,\n\tChoiceCollection,\n\tDistinctQuestion,\n} from \"inquirer\";\n\nimport { CaseFn } from \"./utils/case-fn.js\";\nimport { FullStopFn } from \"./utils/full-stop-fn.js\";\n\nexport type QuestionConfig = {\n\ttitle: string;\n\tmessages: PromptMessages;\n\tmaxLength?: number;\n\tminLength?: number;\n\tdefaultValue?: string;\n\twhen?: DistinctQuestion[\"when\"];\n\tskip?: boolean;\n\tenumList?: ChoiceCollection<{\n\t\tname: string;\n\t\tvalue: string;\n\t}> | null;\n\tmultipleValueDelimiters?: RegExp;\n\tmultipleSelectDefaultDelimiter?: string;\n\tfullStopFn?: FullStopFn;\n\tcaseFn?: CaseFn;\n};\n\nexport default class Question {\n\tprivate _question: Readonly<DistinctQuestion>;\n\tprivate messages: PromptMessages;\n\tprivate skip: boolean;\n\tprivate _maxLength: number;\n\tprivate _minLength: number;\n\tprivate title: string;\n\tprivate caseFn: CaseFn;\n\tprivate fullStopFn: FullStopFn;\n\tprivate multipleValueDelimiters?: RegExp;\n\tprivate multipleSelectDefaultDelimiter?: string;\n\tconstructor(\n\t\tname: PromptName,\n\t\t{\n\t\t\ttitle,\n\t\t\tenumList,\n\t\t\tmessages,\n\t\t\tdefaultValue,\n\t\t\twhen,\n\t\t\tskip,\n\t\t\tfullStopFn,\n\t\t\tcaseFn,\n\t\t\tmaxLength,\n\t\t\tminLength,\n\t\t\tmultipleValueDelimiters,\n\t\t\tmultipleSelectDefaultDelimiter,\n\t\t}: QuestionConfig,\n\t) {\n\t\tif (!name || typeof name !== \"string\")\n\t\t\tthrow new Error(\"Question: name is required\");\n\n\t\tthis._maxLength = maxLength ?? Infinity;\n\t\tthis._minLength = minLength ?? 0;\n\t\tthis.messages = messages;\n\t\tthis.title = title ?? \"\";\n\t\tthis.skip = skip ?? false;\n\t\tthis.fullStopFn = fullStopFn ?? ((_: string) => _);\n\t\tthis.caseFn =\n\t\t\tcaseFn ??\n\t\t\t((input: string | string[], delimiter?: string) =>\n\t\t\t\tArray.isArray(input) ? input.join(delimiter) : input);\n\t\tthis.multipleValueDelimiters = multipleValueDelimiters;\n\t\tthis.multipleSelectDefaultDelimiter = multipleSelectDefaultDelimiter;\n\n\t\tif (enumList && Array.isArray(enumList)) {\n\t\t\tthis._question = {\n\t\t\t\ttype: multipleSelectDefaultDelimiter ? \"checkbox\" : \"list\",\n\t\t\t\tchoices: skip\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t...enumList,\n\t\t\t\t\t\t\tnew inquirer.Separator(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tname: \"empty\",\n\t\t\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [...enumList],\n\t\t\t};\n\t\t} else if (/^is[A-Z]/.test(name)) {\n\t\t\tthis._question = {\n\t\t\t\ttype: \"confirm\",\n\t\t\t};\n\t\t} else {\n\t\t\tthis._question = {\n\t\t\t\ttype: \"input\",\n\t\t\t\ttransformer: this.transformer.bind(this),\n\t\t\t};\n\t\t}\n\n\t\tObject.assign(this._question, {\n\t\t\tname,\n\t\t\tdefault: defaultValue,\n\t\t\twhen,\n\t\t\tvalidate: this.validate.bind(this),\n\t\t\tfilter: this.filter.bind(this),\n\t\t\tmessage: this.decorateMessage.bind(this),\n\t\t});\n\t}\n\n\tgetMessage(key: string): string {\n\t\treturn this.messages[key] ?? \"\";\n\t}\n\n\tget question(): Readonly<DistinctQuestion> {\n\t\treturn this._question;\n\t}\n\n\tget maxLength(): number {\n\t\treturn this._maxLength;\n\t}\n\n\tset maxLength(maxLength: number) {\n\t\tthis._maxLength = maxLength;\n\t}\n\n\tget minLength(): number {\n\t\treturn this._minLength;\n\t}\n\n\tset minLength(minLength: number) {\n\t\tthis._minLength = minLength;\n\t}\n\n\tprotected beforeQuestionStart(_answers: Answers): void {\n\t\treturn;\n\t}\n\n\tprotected validate(input: string): boolean | string {\n\t\tconst output = this.filter(input);\n\t\tconst questionName = this.question.name ?? \"\";\n\t\tif (!this.skip && output.length === 0) {\n\t\t\treturn this.getMessage(\"emptyWarning\").replace(/%s/g, questionName);\n\t\t}\n\n\t\tif (output.length > this.maxLength) {\n\t\t\treturn this.getMessage(\"upperLimitWarning\")\n\t\t\t\t.replace(/%s/g, questionName)\n\t\t\t\t.replace(/%d/g, `${output.length - this.maxLength}`);\n\t\t}\n\n\t\tif (output.length < this.minLength) {\n\t\t\treturn this.getMessage(\"lowerLimitWarning\")\n\t\t\t\t.replace(/%s/g, questionName)\n\t\t\t\t.replace(/%d/g, `${this.minLength - output.length}`);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected filter(input: string | string[]): string {\n\t\tlet toCased;\n\t\tif (Array.isArray(input)) {\n\t\t\ttoCased = this.caseFn(input, this.multipleSelectDefaultDelimiter);\n\t\t} else if (this.multipleValueDelimiters) {\n\t\t\tconst segments = input.split(this.multipleValueDelimiters);\n\t\t\tconst casedString = this.caseFn(segments, \",\");\n\t\t\tconst casedSegments = casedString.split(\",\");\n\t\t\ttoCased = input.replace(\n\t\t\t\tnew RegExp(`[^${this.multipleValueDelimiters.source}]+`, \"g\"),\n\t\t\t\t(segment) => {\n\t\t\t\t\treturn casedSegments[segments.indexOf(segment)];\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\ttoCased = this.caseFn(input);\n\t\t}\n\n\t\treturn this.fullStopFn(toCased);\n\t}\n\n\tprotected transformer(input: string, _answers: Answers): string {\n\t\tconst output = this.filter(input);\n\n\t\tif (this.maxLength === Infinity && this.minLength === 0) {\n\t\t\treturn output;\n\t\t}\n\t\tconst color =\n\t\t\toutput.length <= this.maxLength && output.length >= this.minLength\n\t\t\t\t? pc.green\n\t\t\t\t: pc.red;\n\t\treturn color(\"(\" + output.length + \") \" + output);\n\t}\n\n\tprotected decorateMessage(_answers: Answers): string {\n\t\tif (this.beforeQuestionStart) {\n\t\t\tthis.beforeQuestionStart(_answers);\n\t\t}\n\t\tif (this.question.type === \"input\") {\n\t\t\tconst countLimitMessage = (() => {\n\t\t\t\tconst messages = [];\n\t\t\t\tif (this.minLength > 0 && this.getMessage(\"min\")) {\n\t\t\t\t\tmessages.push(\n\t\t\t\t\t\tthis.getMessage(\"min\").replace(/%d/g, this.minLength + \"\"),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (this.maxLength < Infinity && this.getMessage(\"max\")) {\n\t\t\t\t\tmessages.push(\n\t\t\t\t\t\tthis.getMessage(\"max\").replace(/%d/g, this.maxLength + \"\"),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn messages.join(\", \");\n\t\t\t})();\n\n\t\t\tconst skipMessage = this.skip && this.getMessage(\"skip\");\n\n\t\t\treturn (\n\t\t\t\tthis.title +\n\t\t\t\t(skipMessage ? ` ${skipMessage}` : \"\") +\n\t\t\t\t\":\" +\n\t\t\t\t(countLimitMessage ? ` ${countLimitMessage}` : \"\") +\n\t\t\t\t\"\\n\"\n\t\t\t);\n\t\t} else {\n\t\t\treturn `${this.title}:`;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/SectionBody.test.ts",
    "content": "import { describe, test, expect } from \"vitest\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport { combineCommitMessage, getQuestions } from \"./SectionBody.js\";\nimport { setRules } from \"./store/rules.js\";\n\ndescribe(\"getQuestions\", () => {\n\ttest(\"should exclude question when body must be empty\", () => {\n\t\tsetRules({\n\t\t\t\"body-empty\": [RuleConfigSeverity.Error, \"always\"],\n\t\t});\n\t\tconst questions = getQuestions();\n\t\texpect(questions).toHaveLength(0);\n\t});\n\n\ttest(\"should only return body question\", () => {\n\t\tsetRules({});\n\t\tconst questions = getQuestions();\n\t\texpect(questions).toHaveLength(1);\n\t\texpect(questions).toEqual([\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"body\",\n\t\t\t}),\n\t\t]);\n\t});\n});\n\ndescribe(\"combineCommitMessage\", () => {\n\ttest(\"should wrap message to multi lines when max-line-length set\", () => {\n\t\tsetRules({\n\t\t\t\"body-max-line-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t});\n\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tbody: \"This is the body message.\",\n\t\t});\n\n\t\texpect(commitMessage).toBe(\"This is\\nthe body\\nmessage.\");\n\t});\n\n\ttest(\"should auto apply leading blank\", () => {\n\t\tsetRules({\n\t\t\t\"body-leading-blank\": [RuleConfigSeverity.Error, \"always\"],\n\t\t});\n\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tbody: \"This is the body message.\",\n\t\t});\n\n\t\texpect(commitMessage).toBe(\"\\nThis is the body message.\");\n\t});\n\n\ttest(\"should return correct string when leading-blank and max-line-length both set\", () => {\n\t\tsetRules({\n\t\t\t\"body-max-line-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t\t\"body-leading-blank\": [RuleConfigSeverity.Error, \"always\"],\n\t\t});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tbody: \"This is the body message.\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"\\nThis is\\nthe body\\nmessage.\");\n\t});\n\n\ttest(\"should use breakingBody when body message is empty but commit has BREAK CHANGE\", () => {\n\t\tsetRules({});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tbreakingBody: \"This is breaking body message.\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"This is breaking body message.\");\n\t});\n\n\ttest(\"should use issueBody when body message is empty but commit has issue note\", () => {\n\t\tsetRules({});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tissuesBody: \"This is issue body message.\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"This is issue body message.\");\n\t});\n\n\ttest(\"should use issueBody when body message is empty string but commit has issue note\", () => {\n\t\tsetRules({});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tbody: \"\",\n\t\t\tissuesBody: \"This is issue body message.\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"This is issue body message.\");\n\t});\n\n\ttest(\"should return empty message when body is empty\", () => {\n\t\tsetRules({});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tbody: \"\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"\");\n\t});\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/SectionBody.ts",
    "content": "import { Answers, DistinctQuestion } from \"inquirer\";\nimport wrap from \"word-wrap\";\n\nimport Question from \"./Question.js\";\nimport getRuleQuestionConfig from \"./services/getRuleQuestionConfig.js\";\nimport { getRule } from \"./store/rules.js\";\nimport getLeadingBlankFn from \"./utils/leading-blank-fn.js\";\nimport { getMaxLength } from \"./utils/rules.js\";\n\nexport function getQuestions(): Array<DistinctQuestion> {\n\t// body\n\tconst questionConfig = getRuleQuestionConfig(\"body\");\n\n\tif (!questionConfig) return [];\n\telse return [new Question(\"body\", questionConfig).question];\n}\n\nexport function combineCommitMessage(answers: Answers): string {\n\tconst maxLineLength = getMaxLength(getRule(\"body\", \"max-line-length\"));\n\tconst leadingBlankFn = getLeadingBlankFn(getRule(\"body\", \"leading-blank\"));\n\tconst { body, breakingBody, issuesBody } = answers;\n\n\tconst commitBody = body || breakingBody || issuesBody || \"\";\n\n\tif (commitBody) {\n\t\treturn leadingBlankFn(\n\t\t\tmaxLineLength < Infinity\n\t\t\t\t? wrap(commitBody, {\n\t\t\t\t\t\twidth: maxLineLength,\n\t\t\t\t\t\ttrim: true,\n\t\t\t\t\t\tindent: \"\",\n\t\t\t\t\t})\n\t\t\t\t: commitBody.trim(),\n\t\t);\n\t} else {\n\t\treturn \"\";\n\t}\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/SectionFooter.test.ts",
    "content": "import { describe, test, expect, beforeEach } from \"vitest\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport { combineCommitMessage, getQuestions } from \"./SectionFooter.js\";\nimport { setPromptConfig } from \"./store/prompts.js\";\nimport { setRules } from \"./store/rules.js\";\n\nbeforeEach(() => {\n\tsetRules({});\n\tsetPromptConfig({});\n});\ndescribe(\"getQuestions\", () => {\n\ttest(\"should only ask questions that listed in prompt question config\", () => {\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tfooter: {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"<footer> holds further meta data, such as breaking changes and issue ids\",\n\t\t\t\t},\n\t\t\t\tissues: {\n\t\t\t\t\tdescription: \"<issues> link\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst questions = getQuestions();\n\n\t\texpect(questions).toHaveLength(2);\n\t\texpect(questions).toEqual([\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"issues\",\n\t\t\t}),\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"footer\",\n\t\t\t}),\n\t\t]);\n\t});\n\n\ttest(\"should not have break change as default\", () => {\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tisBreaking: {\n\t\t\t\t\tdescription: \"Are there any breaking changes?\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst questions = getQuestions();\n\t\texpect(questions).toEqual([\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"isBreaking\",\n\t\t\t\tdefault: false,\n\t\t\t}),\n\t\t]);\n\t});\n\n\ttest(\"should ask for break change info when have break change\", () => {\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tisBreaking: {\n\t\t\t\t\tdescription: \"Are there any breaking changes?\",\n\t\t\t\t},\n\t\t\t\tbreaking: {\n\t\t\t\t\tdescription: \"Describe the breaking changes\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst questions = getQuestions();\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisBreaking: false,\n\t\t\t}),\n\t\t).toBe(false);\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisBreaking: true,\n\t\t\t}),\n\t\t).toBe(true);\n\t});\n\n\ttest(\"should ask for body info when have break change but does not have body message\", () => {\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tisBreaking: {\n\t\t\t\t\tdescription: \"Describe the breaking changes\",\n\t\t\t\t},\n\t\t\t\tbreakingBody: {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst questions = getQuestions();\n\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisBreaking: true,\n\t\t\t}),\n\t\t).toBe(true);\n\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisBreaking: true,\n\t\t\t\tbody: \"xxx\",\n\t\t\t}),\n\t\t).toBe(false);\n\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisBreaking: false,\n\t\t\t}),\n\t\t).toBe(false);\n\t});\n\n\ttest(\"should change does not affect any issues as default\", () => {\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tisIssueAffected: {\n\t\t\t\t\tdescription: \"Does this change affect any open issues?\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst questions = getQuestions();\n\t\texpect(questions).toEqual([\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"isIssueAffected\",\n\t\t\t\tdefault: false,\n\t\t\t}),\n\t\t]);\n\t});\n\n\ttest(\"should ask for issue info when have issue affected\", () => {\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tisIssueAffected: {\n\t\t\t\t\tdescription: \"Does this change affect any open issues?\",\n\t\t\t\t},\n\t\t\t\tissues: {\n\t\t\t\t\tdescription: 'Add issue references (e.g. \"fix #123\", \"re #123\".)',\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst questions = getQuestions();\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisIssueAffected: false,\n\t\t\t}),\n\t\t).toBe(false);\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisIssueAffected: true,\n\t\t\t}),\n\t\t).toBe(true);\n\t});\n\n\ttest(\"should ask for body info when have issue affected but does not have body message\", () => {\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tisIssueAffected: {\n\t\t\t\t\tdescription: \"Does this change affect any open issues?\",\n\t\t\t\t},\n\t\t\t\tissuesBody: {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"If issues are closed, the commit requires a body. Please enter a longer description of the commit itself\",\n\t\t\t\t},\n\t\t\t\tissues: {\n\t\t\t\t\tdescription: 'Add issue references (e.g. \"fix #123\", \"re #123\".)',\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst questions = getQuestions();\n\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisIssueAffected: true,\n\t\t\t}),\n\t\t).toBe(true);\n\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisIssueAffected: true,\n\t\t\t\tbody: \"xxx\",\n\t\t\t}),\n\t\t).toBe(false);\n\n\t\texpect(\n\t\t\t(questions[1].when as any)({\n\t\t\t\tisIssueAffected: false,\n\t\t\t\tbreaking: \"xxxxx\",\n\t\t\t}),\n\t\t).toBe(false);\n\t});\n});\n\ndescribe(\"combineCommitMessage\", () => {\n\ttest('should return BreakChange start with \"BREAKING CHANGE: \"', () => {\n\t\tlet commitMessage = combineCommitMessage({\n\t\t\tbreaking: \"BREAKING CHANGE: xxxxxx\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"BREAKING CHANGE: xxxxxx\");\n\n\t\tcommitMessage = combineCommitMessage({\n\t\t\tbreaking: \"xxxxxx\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"BREAKING CHANGE: xxxxxx\");\n\t});\n\ttest(\"should return correct string with BreakChange,issue,footer\", () => {\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tissues:\n\t\t\t\t\"https://github.com/conventional-changelog/commitlint/issues/2507\",\n\t\t\tbreaking: \"BREAKING CHANGE: xxxxxx\",\n\t\t\tfooter: \"Other footer information.\",\n\t\t});\n\t\texpect(commitMessage).toBe(\n\t\t\t\"BREAKING CHANGE: xxxxxx\\nhttps://github.com/conventional-changelog/commitlint/issues/2507\\nOther footer information.\",\n\t\t);\n\t});\n\n\ttest(\"should return wrap string with footer-max-line-length\", () => {\n\t\tsetRules({\n\t\t\t\"footer-max-line-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tissues:\n\t\t\t\t\"https://github.com/conventional-changelog/commitlint/issues/2507\",\n\t\t\tbreaking: \"BREAKING CHANGE: xxxxxx\",\n\t\t\tfooter: \"Other footer information.\",\n\t\t});\n\t\texpect(commitMessage).toBe(\n\t\t\t\"BREAKING\\nCHANGE:\\nxxxxxx\\nhttps://github.com/conventional-changelog/commitlint/issues/2507\\nOther\\nfooter\\ninformation.\",\n\t\t);\n\t});\n\n\ttest(\"should auto leading blank when footer-leading-blank is set\", () => {\n\t\tsetRules({\n\t\t\t\"footer-max-line-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t\t\"footer-leading-blank\": [RuleConfigSeverity.Error, \"always\"],\n\t\t});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tissues:\n\t\t\t\t\"https://github.com/conventional-changelog/commitlint/issues/2507\",\n\t\t\tbreaking: \"BREAKING CHANGE: xxxxxx\",\n\t\t\tfooter: \"Other footer information.\",\n\t\t});\n\t\texpect(commitMessage).toBe(\n\t\t\t\"\\nBREAKING\\nCHANGE:\\nxxxxxx\\nhttps://github.com/conventional-changelog/commitlint/issues/2507\\nOther\\nfooter\\ninformation.\",\n\t\t);\n\t});\n\n\ttest(\"when does not have break change\", () => {\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tissues:\n\t\t\t\t\"https://github.com/conventional-changelog/commitlint/issues/2507\",\n\t\t\tfooter: \"Other footer information.\",\n\t\t});\n\t\texpect(commitMessage).toBe(\n\t\t\t\"https://github.com/conventional-changelog/commitlint/issues/2507\\nOther footer information.\",\n\t\t);\n\t});\n\n\ttest(\"when does not have issue\", () => {\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tfooter: \"Other footer information.\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"Other footer information.\");\n\t});\n});\n\ndescribe(\"FooterQuestion\", () => {\n\ttest(\"should limited by footer maxLength and minLength\", () => {\n\t\tsetRules({\n\t\t\t\"footer-max-length\": [RuleConfigSeverity.Error, \"always\", 30],\n\t\t\t\"footer-min-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t});\n\t\tsetPromptConfig({\n\t\t\tmessages: {\n\t\t\t\tskip: \"(press enter to skip)\",\n\t\t\t\tmax: \"upper %d chars\",\n\t\t\t\tmin: \"%d chars at least\",\n\t\t\t\temptyWarning: \"%s can not be empty\",\n\t\t\t\tupperLimitWarning: \"%s: %s over limit %d\",\n\t\t\t\tlowerLimitWarning: \"%s: %s below limit %d\",\n\t\t\t},\n\t\t\tquestions: {\n\t\t\t\tbreaking: {\n\t\t\t\t\tdescription: \"Describe the breaking changes\",\n\t\t\t\t},\n\t\t\t\tissues: {\n\t\t\t\t\tdescription: \"<issues> link\",\n\t\t\t\t},\n\t\t\t\tfooter: {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"<footer> holds further meta data, such as breaking changes and issue ids\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst questions = getQuestions();\n\t\tconst answers = {\n\t\t\tbreaking: \"BREAKING CHANGE: xxxxxx\",\n\t\t\tissues: \"\".padEnd(6, \"y\"),\n\t\t};\n\n\t\tconst lastQuestion = questions[2];\n\n\t\t(lastQuestion.message as any)(answers);\n\t\texpect(lastQuestion?.validate?.(\"\".padEnd(10, \"z\"), answers)).toBe(\n\t\t\t\"footer: footer over limit 11\",\n\t\t);\n\t});\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/SectionFooter.ts",
    "content": "import { PromptName } from \"@commitlint/types\";\nimport { Answers, DistinctQuestion } from \"inquirer\";\nimport wrap from \"word-wrap\";\n\nimport Question, { QuestionConfig } from \"./Question.js\";\nimport getRuleQuestionConfig from \"./services/getRuleQuestionConfig.js\";\nimport { getPromptMessages, getPromptQuestions } from \"./store/prompts.js\";\nimport { getRule } from \"./store/rules.js\";\nimport getLeadingBlankFn from \"./utils/leading-blank-fn.js\";\nimport { getMaxLength } from \"./utils/rules.js\";\n\nexport class FooterQuestion extends Question {\n\tfooterMaxLength: number;\n\tfooterMinLength: number;\n\tconstructor(\n\t\tname: PromptName,\n\t\tquestionConfig: QuestionConfig,\n\t\tfooterMaxLength?: number,\n\t\tfooterMinLength?: number,\n\t) {\n\t\tsuper(name, questionConfig);\n\t\tthis.footerMaxLength = footerMaxLength ?? Infinity;\n\t\tthis.footerMinLength = footerMinLength ?? 0;\n\t}\n\tbeforeQuestionStart(answers: Answers): void {\n\t\tconst footerRemainLength =\n\t\t\tthis.footerMaxLength - combineCommitMessage(answers).length - \"\\n\".length;\n\t\tthis.maxLength = Math.min(this.maxLength, footerRemainLength);\n\t\tthis.minLength = Math.min(this.minLength, this.footerMinLength);\n\t}\n}\n\nexport function getQuestions(): Array<DistinctQuestion> {\n\tconst footerQuestionConfig = getRuleQuestionConfig(\"footer\");\n\n\tif (!footerQuestionConfig) return [];\n\n\tconst footerMaxLength = footerQuestionConfig.maxLength;\n\tconst footerMinLength = footerQuestionConfig.minLength;\n\n\tconst fields: PromptName[] = [\n\t\t\"isBreaking\",\n\t\t\"breakingBody\",\n\t\t\"breaking\",\n\t\t\"isIssueAffected\",\n\t\t\"issuesBody\",\n\t\t\"issues\",\n\t\t\"footer\",\n\t];\n\n\treturn fields\n\t\t.filter((name) => name in getPromptQuestions())\n\t\t.map((name) => {\n\t\t\tconst questions = getPromptQuestions();\n\n\t\t\tconst questionConfigs = {\n\t\t\t\ttitle: questions[name]?.description ?? \"\",\n\t\t\t\tmessages: getPromptMessages(),\n\t\t\t\tfooterMaxLength,\n\t\t\t\tfooterMinLength,\n\t\t\t};\n\n\t\t\tif (name === \"isBreaking\") {\n\t\t\t\tObject.assign(questionConfigs, {\n\t\t\t\t\tdefaultValue: false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (name === \"breakingBody\") {\n\t\t\t\tObject.assign(questionConfigs, {\n\t\t\t\t\twhen: (answers: Answers) => {\n\t\t\t\t\t\treturn answers.isBreaking && !answers.body;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (name === \"breaking\") {\n\t\t\t\tObject.assign(questionConfigs, {\n\t\t\t\t\twhen: (answers: Answers) => {\n\t\t\t\t\t\treturn answers.isBreaking;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (name === \"isIssueAffected\") {\n\t\t\t\tObject.assign(questionConfigs, {\n\t\t\t\t\tdefaultValue: false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (name === \"issuesBody\") {\n\t\t\t\tObject.assign(questionConfigs, {\n\t\t\t\t\twhen: (answers: Answers) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tanswers.isIssueAffected && !answers.body && !answers.breakingBody\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (name === \"issues\") {\n\t\t\t\tObject.assign(questionConfigs, {\n\t\t\t\t\twhen: (answers: Answers) => {\n\t\t\t\t\t\treturn answers.isIssueAffected;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (name === \"footer\") {\n\t\t\t\tObject.assign(questionConfigs, {\n\t\t\t\t\t...footerQuestionConfig,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst instance = new FooterQuestion(\n\t\t\t\tname,\n\t\t\t\tquestionConfigs,\n\t\t\t\tfooterMaxLength,\n\t\t\t\tfooterMinLength,\n\t\t\t);\n\n\t\t\treturn instance.question;\n\t\t});\n}\n\nexport function combineCommitMessage(answers: Answers): string {\n\t// TODO references-empty\n\t// TODO signed-off-by\n\tconst maxLineLength = getMaxLength(getRule(\"footer\", \"max-line-length\"));\n\tconst leadingBlankFn = getLeadingBlankFn(getRule(\"footer\", \"leading-blank\"));\n\n\tconst { footer, breaking, issues } = answers;\n\tconst footerNotes: string[] = [];\n\n\tif (breaking) {\n\t\tconst BREAKING_CHANGE = \"BREAKING CHANGE: \";\n\t\tconst message =\n\t\t\tBREAKING_CHANGE + breaking.replace(new RegExp(`^${BREAKING_CHANGE}`), \"\");\n\t\tfooterNotes.push(\n\t\t\tmaxLineLength < Infinity\n\t\t\t\t? wrap(message, {\n\t\t\t\t\t\twidth: maxLineLength,\n\t\t\t\t\t\ttrim: true,\n\t\t\t\t\t\tindent: \"\",\n\t\t\t\t\t})\n\t\t\t\t: message.trim(),\n\t\t);\n\t}\n\n\tif (issues) {\n\t\tfooterNotes.push(\n\t\t\tmaxLineLength < Infinity\n\t\t\t\t? wrap(issues, {\n\t\t\t\t\t\twidth: maxLineLength,\n\t\t\t\t\t\ttrim: true,\n\t\t\t\t\t\tindent: \"\",\n\t\t\t\t\t})\n\t\t\t\t: issues.trim(),\n\t\t);\n\t}\n\n\tif (footer) {\n\t\tfooterNotes.push(\n\t\t\tmaxLineLength < Infinity\n\t\t\t\t? wrap(footer, {\n\t\t\t\t\t\twidth: maxLineLength,\n\t\t\t\t\t\ttrim: true,\n\t\t\t\t\t\tindent: \"\",\n\t\t\t\t\t})\n\t\t\t\t: footer,\n\t\t);\n\t}\n\n\treturn leadingBlankFn(footerNotes.join(\"\\n\"));\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/SectionHeader.test.ts",
    "content": "import { describe, test, expect, beforeEach } from \"vitest\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport {\n\tcombineCommitMessage,\n\tgetQuestions,\n\tgetQuestionConfig,\n} from \"./SectionHeader.js\";\nimport { setPromptConfig } from \"./store/prompts.js\";\nimport { setRules } from \"./store/rules.js\";\n\nbeforeEach(() => {\n\tsetRules({});\n\tsetPromptConfig({\n\t\tsettings: {\n\t\t\tscopeEnumSeparator: \",\",\n\t\t\tenableMultipleScopes: false,\n\t\t\tuseExclamationMark: false,\n\t\t},\n\t});\n});\ndescribe(\"getQuestions\", () => {\n\ttest(\"should contain 'type','scope','subject'\", () => {\n\t\tconst questions = getQuestions();\n\t\texpect(questions).toHaveLength(3);\n\t\texpect(questions).toEqual([\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"type\",\n\t\t\t}),\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"scope\",\n\t\t\t}),\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"subject\",\n\t\t\t}),\n\t\t]);\n\t});\n\n\ttest(\"should exclude question when must be empty\", () => {\n\t\tsetRules({\n\t\t\t\"scope-empty\": [RuleConfigSeverity.Error, \"always\"],\n\t\t});\n\t\tconst questions = getQuestions();\n\t\texpect(questions).toHaveLength(2);\n\t\texpect(questions).toEqual([\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"type\",\n\t\t\t}),\n\t\t\texpect.objectContaining({\n\t\t\t\tname: \"subject\",\n\t\t\t}),\n\t\t]);\n\t});\n});\n\ndescribe(\"getQuestionConfig\", () => {\n\ttest(\"should 'scope' supports multiple items separated with ',\\\\/'\", () => {\n\t\tconst config = getQuestionConfig(\"scope\");\n\t\texpect(config).toEqual(\n\t\t\texpect.objectContaining({\n\t\t\t\tmultipleValueDelimiters: /\\/|\\\\|,/g,\n\t\t\t}),\n\t\t);\n\t});\n\n\ttest(\"should 'scope' supports multiple select separated with settings.scopeEnumSeparator and enableMultipleScopes\", () => {\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tscopeEnumSeparator: \"/\",\n\t\t\t\tenableMultipleScopes: true,\n\t\t\t},\n\t\t});\n\t\tconst config = getQuestionConfig(\"scope\");\n\t\texpect(config).toEqual(\n\t\t\texpect.objectContaining({\n\t\t\t\tmultipleSelectDefaultDelimiter: \"/\",\n\t\t\t}),\n\t\t);\n\t});\n\n\ttest(\"should 'scope' disable multiple select by default\", () => {\n\t\tconst config = getQuestionConfig(\"scope\");\n\t\texpect(config).not.toContain(\"multipleSelectDefaultDelimiter\");\n\t});\n});\n\ndescribe(\"combineCommitMessage\", () => {\n\ttest(\"should return correct string when type,scope,subject are not empty\", () => {\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\ttype: \"build\",\n\t\t\tscope: \"typescript\",\n\t\t\tsubject: \"update tsconfig.json\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"build(typescript): update tsconfig.json\");\n\t});\n\ttest(\"when type is empty\", () => {\n\t\tlet commitMessage = combineCommitMessage({\n\t\t\tscope: \"typescript\",\n\t\t\tsubject: \"update tsconfig.json\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"(typescript): update tsconfig.json\");\n\n\t\tcommitMessage = combineCommitMessage({\n\t\t\tscope: \"typescript\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"(typescript)\");\n\t});\n\n\ttest(\"when scope is empty\", () => {\n\t\tlet commitMessage = combineCommitMessage({\n\t\t\ttype: \"build\",\n\t\t\tsubject: \"update tsconfig.json\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"build: update tsconfig.json\");\n\n\t\tcommitMessage = combineCommitMessage({\n\t\t\tsubject: \"update tsconfig.json\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"update tsconfig.json\");\n\t});\n\n\ttest(\"when subject is empty\", () => {\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\ttype: \"build\",\n\t\t\tscope: \"typescript\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"build(typescript)\");\n\t});\n\ttest(\"should add ! after type when isBreaking and useExclamationMark is enabled\", () => {\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tuseExclamationMark: true,\n\t\t\t},\n\t\t});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\ttype: \"feat\",\n\t\t\tsubject: \"add new api\",\n\t\t\tisBreaking: true,\n\t\t});\n\t\texpect(commitMessage).toBe(\"feat!: add new api\");\n\t});\n\n\ttest(\"should add ! after scope when isBreaking and useExclamationMark is enabled\", () => {\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tuseExclamationMark: true,\n\t\t\t},\n\t\t});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\ttype: \"feat\",\n\t\t\tscope: \"api\",\n\t\t\tsubject: \"add new endpoint\",\n\t\t\tisBreaking: true,\n\t\t});\n\t\texpect(commitMessage).toBe(\"feat(api)!: add new endpoint\");\n\t});\n\n\ttest(\"should not add ! when isBreaking but useExclamationMark is disabled (default)\", () => {\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tuseExclamationMark: false,\n\t\t\t},\n\t\t});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\ttype: \"feat\",\n\t\t\tsubject: \"add new api\",\n\t\t\tisBreaking: true,\n\t\t});\n\t\texpect(commitMessage).toBe(\"feat: add new api\");\n\t});\n\n\ttest(\"should not add ! when useExclamationMark is enabled but not breaking\", () => {\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tuseExclamationMark: true,\n\t\t\t},\n\t\t});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\ttype: \"feat\",\n\t\t\tsubject: \"add new api\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"feat: add new api\");\n\t});\n\n\ttest(\"should add ! without subject when isBreaking and useExclamationMark is enabled\", () => {\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tuseExclamationMark: true,\n\t\t\t},\n\t\t});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\ttype: \"feat\",\n\t\t\tscope: \"api\",\n\t\t\tisBreaking: true,\n\t\t});\n\t\texpect(commitMessage).toBe(\"feat(api)!\");\n\t});\n\n\ttest(\"should not add ! when type and scope are both empty\", () => {\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tuseExclamationMark: true,\n\t\t\t},\n\t\t});\n\t\tconst commitMessage = combineCommitMessage({\n\t\t\tisBreaking: true,\n\t\t\tsubject: \"drop support\",\n\t\t});\n\t\texpect(commitMessage).toBe(\"drop support\");\n\t});\n});\n\ndescribe(\"HeaderQuestion\", () => {\n\ttest(\"should limited by header maxLength and minLength\", () => {\n\t\tsetRules({\n\t\t\t\"header-max-length\": [RuleConfigSeverity.Error, \"always\", 20],\n\t\t\t\"header-min-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t\t\"subject-max-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t\t\"subject-min-length\": [RuleConfigSeverity.Error, \"always\", 5],\n\t\t});\n\t\tsetPromptConfig({\n\t\t\tmessages: {\n\t\t\t\tskip: \"(press enter to skip)\",\n\t\t\t\tmax: \"upper %d chars\",\n\t\t\t\tmin: \"%d chars at least\",\n\t\t\t\temptyWarning: \"%s can not be empty\",\n\t\t\t\tupperLimitWarning: \"%s: %s over limit %d\",\n\t\t\t\tlowerLimitWarning: \"%s: %s below limit %d\",\n\t\t\t},\n\t\t});\n\n\t\tconst questions = getQuestions();\n\t\tconst answers = {\n\t\t\ttype: \"\".padEnd(8, \"x\"),\n\t\t\tscope: \"\".padEnd(6, \"y\"),\n\t\t};\n\n\t\tconst lastQuestion = questions[2];\n\t\t(lastQuestion.message as any)(answers);\n\t\texpect(lastQuestion?.validate?.(\"\".padEnd(10, \"z\"), answers)).toBe(\n\t\t\t\"subject: subject over limit 6\",\n\t\t);\n\t});\n\n\ttest(\"should reserve 1 char for '!' when useExclamationMark is enabled\", () => {\n\t\tconst headerMaxLength = 20;\n\t\tconst type = \"refactor\";\n\t\tconst scope = \"config\";\n\t\t// \"refactor(config)\" = 16 chars\n\t\tconst charsUsed = `${type}(${scope})`.length; // 16\n\t\tconst charsAvailable = headerMaxLength - charsUsed - 1; // -1 for '!'\n\t\tsetRules({\n\t\t\t\"header-max-length\": [\n\t\t\t\tRuleConfigSeverity.Error,\n\t\t\t\t\"always\",\n\t\t\t\theaderMaxLength,\n\t\t\t],\n\t\t\t\"subject-max-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t});\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tuseExclamationMark: true,\n\t\t\t},\n\t\t\tmessages: {\n\t\t\t\tskip: \"(press enter to skip)\",\n\t\t\t\tmax: \"upper %d chars\",\n\t\t\t\tmin: \"%d chars at least\",\n\t\t\t\temptyWarning: \"%s can not be empty\",\n\t\t\t\tupperLimitWarning: \"%s: %s over limit %d\",\n\t\t\t\tlowerLimitWarning: \"%s: %s below limit %d\",\n\t\t\t},\n\t\t});\n\t\tconst questions = getQuestions();\n\t\tconst answers = { type, scope };\n\t\tconst subject = questions[2];\n\t\t(subject.message as any)(answers);\n\n\t\texpect(\"fix\".length).toBeLessThanOrEqual(charsAvailable);\n\t\texpect(subject?.validate?.(\"fix\", answers)).toBe(true);\n\t\texpect(\"test\".length).toBeGreaterThan(charsAvailable);\n\t\texpect(subject?.validate?.(\"test\", answers)).toBe(\n\t\t\t\"subject: subject over limit 1\",\n\t\t);\n\t});\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/SectionHeader.ts",
    "content": "import { PromptName, RuleField } from \"@commitlint/types\";\nimport { Answers, DistinctQuestion } from \"inquirer\";\n\nimport Question, { QuestionConfig } from \"./Question.js\";\nimport getRuleQuestionConfig from \"./services/getRuleQuestionConfig.js\";\nimport { getPromptSettings } from \"./store/prompts.js\";\n\nexport class HeaderQuestion extends Question {\n\theaderMaxLength: number;\n\theaderMinLength: number;\n\tconstructor(\n\t\tname: PromptName,\n\t\tquestionConfig: QuestionConfig,\n\t\theaderMaxLength?: number,\n\t\theaderMinLength?: number,\n\t) {\n\t\tsuper(name, questionConfig);\n\t\tthis.headerMaxLength = headerMaxLength ?? Infinity;\n\t\tthis.headerMinLength = headerMinLength ?? 0;\n\t}\n\tbeforeQuestionStart(answers: Answers): void {\n\t\tconst headerRemainLength =\n\t\t\tthis.headerMaxLength - combineCommitMessage(answers).length;\n\t\t// Reserve 1 char for '!' when useExclamationMark is enabled.\n\t\tconst reservedLength = getPromptSettings()[\"useExclamationMark\"] ? 1 : 0;\n\t\tconst remainingLength = Math.max(0, headerRemainLength - reservedLength);\n\t\tthis.maxLength = Math.min(this.maxLength, remainingLength);\n\t\tthis.minLength = Math.min(this.minLength, this.headerMinLength);\n\t}\n}\n\nexport function combineCommitMessage(answers: Answers): string {\n\tconst { type = \"\", scope = \"\", subject = \"\", isBreaking } = answers;\n\tconst hasPrefix = Boolean(type || scope);\n\tconst breakingMark =\n\t\thasPrefix && isBreaking && getPromptSettings()[\"useExclamationMark\"]\n\t\t\t? \"!\"\n\t\t\t: \"\";\n\tconst prefix = `${type}${scope ? `(${scope})` : \"\"}${breakingMark}`;\n\n\tif (subject) {\n\t\treturn ((prefix ? prefix + \": \" : \"\") + subject).trim();\n\t} else {\n\t\treturn prefix.trim();\n\t}\n}\n\nexport function getQuestions(): Array<DistinctQuestion> {\n\t// header: type, scope, subject\n\tconst questions: Array<DistinctQuestion> = [];\n\n\tconst headerRuleFields: RuleField[] = [\"type\", \"scope\", \"subject\"];\n\tconst headerRuleQuestionConfig = getRuleQuestionConfig(\"header\");\n\n\tif (!headerRuleQuestionConfig) {\n\t\treturn [];\n\t}\n\n\theaderRuleFields.forEach((name) => {\n\t\tconst questionConfig = getQuestionConfig(name);\n\t\tif (questionConfig) {\n\t\t\tconst instance = new HeaderQuestion(\n\t\t\t\tname,\n\t\t\t\tquestionConfig,\n\t\t\t\theaderRuleQuestionConfig.maxLength,\n\t\t\t\theaderRuleQuestionConfig.minLength,\n\t\t\t);\n\t\t\tquestions.push(instance.question);\n\t\t}\n\t});\n\treturn questions;\n}\n\nexport function getQuestionConfig(\n\tname: RuleField,\n): ReturnType<typeof getRuleQuestionConfig> {\n\tconst questionConfig = getRuleQuestionConfig(name);\n\n\tif (questionConfig) {\n\t\tif (name === \"scope\") {\n\t\t\tif (getPromptSettings()[\"enableMultipleScopes\"]) {\n\t\t\t\tquestionConfig.multipleSelectDefaultDelimiter =\n\t\t\t\t\tgetPromptSettings()[\"scopeEnumSeparator\"];\n\t\t\t}\n\t\t\t// split scope string to segments, match commitlint rules\n\t\t\tquestionConfig.multipleValueDelimiters = /\\/|\\\\|,/g;\n\t\t}\n\t}\n\n\treturn questionConfig;\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/index.ts",
    "content": "import load from \"@commitlint/load\";\nimport type { Answers, DistinctQuestion } from \"inquirer\";\n\nimport process from \"./Process.js\";\n\ntype Commit = (message: string) => void;\n/**\n * Entry point for commitizen\n * @param  inquirerIns instance passed by commitizen, unused\n * @param commit callback to execute with complete commit message\n * @return {void}\n */\nexport function prompter(\n\tinquirerIns: {\n\t\tprompt(questions: DistinctQuestion[]): Promise<Answers>;\n\t},\n\tcommit: Commit,\n): void {\n\tload().then(({ rules, prompt = {} }) => {\n\t\tprocess(rules, prompt, inquirerIns).then(commit);\n\t});\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.test.ts",
    "content": "import { RuleConfigSeverity } from \"@commitlint/types\";\nimport { describe, expect, test } from \"vitest\";\n\nimport { setPromptConfig } from \"../store/prompts.js\";\nimport { setRules } from \"../store/rules.js\";\nimport getRuleQuestionConfig from \"./getRuleQuestionConfig.js\";\n\n// let rules = {};\n\n// let rules: QualifiedRules = {};\n// const getRules = jest.fn().mockReturnValue(rules);\n\ndescribe(\"empty rule\", () => {\n\ttest(\"should return null when must be empty\", () => {\n\t\tsetRules({\n\t\t\t\"body-empty\": [RuleConfigSeverity.Error, \"always\"],\n\t\t});\n\t\texpect(getRuleQuestionConfig(\"body\")).toBe(null);\n\t});\n\n\ttest(\"should field 'skip' be false when can not be empty\", () => {\n\t\tsetRules({\n\t\t\t\"body-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t});\n\t\texpect(getRuleQuestionConfig(\"body\")?.skip).toBe(false);\n\t});\n\n\ttest('should field \"skip\" be true when not set empty rule', () => {\n\t\tsetRules({\n\t\t\t\"body-case\": [RuleConfigSeverity.Warning, \"never\", \"camel-case\"],\n\t\t\t\"body-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t});\n\t\texpect(getRuleQuestionConfig(\"body\")?.skip).toBe(true);\n\t});\n\n\ttest('should field \"skip\" be true when disable empty rule', () => {\n\t\tsetRules({\n\t\t\t\"body-empty\": [RuleConfigSeverity.Disabled],\n\t\t});\n\n\t\texpect(getRuleQuestionConfig(\"body\")?.skip).toBe(true);\n\n\t\tsetRules({\n\t\t\t\"body-empty\": [RuleConfigSeverity.Disabled, \"always\"],\n\t\t});\n\t\texpect(getRuleQuestionConfig(\"body\")?.skip).toBe(true);\n\n\t\tsetRules({\n\t\t\t\"body-empty\": [RuleConfigSeverity.Disabled, \"never\"],\n\t\t});\n\t\texpect(getRuleQuestionConfig(\"body\")?.skip).toBe(true);\n\t});\n});\n\ndescribe(\"title\", () => {\n\ttest(\"should field 'title' set by 'description config'\", () => {\n\t\tconst TEST_DESC = \"test the description\";\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tbody: {\n\t\t\t\t\tdescription: TEST_DESC,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\texpect(getRuleQuestionConfig(\"body\")?.title).toBe(TEST_DESC);\n\t});\n\n\ttest(\"should field 'title' be default string when without 'description' config\", () => {\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tbody: {},\n\t\t\t},\n\t\t});\n\n\t\texpect(getRuleQuestionConfig(\"body\")?.title).toBe(\"body:\");\n\t});\n});\n\ndescribe(\"enum list\", () => {\n\ttest(\"should enumList be undefined when without enum rule\", () => {\n\t\tsetRules({\n\t\t\t\"scope-case\": [RuleConfigSeverity.Warning, \"never\", \"camel-case\"],\n\t\t});\n\n\t\texpect(getRuleQuestionConfig(\"scope\")?.enumList).toBeUndefined();\n\t});\n\n\ttest(\"should enumList be undefined when enum rule is not active\", () => {\n\t\tsetRules({\n\t\t\t\"scope-enum\": [RuleConfigSeverity.Disabled],\n\t\t});\n\t\texpect(getRuleQuestionConfig(\"scope\")?.enumList).toBeUndefined();\n\n\t\tsetRules({\n\t\t\t\"scope-enum\": [\n\t\t\t\tRuleConfigSeverity.Error,\n\t\t\t\t\"never\",\n\t\t\t\t[\"cli\", \"core\", \"lint\"],\n\t\t\t],\n\t\t});\n\t\texpect(getRuleQuestionConfig(\"scope\")?.enumList).toBeUndefined();\n\n\t\tsetRules({\n\t\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"always\"],\n\t\t} as any);\n\t\texpect(getRuleQuestionConfig(\"scope\")?.enumList).toBeUndefined();\n\t});\n\n\ttest(\"should enumList be undefined when enum rule is not a array\", () => {\n\t\tsetRules({\n\t\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"always\", {}],\n\t\t} as any);\n\n\t\texpect(getRuleQuestionConfig(\"scope\")?.enumList).toBeUndefined();\n\t});\n\n\ttest(\"should enumList same with enum rule when without 'enum' config\", () => {\n\t\tconst ENUM_RULE_LIST = [\"cli\", \"core\", \"lint\"];\n\t\tsetRules({\n\t\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tscope: {\n\t\t\t\t\tdescription: \"test scope\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"scope\")?.enumList;\n\t\texpect(enumList).not.toBe(ENUM_RULE_LIST);\n\t\texpect(enumList).toEqual(ENUM_RULE_LIST);\n\t});\n\n\ttest(\"should enumList item concat description\", () => {\n\t\tconst ENUM_RULE_LIST = [\"cli\", \"core\", \"lint\"];\n\t\tsetRules({\n\t\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tscope: {\n\t\t\t\t\tdescription: \"test scope\",\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tcli: {\n\t\t\t\t\t\t\tdescription: \"CLI\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcore: {\n\t\t\t\t\t\t\tdescription: \"CORE\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlint: {},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"scope\")?.enumList;\n\t\texpect(enumList).toHaveLength(3);\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\tname: expect.stringMatching(/cli:[\\s]*CLI/),\n\t\t\t\tvalue: \"cli\",\n\t\t\t\tshort: \"cli\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: expect.stringMatching(/core:[\\s]*CORE/),\n\t\t\t\tvalue: \"core\",\n\t\t\t\tshort: \"core\",\n\t\t\t},\n\t\t\t\"lint\",\n\t\t]);\n\t});\n\n\ttest(\"should enumList item padding format with 4 blank\", () => {\n\t\tconst LONGEST = 12;\n\t\tconst longestItem = \"\".padEnd(LONGEST, \"x\");\n\t\tconst enumRuleList = [\"cli\", \"core\", longestItem];\n\t\tsetRules({\n\t\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"always\", enumRuleList],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tscope: {\n\t\t\t\t\tdescription: \"test scope\",\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tcli: {\n\t\t\t\t\t\t\tdescription: \"Test CLI\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcore: {\n\t\t\t\t\t\t\tdescription: \"Test CORE\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[longestItem]: {\n\t\t\t\t\t\t\tdescription: \"Test\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"scope\")?.enumList;\n\t\texpect(enumList).toHaveLength(3);\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\tname: expect.stringMatching(\n\t\t\t\t\tnew RegExp(`^cli:[\\\\s]{${LONGEST - 4 + 4}}Test CLI$`),\n\t\t\t\t),\n\t\t\t\tvalue: \"cli\",\n\t\t\t\tshort: \"cli\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: expect.stringMatching(\n\t\t\t\t\tnew RegExp(`^core:[\\\\s]{${LONGEST - 5 + 4}}Test CORE$`),\n\t\t\t\t),\n\t\t\t\tvalue: \"core\",\n\t\t\t\tshort: \"core\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: expect.stringMatching(\n\t\t\t\t\tnew RegExp(`^${longestItem}:[\\\\s]{${-1 + 4}}Test$`),\n\t\t\t\t),\n\t\t\t\tvalue: longestItem,\n\t\t\t\tshort: longestItem,\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest(\"should enumList item sorted by 'enum' config order\", () => {\n\t\tconst ENUM_RULE_LIST = [\"cli\", \"core\", \"lint\"];\n\t\tsetRules({\n\t\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\tscope: {\n\t\t\t\t\tdescription: \"test scope\",\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tcore: {},\n\t\t\t\t\t\tlint: {},\n\t\t\t\t\t\tcli: {},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"scope\")?.enumList;\n\t\texpect(enumList).toHaveLength(3);\n\t\texpect(enumList?.[0]).toBe(\"core\");\n\t\texpect(enumList?.[1]).toBe(\"lint\");\n\t\texpect(enumList?.[2]).toBe(\"cli\");\n\t});\n\n\ttest(\"should format enum items with emojis and descriptions, ensuring consistent spacing\", () => {\n\t\tconst ENUM_RULE_LIST = [\"feat\", \"fix\", \"chore\"];\n\t\tsetRules({\n\t\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tfeat: {\n\t\t\t\t\t\t\tdescription: \"Features\",\n\t\t\t\t\t\t\temoji: \"✨\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: {\n\t\t\t\t\t\t\tdescription: \"Bug fixes\",\n\t\t\t\t\t\t\temoji: \"🐛\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchore: {\n\t\t\t\t\t\t\tdescription: \"Chore\",\n\t\t\t\t\t\t\temoji: \"♻️\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"type\")?.enumList;\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\tname: \"✨  feat:    Features\",\n\t\t\t\tvalue: \"feat\",\n\t\t\t\tshort: \"feat\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"🐛  fix:     Bug fixes\",\n\t\t\t\tvalue: \"fix\",\n\t\t\t\tshort: \"fix\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"♻️  chore:   Chore\",\n\t\t\t\tvalue: \"chore\",\n\t\t\t\tshort: \"chore\",\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest(\"should handle custom alignment for emoji and description with extra space\", () => {\n\t\tconst ENUM_RULE_LIST = [\"feat\", \"fix\", \"chore\"];\n\t\tsetRules({\n\t\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tfeat: {\n\t\t\t\t\t\t\tdescription: \"Features\",\n\t\t\t\t\t\t\temoji: \"✨ \",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: {\n\t\t\t\t\t\t\tdescription: \"Bug fixes\",\n\t\t\t\t\t\t\temoji: \"🐛  \",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchore: {\n\t\t\t\t\t\t\tdescription: \"Chore\",\n\t\t\t\t\t\t\temoji: \"♻️   \",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"type\")?.enumList;\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\tname: \"✨   feat:    Features\",\n\t\t\t\tvalue: \"feat\",\n\t\t\t\tshort: \"feat\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"🐛    fix:     Bug fixes\",\n\t\t\t\tvalue: \"fix\",\n\t\t\t\tshort: \"fix\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"♻️     chore:   Chore\",\n\t\t\t\tvalue: \"chore\",\n\t\t\t\tshort: \"chore\",\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest(\"should handle inconsistent emoji usage by using 4 blank spaces as a prefix\", () => {\n\t\tconst ENUM_RULE_LIST = [\"feat\", \"fix\", \"chore\"];\n\t\tsetRules({\n\t\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tfeat: {\n\t\t\t\t\t\t\tdescription: \"Features\",\n\t\t\t\t\t\t\temoji: \"✨\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: {\n\t\t\t\t\t\t\tdescription: \"Bug fixes\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchore: {\n\t\t\t\t\t\t\tdescription: \"Chore\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"type\")?.enumList;\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\tname: \"✨  feat:    Features\",\n\t\t\t\tvalue: \"feat\",\n\t\t\t\tshort: \"feat\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"    fix:     Bug fixes\",\n\t\t\t\tvalue: \"fix\",\n\t\t\t\tshort: \"fix\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"    chore:   Chore\",\n\t\t\t\tvalue: \"chore\",\n\t\t\t\tshort: \"chore\",\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest(\"should normalize emojis missing VS16 (U+FE0F) for consistent terminal alignment\", () => {\n\t\tconst ENUM_RULE_LIST = [\"build\", \"revert\", \"ci\"];\n\t\tsetRules({\n\t\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tbuild: {\n\t\t\t\t\t\t\tdescription: \"Build system changes\",\n\t\t\t\t\t\t\temoji: \"🛠\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\trevert: {\n\t\t\t\t\t\t\tdescription: \"Reverts a commit\",\n\t\t\t\t\t\t\temoji: \"🗑\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tci: {\n\t\t\t\t\t\t\tdescription: \"CI config changes\",\n\t\t\t\t\t\t\temoji: \"⚙️\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"type\")?.enumList;\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\tname: \"🛠\\uFE0F  build:    Build system changes\",\n\t\t\t\tvalue: \"build\",\n\t\t\t\tshort: \"build\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"🗑\\uFE0F  revert:   Reverts a commit\",\n\t\t\t\tvalue: \"revert\",\n\t\t\t\tshort: \"revert\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"⚙️  ci:       CI config changes\",\n\t\t\t\tvalue: \"ci\",\n\t\t\t\tshort: \"ci\",\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest(\"should handle no enums having emojis correctly\", () => {\n\t\tconst ENUM_RULE_LIST = [\"feat\", \"fix\", \"chore\"];\n\t\tsetRules({\n\t\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tfeat: {\n\t\t\t\t\t\t\tdescription: \"Features\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: {\n\t\t\t\t\t\t\tdescription: \"Bug fixes\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchore: {\n\t\t\t\t\t\t\tdescription: \"Chore\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"type\")?.enumList;\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\tname: \"feat:    Features\",\n\t\t\t\tvalue: \"feat\",\n\t\t\t\tshort: \"feat\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"fix:     Bug fixes\",\n\t\t\t\tvalue: \"fix\",\n\t\t\t\tshort: \"fix\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"chore:   Chore\",\n\t\t\t\tvalue: \"chore\",\n\t\t\t\tshort: \"chore\",\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest(\"should include the emoji in the value when `emojiInHeader` is true\", () => {\n\t\tconst ENUM_RULE_LIST = [\"feat\", \"fix\", \"build\", \"revert\"];\n\t\tsetRules({\n\t\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\temojiInHeader: true,\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tfeat: {\n\t\t\t\t\t\t\tdescription: \"Features\",\n\t\t\t\t\t\t\temoji: \"✨\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: {\n\t\t\t\t\t\t\tdescription: \"Bug fixes\",\n\t\t\t\t\t\t\temoji: \"🐛\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuild: {\n\t\t\t\t\t\t\tdescription: \"Build changes\",\n\t\t\t\t\t\t\temoji: \"🛠\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\trevert: {\n\t\t\t\t\t\t\tdescription: \"Revert commit\",\n\t\t\t\t\t\t\temoji: \"🗑\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"type\")?.enumList;\n\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\t// ✨ is Emoji_Presentation (width 2). No \\uFE0F added.\n\t\t\t\tname: \"✨  feat:     Features\",\n\t\t\t\tvalue: \"✨ feat\",\n\t\t\t\tshort: \"feat\",\n\t\t\t},\n\t\t\t{\n\t\t\t\t// 🐛 is Emoji_Presentation (width 2). No \\uFE0F added.\n\t\t\t\tname: \"🐛  fix:      Bug fixes\",\n\t\t\t\tvalue: \"🐛 fix\",\n\t\t\t\tshort: \"fix\",\n\t\t\t},\n\t\t\t{\n\t\t\t\t// 🛠 is NOT presentation-default. \\uFE0F IS added.\n\t\t\t\tname: \"🛠\\uFE0F  build:    Build changes\",\n\t\t\t\tvalue: \"🛠\\uFE0F build\",\n\t\t\t\tshort: \"build\",\n\t\t\t},\n\t\t\t{\n\t\t\t\t// 🗑 is NOT presentation-default. \\uFE0F IS added.\n\t\t\t\tname: \"🗑\\uFE0F  revert:   Revert commit\",\n\t\t\t\tvalue: \"🗑\\uFE0F revert\",\n\t\t\t\tshort: \"revert\",\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest(\"should correctly normalize emojis with skin tone modifiers\", () => {\n\t\tconst ENUM_RULE_LIST = [\"build\", \"mod\", \"sparkle\"];\n\t\tsetRules({\n\t\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\temojiInHeader: true,\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tbuild: {\n\t\t\t\t\t\t\tdescription: \"Base wrench\",\n\t\t\t\t\t\t\temoji: \"🛠\", // U+1F6E0\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmod: {\n\t\t\t\t\t\t\tdescription: \"Wrench with skin tone\",\n\t\t\t\t\t\t\temoji: \"🛠🏽\", // U+1F6E0 + U+1F3FD\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsparkle: {\n\t\t\t\t\t\t\tdescription: \"Naturally wide with skin tone\",\n\t\t\t\t\t\t\temoji: \"👍🏽\", // U+1F44D + U+1F3FD (Thumbs up is Emoji_Presentation)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"type\")?.enumList;\n\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\tname: \"🛠\\uFE0F  build:     Base wrench\",\n\t\t\t\tvalue: \"🛠\\uFE0F build\",\n\t\t\t\tshort: \"build\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"🛠\\uFE0F🏽  mod:       Wrench with skin tone\",\n\t\t\t\tvalue: \"🛠\\uFE0F🏽 mod\",\n\t\t\t\tshort: \"mod\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"👍🏽  sparkle:   Naturally wide with skin tone\",\n\t\t\t\tvalue: \"👍🏽 sparkle\",\n\t\t\t\tshort: \"sparkle\",\n\t\t\t},\n\t\t]);\n\t});\n\n\ttest(\"should trim empty spaces from emoji in the answer\", () => {\n\t\tconst ENUM_RULE_LIST = [\"feat\", \"fix\", \"chore\"];\n\t\tsetRules({\n\t\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", ENUM_RULE_LIST],\n\t\t} as any);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\temojiInHeader: true,\n\t\t\t\t\tenum: {\n\t\t\t\t\t\tfeat: {\n\t\t\t\t\t\t\tdescription: \"Features\",\n\t\t\t\t\t\t\temoji: \"✨ \",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfix: {\n\t\t\t\t\t\t\tdescription: \"Bug fixes\",\n\t\t\t\t\t\t\temoji: \"🐛  \",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchore: {\n\t\t\t\t\t\t\tdescription: \"Chore\",\n\t\t\t\t\t\t\temoji: \"♻️   \",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst enumList = getRuleQuestionConfig(\"type\")?.enumList;\n\t\texpect(enumList).toEqual([\n\t\t\t{\n\t\t\t\tname: \"✨   feat:    Features\",\n\t\t\t\tvalue: \"✨ feat\",\n\t\t\t\tshort: \"feat\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"🐛    fix:     Bug fixes\",\n\t\t\t\tvalue: \"🐛 fix\",\n\t\t\t\tshort: \"fix\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"♻️     chore:   Chore\",\n\t\t\t\tvalue: \"♻️ chore\",\n\t\t\t\tshort: \"chore\",\n\t\t\t},\n\t\t]);\n\t});\n});\n\ntest(\"should return correct question config\", () => {\n\tsetRules({\n\t\t\"body-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t\"body-case\": [RuleConfigSeverity.Error, \"always\", \"sentence-case\"],\n\t\t\"body-full-stop\": [RuleConfigSeverity.Error, \"always\", \"!\"],\n\t\t\"body-min-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t\"body-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"always\", [\"cli\", \"core\", \"lint\"]],\n\t} as any);\n\n\tconst MESSAGES = {\n\t\tskip: \":skip\",\n\t\tmax: \"upper %d chars\",\n\t\tmin: \"%d chars at least\",\n\t\temptyWarning: \"can not be empty\",\n\t\tupperLimitWarning: \"over limit\",\n\t\tlowerLimitWarning: \"below limit\",\n\t};\n\tsetPromptConfig({\n\t\tmessages: MESSAGES,\n\t\tquestions: {\n\t\t\tbody: {\n\t\t\t\tdescription: \"please input body: (Test)\",\n\t\t\t},\n\t\t\tscope: {\n\t\t\t\tdescription: \"please choose the scope: (Test)\",\n\t\t\t\tenum: {\n\t\t\t\t\tcore: {\n\t\t\t\t\t\tdescription: \"CORE\",\n\t\t\t\t\t},\n\t\t\t\t\tlint: {\n\t\t\t\t\t\tdescription: \"LINT\",\n\t\t\t\t\t},\n\t\t\t\t\tcli: {\n\t\t\t\t\t\tdescription: \"CLI\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t});\n\n\tconst scopeQuestionConfig = getRuleQuestionConfig(\"scope\");\n\texpect(scopeQuestionConfig).toEqual({\n\t\tskip: true,\n\t\ttitle: \"please choose the scope: (Test)\",\n\t\tmessages: MESSAGES,\n\t\tminLength: 0,\n\t\tmaxLength: Infinity,\n\t\tenumList: [\n\t\t\t{\n\t\t\t\tname: \"core:   CORE\",\n\t\t\t\tvalue: \"core\",\n\t\t\t\tshort: \"core\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"lint:   LINT\",\n\t\t\t\tvalue: \"lint\",\n\t\t\t\tshort: \"lint\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"cli:    CLI\",\n\t\t\t\tvalue: \"cli\",\n\t\t\t\tshort: \"cli\",\n\t\t\t},\n\t\t],\n\t\tcaseFn: expect.any(Function),\n\t\tfullStopFn: expect.any(Function),\n\t});\n\texpect(scopeQuestionConfig?.caseFn?.(\"xxxx\")).toBe(\"xxxx\");\n\texpect(scopeQuestionConfig?.fullStopFn?.(\"xxxx\")).toBe(\"xxxx\");\n\n\tconst bodyQuestionConfig = getRuleQuestionConfig(\"body\");\n\texpect(bodyQuestionConfig).toEqual({\n\t\tskip: false,\n\t\ttitle: \"please input body: (Test)\",\n\t\tmessages: MESSAGES,\n\t\tminLength: 10,\n\t\tmaxLength: 100,\n\t\tenumList: undefined,\n\t\tcaseFn: expect.any(Function),\n\t\tfullStopFn: expect.any(Function),\n\t});\n\texpect(bodyQuestionConfig?.caseFn?.(\"xxxx\")).toBe(\"Xxxx\");\n\texpect(bodyQuestionConfig?.fullStopFn?.(\"xxxx\")).toBe(\"xxxx!\");\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/services/getRuleQuestionConfig.ts",
    "content": "/// <reference lib=\"es2023.intl\" />\nimport { RuleField } from \"@commitlint/types\";\nimport { QuestionConfig } from \"../Question.js\";\nimport { getPromptMessages, getPromptQuestions } from \"../store/prompts.js\";\nimport { getRule } from \"../store/rules.js\";\nimport getCaseFn from \"../utils/case-fn.js\";\nimport getFullStopFn from \"../utils/full-stop-fn.js\";\nimport {\n\tenumRuleIsActive,\n\tgetEnumList,\n\tgetMaxLength,\n\tgetMinLength,\n\truleIsActive,\n\truleIsApplicable,\n\truleIsDisabled,\n} from \"../utils/rules.js\";\n\ninterface GraphemeSegment {\n\tsegment: string;\n\tindex: number;\n\tinput: string;\n\tisWordLike?: boolean;\n}\n\nconst segmenter = new Intl.Segmenter(\"en\", { granularity: \"grapheme\" });\nconst isPresentation = /^\\p{Emoji_Presentation}/u;\nconst isEmojiBase = /^\\p{Emoji}/u;\n\n/**\n * Normalizes emojis to ensure a consistent 2-column width in terminals by appending\n * Variation Selector 16 (U+FE0F).\n * * Emojis like ✨ (U+2728) are \"Emoji_Presentation\" by default and render at width 2.\n * However, \"text-style\" emojis like 🛠 (U+1F6E0) or 🗑 (U+1F5D1) default to width 1\n * in many terminals, breaking column alignment.\n * * This function identifies single-grapheme emojis lacking presentation properties\n * and inserts the VS16 immediately after the base character (before modifiers\n * like skin tones) to force graphical rendering without breaking ZWJ sequences.\n * @param emoji The emoji string to normalize.\n * @returns The normalized emoji string with VS16 inserted where necessary.\n */\nfunction normalizeEmoji(emoji: string): string {\n\tconst trimmed = emoji.replace(/\\s+$/, \"\");\n\tconst trailing = emoji.slice(trimmed.length);\n\n\tif (trimmed.length === 0) return emoji;\n\n\tconst segments = Array.from(segmenter.segment(trimmed)) as GraphemeSegment[];\n\n\tif (segments.length === 1) {\n\t\tconst cluster = segments[0].segment;\n\t\tconst codePoints = Array.from(cluster);\n\t\tconst baseChar = codePoints[0];\n\n\t\tswitch (true) {\n\t\t\tcase cluster.includes(\"\\uFE0F\"):\n\t\t\tcase cluster.includes(\"\\uFE0E\"):\n\t\t\t\treturn emoji;\n\n\t\t\tcase isPresentation.test(baseChar):\n\t\t\t\treturn emoji;\n\n\t\t\t// 3. If the base char is an Emoji base but not presentation:\n\t\t\tcase isEmojiBase.test(baseChar) && !/^[0-9#*]$/.test(baseChar): {\n\t\t\t\t// Reconstruct: Base + VS16 + the rest of the cluster (skin tones, ZWJs, etc.)\n\t\t\t\tconst normalizedCluster =\n\t\t\t\t\tbaseChar + \"\\uFE0F\" + codePoints.slice(1).join(\"\");\n\t\t\t\treturn normalizedCluster + trailing;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn emoji;\n}\n\nexport default function (rulePrefix: RuleField): QuestionConfig | null {\n\tconst questions = getPromptQuestions();\n\tconst questionSettings = questions[rulePrefix];\n\tconst emptyRule = getRule(rulePrefix, \"empty\");\n\n\tconst mustBeEmpty =\n\t\temptyRule && ruleIsActive(emptyRule) && ruleIsApplicable(emptyRule);\n\n\tif (mustBeEmpty) {\n\t\treturn null;\n\t}\n\n\tconst canBeSkip = !emptyRule || ruleIsDisabled(emptyRule);\n\n\tconst enumRule = getRule(rulePrefix, \"enum\");\n\tconst enumRuleList =\n\t\tenumRule && enumRuleIsActive(enumRule) ? getEnumList(enumRule) : null;\n\tlet enumList;\n\n\tif (enumRuleList) {\n\t\tconst enumDescriptions = questionSettings?.[\"enum\"];\n\t\tconst emojiInHeader = questionSettings?.emojiInHeader;\n\n\t\tif (enumDescriptions) {\n\t\t\tconst enumNames = Object.keys(enumDescriptions);\n\t\t\tconst longest = Math.max(\n\t\t\t\t...enumRuleList.map((enumName) => enumName.length),\n\t\t\t);\n\t\t\tconst firstHasEmoji =\n\t\t\t\t(enumDescriptions[enumNames[0]]?.emoji?.length ?? 0) > 0;\n\t\t\tconst hasConsistentEmojiUsage = !enumRuleList.some(\n\t\t\t\t(enumName) =>\n\t\t\t\t\t(enumDescriptions[enumName]?.emoji?.length ?? 0) > 0 !==\n\t\t\t\t\tfirstHasEmoji,\n\t\t\t);\n\t\t\tenumList = enumRuleList\n\t\t\t\t.sort((a, b) => enumNames.indexOf(a) - enumNames.indexOf(b))\n\t\t\t\t.map((enumName) => {\n\t\t\t\t\tconst enumDescription = enumDescriptions[enumName]?.description;\n\t\t\t\t\tif (enumDescription) {\n\t\t\t\t\t\tconst rawEmoji = enumDescriptions[enumName]?.emoji;\n\t\t\t\t\t\tconst emoji = rawEmoji ? normalizeEmoji(rawEmoji) : rawEmoji;\n\n\t\t\t\t\t\tconst emojiPrefix = emoji\n\t\t\t\t\t\t\t? `${emoji}  `\n\t\t\t\t\t\t\t: hasConsistentEmojiUsage\n\t\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t\t: \"    \";\n\n\t\t\t\t\t\tconst paddedName = `${enumName}:`.padEnd(longest + 4);\n\n\t\t\t\t\t\tconst name = `${emojiPrefix}${paddedName}${enumDescription}`;\n\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\temojiInHeader && emoji ? `${emoji.trim()} ${enumName}` : enumName;\n\n\t\t\t\t\t\treturn { name, value, short: enumName };\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn enumName;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} else {\n\t\t\tenumList = [...enumRuleList];\n\t\t}\n\t}\n\n\treturn {\n\t\tskip: canBeSkip,\n\t\tenumList,\n\t\ttitle: questionSettings?.[\"description\"] ?? `${rulePrefix}:`,\n\t\tcaseFn: getCaseFn(getRule(rulePrefix, \"case\")),\n\t\tfullStopFn: getFullStopFn(getRule(rulePrefix, \"full-stop\")),\n\t\tminLength: getMinLength(getRule(rulePrefix, \"min-length\")),\n\t\tmaxLength: getMaxLength(getRule(rulePrefix, \"max-length\")),\n\t\tmessages: getPromptMessages(),\n\t};\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/store/defaultPromptConfigs.ts",
    "content": "export default {\n\tsettings: {\n\t\tscopeEnumSeparator: \",\",\n\t\tenableMultipleScopes: false,\n\t\tuseExclamationMark: false,\n\t},\n\tmessages: {\n\t\tskip: \"(press enter to skip)\",\n\t\tmax: \"(max %d chars)\",\n\t\tmin: \"(min %d chars)\",\n\t\temptyWarning: \"(%s is required)\",\n\t\tupperLimitWarning: \"%s is %d characters longer than the upper limit\",\n\t\tlowerLimitWarning: \"%s is %d characters less than the lower limit\",\n\t},\n\tquestions: {\n\t\ttype: {\n\t\t\tdescription: \"<type> holds information about the goal of a change.\",\n\t\t},\n\t\tscope: {\n\t\t\tdescription:\n\t\t\t\t\"<scope> marks which sub-component of the project is affected\",\n\t\t},\n\t\tsubject: {\n\t\t\tdescription: \"<subject> is a short, high-level description of the change\",\n\t\t},\n\t\tbody: {\n\t\t\tdescription: \"<body> holds additional information about the change\",\n\t\t},\n\t\tfooter: {\n\t\t\tdescription:\n\t\t\t\t\"<footer> holds further meta data, such as breaking changes and issue ids\",\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/store/prompts.test.ts",
    "content": "import { describe, test, expect, vi, beforeEach } from \"vitest\";\nimport * as prompts from \"./prompts.js\";\n\nlet getPromptQuestions: typeof prompts.getPromptQuestions;\nlet getPromptMessages: typeof prompts.getPromptMessages;\nlet getPromptSettings: typeof prompts.getPromptSettings;\nlet setPromptConfig: typeof prompts.setPromptConfig;\n\nbeforeEach(async () => {\n\tvi.resetModules();\n\t({\n\t\tgetPromptQuestions,\n\t\tgetPromptMessages,\n\t\tgetPromptSettings,\n\t\tsetPromptConfig,\n\t} = await import(\"./prompts.js\"));\n});\n\ndescribe(\"setPromptConfig\", () => {\n\ttest(\"should cover questions when prompt config questions is plain object\", () => {\n\t\tconst promptConfig = {\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\tdescription: \"input type\",\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tsetPromptConfig(promptConfig);\n\t\texpect(getPromptQuestions()).toBe(promptConfig.questions);\n\t});\n\n\ttest(\"should not set questions when prompt config questions is not a plain object\", () => {\n\t\tconst initialQuestions = { ...getPromptQuestions() };\n\t\tsetPromptConfig({\n\t\t\tquestions: null,\n\t\t} as any);\n\t\texpect(getPromptQuestions()).toEqual(initialQuestions);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: \"questions\",\n\t\t} as any);\n\t\texpect(getPromptQuestions()).toEqual(initialQuestions);\n\n\t\tsetPromptConfig({\n\t\t\tquestions: [1, 2, 3],\n\t\t} as any);\n\t\texpect(getPromptQuestions()).toEqual(initialQuestions);\n\t});\n\n\ttest(\"should merge message when prompt config message is string\", () => {\n\t\tconst initialMessages = { ...getPromptMessages() };\n\t\tconst promptConfig = {\n\t\t\tmessages: {\n\t\t\t\temptyWarning: \"(%s can not be empty)\",\n\t\t\t},\n\t\t};\n\t\tsetPromptConfig(promptConfig);\n\n\t\texpect(getPromptMessages()[\"emptyWarning\"]).toBe(\n\t\t\tpromptConfig.messages.emptyWarning,\n\t\t);\n\t\texpect(getPromptMessages()[\"lowerLimitWarning\"]).toBe(\n\t\t\tinitialMessages[\"lowerLimitWarning\"],\n\t\t);\n\t});\n\n\ttest(\"should not merge message when prompt config message is not a string\", () => {\n\t\tconst initialMessages = { ...getPromptMessages() };\n\t\tconst promptConfig = {\n\t\t\tmessages: {\n\t\t\t\temptyWarning: \"(%s can not be empty)\",\n\t\t\t\tmin: function () {\n\t\t\t\t\treturn \"min:\";\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tsetPromptConfig(promptConfig as any);\n\n\t\texpect(getPromptMessages()[\"emptyWarning\"]).toBe(\n\t\t\tpromptConfig.messages.emptyWarning,\n\t\t);\n\t\texpect(getPromptMessages()[\"min\"]).toBe(initialMessages[\"min\"]);\n\t});\n\n\ttest(\"should ignore non-essential message\", () => {\n\t\tconst initialMessages = { ...getPromptMessages() };\n\t\tconst promptConfig = {\n\t\t\tmessages: {\n\t\t\t\tmore: \"learn more\",\n\t\t\t},\n\t\t};\n\t\tsetPromptConfig(promptConfig);\n\t\texpect(getPromptMessages()).toEqual(initialMessages);\n\t});\n\n\ttest(\"should fields be independent\", () => {\n\t\tconst initialQuestions = { ...getPromptQuestions() };\n\t\tsetPromptConfig({\n\t\t\tmessages: {\n\t\t\t\temptyWarning: \"(%s can not be empty)\",\n\t\t\t},\n\t\t});\n\t\texpect(getPromptQuestions()).toEqual(initialQuestions);\n\n\t\tconst initialMessages = { ...getPromptMessages() };\n\t\tsetPromptConfig({\n\t\t\tquestions: {\n\t\t\t\ttype: {\n\t\t\t\t\tdescription: \"input type\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\texpect(getPromptMessages()).toEqual(initialMessages);\n\t});\n\n\ttest('should settings scopeEnumSeparator be set when value is \",\\\\/\"', () => {\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tscopeEnumSeparator: \"/\",\n\t\t\t},\n\t\t});\n\t\texpect(getPromptSettings()[\"scopeEnumSeparator\"]).toEqual(\"/\");\n\n\t\tconst processExit = vi\n\t\t\t.spyOn(process, \"exit\")\n\t\t\t.mockImplementation(() => undefined as never);\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tscopeEnumSeparator: \"-\",\n\t\t\t},\n\t\t});\n\t\texpect(processExit).toHaveBeenCalledWith(1);\n\t\tprocessExit.mockClear();\n\t});\n\n\ttest(\"should pass on settings\", () => {\n\t\tsetPromptConfig({\n\t\t\tsettings: {\n\t\t\t\tenableMultipleScopes: true,\n\t\t\t},\n\t\t});\n\t\texpect(getPromptSettings()[\"enableMultipleScopes\"]).toEqual(true);\n\t});\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/store/prompts.ts",
    "content": "import type { PromptConfig, UserPromptConfig } from \"@commitlint/types\";\nimport isPlainObject from \"is-plain-obj\";\n\nimport defaultPromptConfigs from \"./defaultPromptConfigs.js\";\n\nconst storeKey = Symbol(\"promptConfig\");\n\nconst store: {\n\t[storeKey]: PromptConfig;\n} = {\n\t[storeKey]: defaultPromptConfigs,\n};\n\nexport function setPromptConfig(newPromptConfig: UserPromptConfig): void {\n\tconst { settings, messages, questions } = newPromptConfig;\n\tif (messages) {\n\t\tconst requiredMessageKeys = Object.keys(defaultPromptConfigs.messages);\n\t\trequiredMessageKeys.forEach((key: string) => {\n\t\t\tconst message = messages[key];\n\t\t\tif (typeof message === \"string\") {\n\t\t\t\tstore[storeKey][\"messages\"][key] = message;\n\t\t\t}\n\t\t});\n\t}\n\n\tif (questions && isPlainObject(questions)) {\n\t\tstore[storeKey][\"questions\"] = questions;\n\t}\n\n\tif (settings && isPlainObject(settings)) {\n\t\tif (\n\t\t\tsettings[\"scopeEnumSeparator\"] &&\n\t\t\t!/^\\/|\\\\|,$/.test(settings[\"scopeEnumSeparator\"])\n\t\t) {\n\t\t\tconsole.log(\n\t\t\t\t`prompt.settings.scopeEnumSeparator must be one of ',', '\\\\', '/'.`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tstore[storeKey][\"settings\"] = {\n\t\t\t...defaultPromptConfigs.settings,\n\t\t\t...settings,\n\t\t};\n\t}\n}\n\nexport function getPromptMessages(): Readonly<PromptConfig[\"messages\"]> {\n\treturn (store[storeKey] && store[storeKey][\"messages\"]) ?? {};\n}\n\nexport function getPromptQuestions(): Readonly<PromptConfig[\"questions\"]> {\n\treturn (store[storeKey] && store[storeKey][\"questions\"]) ?? {};\n}\n\nexport function getPromptSettings(): Readonly<PromptConfig[\"settings\"]> {\n\treturn (store[storeKey] && store[storeKey][\"settings\"]) ?? {};\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/store/rules.test.ts",
    "content": "import { describe, test, expect, vi, beforeEach } from \"vitest\";\nimport { QualifiedRules, RuleConfigSeverity } from \"@commitlint/types\";\n\nimport { GetRuleMethod, SetRulesMethod } from \"./rules.js\";\n\nlet getRule: GetRuleMethod;\nlet setRules: SetRulesMethod;\n\nbeforeEach(async () => {\n\tvi.resetModules();\n\t({ getRule, setRules } = await import(\"./rules.js\"));\n});\n\ndescribe(\"getRule\", () => {\n\ttest(\"should get rule when prefix and property strict match\", () => {\n\t\tconst rules: QualifiedRules = {\n\t\t\t\"body-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\t\"footer-max-line-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\t\"subject-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t};\n\t\tsetRules(rules);\n\n\t\texpect(getRule(\"body\", \"max-length\")).toBe(rules[\"body-max-length\"]);\n\t\texpect(getRule(\"footer\", \"max-line-length\")).toBe(\n\t\t\trules[\"footer-max-line-length\"],\n\t\t);\n\t\texpect(getRule(\"subject\", \"empty\")).toBe(rules[\"subject-empty\"]);\n\t});\n\n\ttest(\"should not get rule when prefix is invalid\", () => {\n\t\tconst rules: QualifiedRules = {\n\t\t\t\"body-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t};\n\t\tsetRules(rules);\n\n\t\texpect(getRule(\"body-max\", \"length\")).toBeUndefined();\n\t\texpect(getRule(\"body-max\", \"max-length\")).toBeUndefined();\n\t\texpect(getRule(\"\", \"body-max-length\")).toBeUndefined();\n\t});\n\n\ttest(\"should not get rule when property is partial match\", () => {\n\t\tconst rules: QualifiedRules = {\n\t\t\t\"body-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\t\"body-leading-blank\": [RuleConfigSeverity.Warning, \"always\"],\n\t\t};\n\t\tsetRules(rules);\n\n\t\texpect(getRule(\"body\", \"length\")).toBeUndefined();\n\t\texpect(getRule(\"body\", \"line-leading-blank\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"setRule\", () => {\n\ttest(\"should overwrite all rules when setRule\", () => {\n\t\texpect(getRule(\"body\", \"max-length\")).toBeUndefined();\n\n\t\tlet rules: QualifiedRules = {\n\t\t\t\"body-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t};\n\t\tsetRules(rules);\n\t\texpect(getRule(\"body\", \"max-length\")).toBe(rules[\"body-max-length\"]);\n\n\t\trules = {\n\t\t\t\"footer-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t};\n\t\tsetRules(rules);\n\t\texpect(getRule(\"body\", \"max-length\")).toBeUndefined();\n\t\texpect(getRule(\"footer\", \"max-length\")).toBe(rules[\"footer-max-length\"]);\n\t});\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/store/rules.ts",
    "content": "import { QualifiedRules } from \"@commitlint/types\";\n\nimport type { Rule } from \"../types.js\";\n\nconst storeKey = Symbol(\"rules\");\n\nconst store: {\n\t[storeKey]: QualifiedRules;\n} = {\n\t[storeKey]: {},\n};\n\nexport function getRule(key: string, property: string): Rule | undefined {\n\tif (key.split(\"-\").length > 1) {\n\t\treturn;\n\t}\n\treturn store[storeKey][`${key}-${property}`];\n}\n\nexport function setRules(newRules: QualifiedRules): void {\n\tstore[storeKey] = newRules;\n}\n\nexport type GetRuleMethod = typeof getRule;\nexport type SetRulesMethod = typeof setRules;\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/types.ts",
    "content": "import { RuleConfigCondition, RuleConfigSeverity } from \"@commitlint/types\";\n\nexport type Rule =\n\t| Readonly<[RuleConfigSeverity.Disabled]>\n\t| Readonly<[RuleConfigSeverity, RuleConfigCondition]>\n\t| Readonly<[RuleConfigSeverity, RuleConfigCondition, unknown]>;\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/utils/case-fn.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport getCaseFn from \"./case-fn.js\";\n\ntest(\"should not transform when rule is disabled\", () => {\n\tlet rule = getCaseFn([RuleConfigSeverity.Disabled]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test-foo\")).toBe(\"test-foo\");\n\texpect(rule(\"testFoo\")).toBe(\"testFoo\");\n\texpect(rule(\"TEST_FOO\")).toBe(\"TEST_FOO\");\n\n\trule = getCaseFn();\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test-foo\")).toBe(\"test-foo\");\n\texpect(rule(\"testFoo\")).toBe(\"testFoo\");\n\texpect(rule(\"TEST_FOO\")).toBe(\"TEST_FOO\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"never\"]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test-foo\")).toBe(\"test-foo\");\n\texpect(rule(\"testFoo\")).toBe(\"testFoo\");\n\texpect(rule(\"TEST_FOO\")).toBe(\"TEST_FOO\");\n});\n\ntest(\"should throw error on invalid casing\", () => {\n\tlet rule = getCaseFn([RuleConfigSeverity.Warning, \"always\"]);\n\texpect(() => rule(\"test\")).toThrow('Unknown target case \"undefined\"');\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"foo\"]);\n\texpect(() => rule(\"test\")).toThrow('Unknown target case \"foo\"');\n});\n\ntest(\"should transform text correctly with single case\", () => {\n\tlet rule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"camel-case\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"testFooBarBazBaz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"kebab-case\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test-foo-bar-baz-baz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"snake-case\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test_foo_bar_baz_baz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"pascal-case\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TestFooBarBazBaz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"start-case\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TEST FOO Bar Baz Baz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"upper-case\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TEST_FOOBAR-BAZ BAZ\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"uppercase\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TEST_FOOBAR-BAZ BAZ\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"sentence-case\"]);\n\texpect(rule(\"tEST_FOOBar-baz baz\")).toBe(\"TEST_FOOBar-baz baz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"sentencecase\"]);\n\texpect(rule(\"tEST_FOOBar-baz baz\")).toBe(\"TEST_FOOBar-baz baz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"lower-case\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test_foobar-baz baz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"lowercase\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test_foobar-baz baz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"lowerCase\"]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test_foobar-baz baz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"lowerCase\"]);\n\texpect(rule([\"TEST_FOOBar-baz\", \"bAz\"])).toBe(\"test_foobar-baz,baz\");\n\n\trule = getCaseFn([RuleConfigSeverity.Warning, \"always\", \"lowerCase\"]);\n\texpect(rule([\"TEST_FOOBar-baz\", \"bAz\"], \"|\")).toBe(\"test_foobar-baz|baz\");\n});\n\ntest(\"should transform text correctly with multiple cases\", () => {\n\tconst rule = getCaseFn([\n\t\tRuleConfigSeverity.Warning,\n\t\t\"always\",\n\t\t[\"camel-case\", \"lowercase\"],\n\t]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test-foo\")).toBe(\"test-foo\");\n\texpect(rule(\"testFoo\")).toBe(\"testFoo\");\n\texpect(rule(\"TEST_FOO\")).toBe(\"testFoo\");\n\n\texpect(rule([\"testFoo\", \"test_foo\"])).toBe(\"testFoo,testFoo\");\n\texpect(rule([\"TEST_foo\", \"test_foo\"])).toBe(\"test_foo,test_foo\");\n\texpect(rule([\"TEST_FOO\", \"Test_foo\"])).toBe(\"testFoo,testFoo\");\n\texpect(rule([\"TEST_FOO\", \"Test_foo\"], \"|\")).toBe(\"testFoo|testFoo\");\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/utils/case-fn.ts",
    "content": "import { case as ensureCase, toCase } from \"@commitlint/ensure\";\nimport { TargetCaseType } from \"@commitlint/types\";\n\nimport { Rule } from \"../types.js\";\nimport { ruleIsActive, ruleIsNotApplicable } from \"./rules.js\";\n\nexport type CaseFn = (input: string | string[], delimiter?: string) => string;\n\n/**\n * Get forced case for rule\n * @param rule to parse\n * @return transform function applying the enforced case\n */\nexport default function getCaseFn(rule?: Rule): CaseFn {\n\tconst noop = (input: string | string[], delimiter?: string) =>\n\t\tArray.isArray(input) ? input.join(delimiter) : input;\n\n\tif (!rule || !ruleIsActive(rule) || ruleIsNotApplicable(rule)) {\n\t\treturn noop;\n\t}\n\n\tconst value = rule[2];\n\n\tconst caseList = Array.isArray(value) ? value : [value];\n\n\treturn (input: string | string[], delimiter?: string) => {\n\t\tlet matchedCase: TargetCaseType = caseList[0];\n\t\tconst segments = Array.isArray(input) ? input : [input];\n\n\t\tfor (const segment of segments) {\n\t\t\tconst check = caseList.find((a) => ensureCase(segment, a));\n\t\t\tif (check) {\n\t\t\t\tmatchedCase = check;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn segments\n\t\t\t.map((segment) => {\n\t\t\t\treturn toCase(segment, matchedCase);\n\t\t\t})\n\t\t\t.join(delimiter);\n\t};\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/utils/full-stop-fn.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport getFullStopFn from \"./full-stop-fn.js\";\n\ntest(\"should not apply\", () => {\n\tlet rule = getFullStopFn([RuleConfigSeverity.Disabled]);\n\texpect(rule(\"test.\")).toBe(\"test.\");\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test..\")).toBe(\"test..\");\n\texpect(rule(\"\")).toBe(\"\");\n\n\trule = getFullStopFn();\n\texpect(rule(\"test.\")).toBe(\"test.\");\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test..\")).toBe(\"test..\");\n\texpect(rule(\"\")).toBe(\"\");\n\n\trule = getFullStopFn([RuleConfigSeverity.Disabled, \"always\"]);\n\texpect(rule(\"test.\")).toBe(\"test.\");\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test..\")).toBe(\"test..\");\n\texpect(rule(\"\")).toBe(\"\");\n\n\trule = getFullStopFn([RuleConfigSeverity.Disabled, \"always\", 1]);\n\texpect(rule(\"test.\")).toBe(\"test.\");\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test..\")).toBe(\"test..\");\n\texpect(rule(\"\")).toBe(\"\");\n\n\trule = getFullStopFn([RuleConfigSeverity.Disabled, \"never\"]);\n\texpect(rule(\"test.\")).toBe(\"test.\");\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test..\")).toBe(\"test..\");\n\texpect(rule(\"\")).toBe(\"\");\n\n\trule = getFullStopFn([RuleConfigSeverity.Disabled, \"never\", [\".\"]]);\n\texpect(rule(\"test.\")).toBe(\"test.\");\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test..\")).toBe(\"test..\");\n\texpect(rule(\"\")).toBe(\"\");\n});\n\ntest(\"should add full stop\", () => {\n\tlet rule = getFullStopFn([RuleConfigSeverity.Error, \"always\", \".\"]);\n\texpect(rule(\"test\")).toBe(\"test.\");\n\texpect(rule(\"test.\")).toBe(\"test.\");\n\texpect(rule(\"\")).toBe(\".\");\n\n\trule = getFullStopFn([RuleConfigSeverity.Error, \"always\", \"\\n\"]);\n\texpect(rule(\"test\")).toBe(\"test\\n\");\n\texpect(rule(\"test.\")).toBe(\"test.\\n\");\n\texpect(rule(\"\")).toBe(\"\\n\");\n});\n\ntest(\"should remove full stop\", () => {\n\tlet rule = getFullStopFn([RuleConfigSeverity.Error, \"never\", \".\"]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test.\")).toBe(\"test\");\n\texpect(rule(\"\")).toBe(\"\");\n\texpect(rule(\"test..\")).toBe(\"test\");\n\texpect(rule(\"test.end\")).toBe(\"test.end\");\n\n\trule = getFullStopFn([RuleConfigSeverity.Error, \"never\", \"\\n\"]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test.\")).toBe(\"test.\");\n\texpect(rule(\"test\\n\\n\")).toBe(\"test\");\n\texpect(rule(\"test.\\n\")).toBe(\"test.\");\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/utils/full-stop-fn.ts",
    "content": "import { Rule } from \"../types.js\";\nimport { ruleIsActive, ruleIsNotApplicable } from \"./rules.js\";\n\nexport type FullStopFn = (input: string) => string;\n\n/**\n * Get forced case for rule\n * @param rule to parse\n * @return transform function applying the enforced case\n */\nexport default function getFullStopFn(rule?: Rule): FullStopFn {\n\tconst noop = (_: string) => _;\n\n\tif (!rule || !ruleIsActive(rule)) {\n\t\treturn noop;\n\t}\n\n\tif (typeof rule[2] !== \"string\") return noop;\n\n\tconst symbol: string = rule[2];\n\n\tif (ruleIsNotApplicable(rule)) {\n\t\treturn (input: string) => {\n\t\t\twhile (input.length > 0 && input.endsWith(symbol)) {\n\t\t\t\tinput = input.slice(0, input.length - 1);\n\t\t\t}\n\t\t\treturn input;\n\t\t};\n\t} else {\n\t\treturn (input: string) => {\n\t\t\treturn !input.endsWith(symbol) ? input + symbol : input;\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/utils/leading-blank-fn.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport getLeadingBlankFn from \"./leading-blank-fn.js\";\n\ntest(\"should not apply\", () => {\n\tlet rule = getLeadingBlankFn([RuleConfigSeverity.Disabled]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"\\ntest\")).toBe(\"\\ntest\");\n\texpect(rule(\"aaa\\ntest\")).toBe(\"aaa\\ntest\");\n\texpect(rule(\"\")).toBe(\"\");\n\n\trule = getLeadingBlankFn();\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"\\ntest\")).toBe(\"\\ntest\");\n\texpect(rule(\"aaa\\ntest\")).toBe(\"aaa\\ntest\");\n\texpect(rule(\"\")).toBe(\"\");\n});\n\ntest(\"should add leading blank\", () => {\n\tconst rule = getLeadingBlankFn([RuleConfigSeverity.Error, \"always\"]);\n\texpect(rule(\"test\")).toBe(\"\\ntest\");\n\texpect(rule(\"\\ntest\")).toBe(\"\\ntest\");\n\texpect(rule(\"\\n\\ntest\")).toBe(\"\\n\\ntest\");\n\texpect(rule(\"aaa\\ntest\")).toBe(\"\\naaa\\ntest\");\n\texpect(rule(\"\\naaa\\ntest\")).toBe(\"\\naaa\\ntest\");\n\texpect(rule(\"\")).toBe(\"\");\n});\n\ntest(\"should remove leading blank\", () => {\n\tconst rule = getLeadingBlankFn([RuleConfigSeverity.Error, \"never\"]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"\\ntest\")).toBe(\"test\");\n\texpect(rule(\"\\n\\ntest\")).toBe(\"test\");\n\texpect(rule(\"aaa\\ntest\")).toBe(\"aaa\\ntest\");\n\texpect(rule(\"\\naaa\\ntest\")).toBe(\"aaa\\ntest\");\n\texpect(rule(\"\\n\\n\\naaa\\ntest\")).toBe(\"aaa\\ntest\");\n\texpect(rule(\"\")).toBe(\"\");\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/utils/leading-blank-fn.ts",
    "content": "import type { Rule } from \"../types.js\";\nimport { ruleIsActive, ruleIsNotApplicable } from \"./rules.js\";\n\n/**\n * Get forced leading for rule\n * @param rule to parse\n * @return transform function applying the leading\n */\nexport default function getLeadingBlankFn(\n\trule?: Rule,\n): (input: string) => string {\n\tif (!rule || !ruleIsActive(rule)) {\n\t\treturn (input: string): string => input;\n\t}\n\n\tconst remove = (input: string): string => {\n\t\tconst fragments = input.split(\"\\n\");\n\t\twhile (fragments.length > 0 && fragments[0] === \"\") {\n\t\t\tfragments.shift();\n\t\t}\n\t\treturn fragments.join(\"\\n\");\n\t};\n\tconst lead = (input: string): string => {\n\t\tconst fragments = input.split(\"\\n\");\n\t\treturn fragments[0] === \"\" ? input : [\"\", ...fragments].join(\"\\n\");\n\t};\n\n\treturn !ruleIsNotApplicable(rule) ? lead : remove;\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/utils/rules.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport {\n\tenumRuleIsActive,\n\tgetEnumList,\n\tgetMaxLength,\n\tgetMinLength,\n\truleIsActive,\n\truleIsApplicable,\n\truleIsDisabled,\n\truleIsNotApplicable,\n} from \"./rules.js\";\n\ntest(\"ruleIsDisabled\", () => {\n\texpect(ruleIsDisabled([RuleConfigSeverity.Disabled])).toBe(true);\n\texpect(ruleIsDisabled([RuleConfigSeverity.Disabled, \"never\"])).toBe(true);\n\texpect(ruleIsDisabled([RuleConfigSeverity.Disabled, \"always\"])).toBe(true);\n\texpect(ruleIsDisabled([RuleConfigSeverity.Error] as any)).toBe(false);\n\texpect(ruleIsDisabled([RuleConfigSeverity.Error, \"always\"] as any)).toBe(\n\t\tfalse,\n\t);\n});\n\ntest(\"ruleIsActive\", () => {\n\texpect(ruleIsActive([RuleConfigSeverity.Error, \"always\"])).toBe(true);\n\texpect(ruleIsActive([RuleConfigSeverity.Warning, \"never\"])).toBe(true);\n\texpect(ruleIsActive([RuleConfigSeverity.Disabled, \"always\"])).toBe(false);\n\texpect(ruleIsActive([RuleConfigSeverity.Error] as any)).toBe(true);\n});\n\ntest(\"ruleIsApplicable\", () => {\n\texpect(ruleIsApplicable([RuleConfigSeverity.Error, \"always\"])).toBe(true);\n\texpect(ruleIsApplicable([RuleConfigSeverity.Warning, \"always\"])).toBe(true);\n\texpect(ruleIsApplicable([RuleConfigSeverity.Disabled, \"always\"])).toBe(true);\n\texpect(ruleIsApplicable(undefined as any)).toBe(false);\n\texpect(ruleIsApplicable(\"\" as any)).toBe(false);\n\texpect(ruleIsApplicable([RuleConfigSeverity.Disabled])).toBe(false);\n\texpect(ruleIsApplicable([RuleConfigSeverity.Disabled, \"never\"])).toBe(false);\n});\n\ntest(\"ruleIsNotApplicable\", () => {\n\texpect(ruleIsNotApplicable([RuleConfigSeverity.Error, \"never\"])).toBe(true);\n\texpect(ruleIsNotApplicable([RuleConfigSeverity.Warning, \"never\"])).toBe(true);\n\texpect(ruleIsNotApplicable([RuleConfigSeverity.Disabled, \"never\"])).toBe(\n\t\ttrue,\n\t);\n\texpect(ruleIsNotApplicable(undefined as any)).toBe(false);\n\texpect(ruleIsNotApplicable(\"\" as any)).toBe(false);\n\texpect(ruleIsNotApplicable([RuleConfigSeverity.Error] as any)).toBe(false);\n\texpect(ruleIsNotApplicable([RuleConfigSeverity.Error, \"always\"])).toBe(false);\n\texpect(ruleIsNotApplicable([RuleConfigSeverity.Error, \"always\", 100])).toBe(\n\t\tfalse,\n\t);\n});\n\ntest(\"getMaxLength\", () => {\n\texpect(getMaxLength([RuleConfigSeverity.Error, \"always\", 100])).toBe(100);\n\texpect(getMaxLength([RuleConfigSeverity.Warning, \"never\"])).toBe(Infinity);\n\texpect(getMaxLength([RuleConfigSeverity.Disabled, \"always\"])).toBe(Infinity);\n\texpect(getMaxLength([RuleConfigSeverity.Error] as any)).toBe(Infinity);\n\n\tconst rules: any = {\n\t\t\"body-max-line-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\"header-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\"test-max-length\": [RuleConfigSeverity.Disabled, \"always\", 100],\n\t};\n\tlet lengthRule = rules[\"header-max-length\"];\n\texpect(getMaxLength(lengthRule)).toBe(100);\n\n\tlengthRule = rules[\"body-max-line-length\"];\n\texpect(getMaxLength(lengthRule)).toBe(100);\n\n\tlengthRule = rules[\"body-max-length\"];\n\texpect(getMaxLength(lengthRule)).toBe(Infinity);\n\n\tlengthRule = rules[\"test-max-length\"];\n\texpect(getMaxLength(lengthRule)).toBe(Infinity);\n});\n\ntest(\"getMinLength\", () => {\n\texpect(getMinLength([RuleConfigSeverity.Error, \"always\", 10])).toBe(10);\n\texpect(getMinLength([RuleConfigSeverity.Warning, \"never\"])).toBe(0);\n\texpect(getMinLength([RuleConfigSeverity.Disabled, \"always\"])).toBe(0);\n\texpect(getMinLength([RuleConfigSeverity.Error] as any)).toBe(0);\n\n\tconst rules: any = {\n\t\t\"body-min-length\": [RuleConfigSeverity.Error, \"always\", 10],\n\t\t\"footer-min-length\": [RuleConfigSeverity.Error, \"always\", 20],\n\t\t\"test-min-length\": [RuleConfigSeverity.Disabled, \"always\", 100],\n\t};\n\tlet lengthRule = rules[\"header-min-length\"];\n\texpect(getMinLength(lengthRule)).toBe(0);\n\n\tlengthRule = rules[\"body-min-length\"];\n\texpect(getMinLength(lengthRule)).toBe(10);\n\n\tlengthRule = rules[\"test-min-length\"];\n\texpect(getMinLength(lengthRule)).toBe(0);\n});\n\ntest(\"enumRuleIsActive\", () => {\n\tconst rules: any = {\n\t\t\"enum-string\": [RuleConfigSeverity.Warning, \"always\", [\"1\", \"2\", \"3\"]],\n\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", [\"build\", \"chore\", \"ci\"]],\n\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"never\", [\"cli\", \"core\", \"lint\"]],\n\t\t\"bar-enum\": [RuleConfigSeverity.Disabled, \"always\", [\"foo\", \"bar\", \"baz\"]],\n\t};\n\n\texpect(enumRuleIsActive(rules[\"type-enum\"])).toBe(true);\n\texpect(enumRuleIsActive(rules[\"string-enum\"])).toBe(false);\n\texpect(enumRuleIsActive(rules[\"enum-string\"])).toBe(true);\n\texpect(enumRuleIsActive(rules[\"bar-enum\"])).toBe(false);\n\texpect(enumRuleIsActive(rules[\"scope-enum\"])).toBe(false);\n});\n\ntest(\"getEnumList\", () => {\n\tconst rules: any = {\n\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", [\"build\", \"chore\", \"ci\"]],\n\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"never\", \"\"],\n\t\t\"bar-enum\": [RuleConfigSeverity.Disabled, \"always\"],\n\t};\n\n\texpect(getEnumList(rules[\"type-enum\"])).toEqual([\"build\", \"chore\", \"ci\"]);\n\texpect(getEnumList(rules[\"scope-enum\"])).toEqual([]);\n\texpect(getEnumList(rules[\"bar-enum\"])).toEqual([]);\n});\n"
  },
  {
    "path": "@commitlint/cz-commitlint/src/utils/rules.ts",
    "content": "import { RuleConfigSeverity } from \"@commitlint/types\";\nimport type { Rule } from \"../types.js\";\n\nexport function ruleIsDisabled(\n\trule: Rule,\n): rule is Readonly<[RuleConfigSeverity.Disabled]> {\n\tif (rule && Array.isArray(rule) && rule[0] === RuleConfigSeverity.Disabled) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Check if a rule definition is active\n * @param rule to check\n * @return if the rule definition is active\n */\nexport function ruleIsActive<T extends Rule>(\n\trule: T,\n): rule is Exclude<T, Readonly<[RuleConfigSeverity.Disabled]>> {\n\tif (rule && Array.isArray(rule)) {\n\t\treturn rule[0] > RuleConfigSeverity.Disabled;\n\t}\n\treturn false;\n}\n\n/**\n * Check if a rule definition is applicable\n * @param rule to check\n * @return if the rule definition is applicable\n */\nexport function ruleIsApplicable(\n\trule: Rule,\n): rule is\n\t| Readonly<[RuleConfigSeverity, \"always\"]>\n\t| Readonly<[RuleConfigSeverity, \"always\", unknown]> {\n\tif (rule && Array.isArray(rule)) {\n\t\treturn rule[1] === \"always\";\n\t}\n\treturn false;\n}\n\n/**\n * Check if a rule definition is applicable\n * @param rule to check\n * @return if the rule definition is applicable\n */\nexport function ruleIsNotApplicable(\n\trule: Rule,\n): rule is\n\t| Readonly<[RuleConfigSeverity, \"never\"]>\n\t| Readonly<[RuleConfigSeverity, \"never\", unknown]> {\n\tif (rule && Array.isArray(rule)) {\n\t\treturn rule[1] === \"never\";\n\t}\n\treturn false;\n}\n\nexport function enumRuleIsActive(\n\trule: Rule,\n): rule is Readonly<\n\t[RuleConfigSeverity.Warning | RuleConfigSeverity.Error, \"always\", string[]]\n> {\n\treturn (\n\t\truleIsActive(rule) &&\n\t\truleIsApplicable(rule) &&\n\t\tArray.isArray(rule[2]) &&\n\t\trule[2].length > 0\n\t);\n}\n\nexport function getEnumList(rule: Rule): string[] {\n\treturn Array.isArray(rule[2]) ? rule[2] : [];\n}\n\nexport function getMaxLength(rule?: Rule): number {\n\tif (\n\t\trule &&\n\t\truleIsActive(rule) &&\n\t\truleIsApplicable(rule) &&\n\t\ttypeof rule[2] === \"number\"\n\t) {\n\t\treturn rule[2];\n\t}\n\treturn Infinity;\n}\n\nexport function getMinLength(rule?: Rule): number {\n\tif (\n\t\trule &&\n\t\truleIsActive(rule) &&\n\t\truleIsApplicable(rule) &&\n\t\ttypeof rule[2] === \"number\"\n\t) {\n\t\treturn rule[2];\n\t}\n\treturn 0;\n}\n"
  },
  {
    "path": "@commitlint/cz-commitlint/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./src/**/*-test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../cli\" }]\n}\n"
  },
  {
    "path": "@commitlint/ensure/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n\n### Reverts\n\n* replace all lodash string methods with kasi [#4602](https://github.com/conventional-changelog/commitlint/issues/4602) ([#4621](https://github.com/conventional-changelog/commitlint/issues/4621)) ([5326ab9](https://github.com/conventional-changelog/commitlint/commit/5326ab98a7c68f2f67c46c253f10c087d4570ddd)), closes [#4620](https://github.com/conventional-changelog/commitlint/issues/4620) [#4620](https://github.com/conventional-changelog/commitlint/issues/4620)\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n\n### Bug Fixes\n\n* update dependency glob to v11 [security] ([#4561](https://github.com/conventional-changelog/commitlint/issues/4561)) ([a89a08b](https://github.com/conventional-changelog/commitlint/commit/a89a08b2fd3c72a6cd09e00508fc2e972f27c64c))\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n\n* 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)\n\n\n### BREAKING CHANGES\n\n* when lines contain URLs exceeding the maximum\nline length `body-max-line-length` will be ignored\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n## [7.5.2](https://github.com/conventional-changelog/commitlint/compare/v7.5.1...v7.5.2) (2019-02-11)\n\n### Bug Fixes\n\n- failing sentence-case for subjects with slashes ([#574](https://github.com/conventional-changelog/commitlint/issues/574)) ([48a8602](https://github.com/conventional-changelog/commitlint/commit/48a8602))\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- `sentence-case` allow upper-case characters in first word ([#531](https://github.com/conventional-changelog/commitlint/issues/531)) ([5a6a4a8](https://github.com/conventional-changelog/commitlint/commit/5a6a4a8)), closes [#211](https://github.com/conventional-changelog/commitlint/issues/211)\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- slash in scope [#291](https://github.com/conventional-changelog/commitlint/issues/291) ([#529](https://github.com/conventional-changelog/commitlint/issues/529)) ([b2b63e5](https://github.com/conventional-changelog/commitlint/commit/b2b63e5))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- fall back to conventional commit-parser settings for missing keys ([#496](https://github.com/conventional-changelog/commitlint/issues/496)) ([831a141](https://github.com/conventional-changelog/commitlint/commit/831a141)), closes [#399](https://github.com/conventional-changelog/commitlint/issues/399)\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n### Bug Fixes\n\n- handle case rules for numerics correctly ([cadcfed](https://github.com/conventional-changelog/commitlint/commit/cadcfed))\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n### Features\n\n- add max line length to body/footer ([542f50e](https://github.com/conventional-changelog/commitlint/commit/542f50e))\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n### Bug Fixes\n\n- **ensure:** ignore word delimiters for case matching [#291](https://github.com/conventional-changelog/commitlint/issues/291) ([fa69299](https://github.com/conventional-changelog/commitlint/commit/fa69299))\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/ensure\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n### Bug Fixes\n\n- sanitize ensure.case [#211](https://github.com/conventional-changelog/commitlint/issues/211) ([#217](https://github.com/conventional-changelog/commitlint/issues/217)) ([03aeefc](https://github.com/conventional-changelog/commitlint/commit/03aeefc))\n"
  },
  {
    "path": "@commitlint/ensure/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/ensure/package.json",
    "content": "{\n  \"name\": \"@commitlint/ensure\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/ensure\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/lodash.camelcase\": \"^4.3.8\",\n    \"@types/lodash.kebabcase\": \"^4.1.8\",\n    \"@types/lodash.snakecase\": \"^4.1.8\",\n    \"@types/lodash.startcase\": \"^4.4.8\",\n    \"@types/lodash.upperfirst\": \"^4.3.8\",\n    \"glob\": \"^11.0.0\"\n  },\n  \"dependencies\": {\n    \"@commitlint/types\": \"^20.5.0\",\n    \"lodash.camelcase\": \"^4.3.0\",\n    \"lodash.kebabcase\": \"^4.1.1\",\n    \"lodash.snakecase\": \"^4.1.1\",\n    \"lodash.startcase\": \"^4.4.0\",\n    \"lodash.upperfirst\": \"^4.3.1\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/ensure/src/case.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport ensure from \"./case.js\";\n\ntest(\"true for no params\", () => {\n\tconst actual = ensure();\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for empty\", () => {\n\tconst actual = ensure(\"\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for lowercase\", () => {\n\tconst actual = ensure(\"a\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for uppercase\", () => {\n\tconst actual = ensure(\"A\");\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for lowercase on lowercase\", () => {\n\tconst actual = ensure(\"a\", \"lowercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for uppercase on lowercase\", () => {\n\tconst actual = ensure(\"A\", \"lowercase\");\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for * on lowercase\", () => {\n\tconst actual = ensure(\"*\", \"lowercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for uppercase on uppercase\", () => {\n\tconst actual = ensure(\"A\", \"uppercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for lowercase on uppercase\", () => {\n\tconst actual = ensure(\"a\", \"uppercase\");\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for * on uppercase\", () => {\n\tconst actual = ensure(\"*\", \"uppercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for sentencecase on sentencecase\", () => {\n\tconst actual = ensure(\"Sentence case\", \"sentence-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for lowercase on sentencecase\", () => {\n\tconst actual = ensure(\"sentence case\", \"sentence-case\");\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for UPPERCASE on sentencecase\", () => {\n\tconst actual = ensure(\"UPPERCASE\", \"sentence-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for Start Case on sentencecase\", () => {\n\tconst actual = ensure(\"Start Case\", \"sentence-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for PascalCase on sentencecase\", () => {\n\tconst actual = ensure(\"PascalCase\", \"sentence-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for kebab-case on sentencecase\", () => {\n\tconst actual = ensure(\"kebab-case\", \"sentence-case\");\n\texpect(actual).toBe(false);\n});\n\ntest(\"false for snake_case on sentencecase\", () => {\n\tconst actual = ensure(\"snake_case\", \"sentence-case\");\n\texpect(actual).toBe(false);\n});\n\ntest(\"false for camelCase on sentencecase\", () => {\n\tconst actual = ensure(\"camelCase\", \"sentence-case\");\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for * on sentence-case\", () => {\n\tconst actual = ensure(\"*\", \"sentence-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for * on camel-case\", () => {\n\tconst actual = ensure(\"*\", \"camel-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for * on kebab-case\", () => {\n\tconst actual = ensure(\"*\", \"kebab-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for * on snake-case\", () => {\n\tconst actual = ensure(\"*\", \"snake-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for * on pascal-case\", () => {\n\tconst actual = ensure(\"*\", \"pascal-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for * on start-case\", () => {\n\tconst actual = ensure(\"*\", \"start-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for `Any_CASE_iN_back-quotes` on lowercase\", () => {\n\tconst actual = ensure(\"`Any_CASE_iN_back-quotes`\", \"lowercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for `Any_CASE_iN_back-quotes` on uppercase\", () => {\n\tconst actual = ensure(\"`Any_CASE_iN_back-quotes`\", \"uppercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for `Any_CASE_iN_back-quotes` on sentence-case\", () => {\n\tconst actual = ensure(\"`Any_CASE_iN_back-quotes`\", \"sentence-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for `Any_CASE_iN_back-quotes` on camel-case\", () => {\n\tconst actual = ensure(\"`Any_CASE_iN_back-quotes`\", \"camel-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for `Any_CASE_iN_back-quotes` on kebab-case\", () => {\n\tconst actual = ensure(\"`Any_CASE_iN_back-quotes`\", \"kebab-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for `Any_CASE_iN_back-quotes` on snake-case\", () => {\n\tconst actual = ensure(\"`Any_CASE_iN_back-quotes`\", \"snake-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for `Any_CASE_iN_back-quotes` on pascal-case\", () => {\n\tconst actual = ensure(\"`Any_CASE_iN_back-quotes`\", \"pascal-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for `Any_CASE_iN_back-quotes` on start-case\", () => {\n\tconst actual = ensure(\"`Any_CASE_iN_back-quotes`\", \"start-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for lowercase `Any_CASE_iN_back-quotes` lowercase on lowercase\", () => {\n\tconst actual = ensure(\n\t\t\"lowercase `Any_CASE_iN_back-quotes` lowercase\",\n\t\t\"lowercase\",\n\t);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE on lowercase\", () => {\n\tconst actual = ensure(\n\t\t\"UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE\",\n\t\t\"lowercase\",\n\t);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE on uppercase\", () => {\n\tconst actual = ensure(\n\t\t\"UPPERCASE `Any_CASE_iN_back-quotes` UPPERCASE\",\n\t\t\"uppercase\",\n\t);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for lowercase `Any_CASE_iN_back-quotes` lowercase on uppercase\", () => {\n\tconst actual = ensure(\n\t\t\"lowercase `Any_CASE_iN_back-quotes` lowercase\",\n\t\t\"uppercase\",\n\t);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for fooBar`Any_CASE_iN_back-quotes`fooBar on camel-case\", () => {\n\tconst actual = ensure(\"fooBar`Any_CASE_iN_back-quotes`fooBar\", \"camel-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for Foo Bar`Any_CASE_iN_back-quotes` Foo Bar on camel-case\", () => {\n\tconst actual = ensure(\n\t\t\"Foo Bar`Any_CASE_iN_back-quotes` Foo Bar\",\n\t\t\"camel-case\",\n\t);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for foo-bar`Any_CASE_iN_back-quotes`foo-bar on kebab-case\", () => {\n\tconst actual = ensure(\n\t\t\"foo-bar`Any_CASE_iN_back-quotes`foo-bar\",\n\t\t\"kebab-case\",\n\t);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for Foo Bar `Any_CASE_iN_back-quotes` Foo Bar on kebab-case\", () => {\n\tconst actual = ensure(\n\t\t\"Foo Bar `Any_CASE_iN_back-quotes` Foo Bar\",\n\t\t\"kebab-case\",\n\t);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for foo_bar`Any_CASE_iN_back-quotes`foo_bar on snake-case\", () => {\n\tconst actual = ensure(\n\t\t\"foo_bar`Any_CASE_iN_back-quotes`foo_bar\",\n\t\t\"snake-case\",\n\t);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for Foo Bar `Any_CASE_iN_back-quotes` Foo Bar on snake-case\", () => {\n\tconst actual = ensure(\n\t\t\"Foo Bar `Any_CASE_iN_back-quotes` Foo Bar\",\n\t\t\"snake-case\",\n\t);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for PascalCase`Any_CASE_iN_back-quotes`PascalCase on pascal-case\", () => {\n\tconst actual = ensure(\n\t\t\"PascalCase`Any_CASE_iN_back-quotes`PascalCase\",\n\t\t\"pascal-case\",\n\t);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for Foo Bar `Any_CASE_iN_back-quotes` Foo Bar on pascal-case\", () => {\n\tconst actual = ensure(\n\t\t\"Foo Bar `Any_CASE_iN_back-quotes` Foo Bar\",\n\t\t\"pascal-case\",\n\t);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for Foo Bar`Any_CASE_iN_back-quotes` Foo Bar on start-case\", () => {\n\tconst actual = ensure(\n\t\t\"Foo Bar `Any_CASE_iN_back-quotes`Foo Bar\",\n\t\t\"start-case\",\n\t);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for foo_bar`Any_CASE_iN_back-quotes`foo_bar on start-case\", () => {\n\tconst actual = ensure(\n\t\t\"foo_bar`Any_CASE_iN_back-quotes`foo_bar\",\n\t\t\"start-case\",\n\t);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for lowercase `Any_CASE_iN_back-quotes` `Any_CASE_iN_back-quotes` lowercase on lowercase\", () => {\n\tconst actual = ensure(\n\t\t\"lowercase `Any_CASE_iN_back-quotes` `Any_CASE_iN_back-quotes` lowercase\",\n\t\t\"lowercase\",\n\t);\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for 'Any_CASE_iN_single-quotes' on lowercase\", () => {\n\tconst actual = ensure(\"'Any_CASE_iN_single-quotes'\", \"lowercase\");\n\texpect(actual).toBe(true);\n});\n\ntest('true for \"Any_CASE_iN_double-quotes\" on lowercase', () => {\n\tconst actual = ensure('\"Any_CASE_iN_double-quotes\"', \"lowercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for `lowercasel\\\"'` on lowercase\", () => {\n\tconst actual = ensure(\"`lowercasel\\\"'`\", \"lowercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for `LOWERCASE on lowercase\", () => {\n\tconst actual = ensure(\"`LOWERCASE\", \"lowercase\");\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for numeric on camel-case\", () => {\n\tconst actual = ensure(\"1.0.0\", \"camel-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for numeric on kebab-case\", () => {\n\tconst actual = ensure(\"1.0.0\", \"kebab-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for numeric on snake-case\", () => {\n\tconst actual = ensure(\"1.0.0\", \"snake-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for numeric on pascal-case\", () => {\n\tconst actual = ensure(\"1.0.0\", \"pascal-case\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for numeric on uppercase\", () => {\n\tconst actual = ensure(\"1.0.0\", \"uppercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for numeric on sentencecase\", () => {\n\tconst actual = ensure(\"1.0.0\", \"sentencecase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for numeric on lowercase\", () => {\n\tconst actual = ensure(\"1.0.0\", \"lowercase\");\n\texpect(actual).toBe(true);\n});\n\ntest(\"throw TypeError for invalid case name\", () => {\n\tconst actualFn = () => ensure(\"anything\", \"someweirdcase\" as any);\n\texpect(actualFn).toThrow(TypeError);\n});\n"
  },
  {
    "path": "@commitlint/ensure/src/case.ts",
    "content": "import type { TargetCaseType } from \"@commitlint/types\";\n\nimport toCase from \"./to-case.js\";\n\nexport default ensureCase;\n\nfunction ensureCase(\n\traw: string = \"\",\n\ttarget: TargetCaseType = \"lowercase\",\n): boolean {\n\t// We delete any content together with quotes because he can contains proper names (example `refactor: `Eslint` configuration`).\n\t// We need trim string because content with quotes can be at the beginning or end of a line\n\tconst input = String(raw)\n\t\t.replace(/`.*?`|\".*?\"|'.*?'/g, \"\")\n\t\t.trim();\n\n\tconst transformed = toCase(input, target);\n\n\tif (transformed === \"\" || transformed.match(/^\\d/)) {\n\t\treturn true;\n\t}\n\n\treturn transformed === input;\n}\n"
  },
  {
    "path": "@commitlint/ensure/src/enum.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport ensure from \"./enum.js\";\n\ntest(\"false for no params\", () => {\n\tconst actual = (ensure as () => boolean)();\n\texpect(actual).toBe(false);\n});\n\ntest(\"false for not array enums\", () => {\n\tconst actual = ensure(\"a\", \"a\" as any);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for a against a\", () => {\n\tconst actual = ensure(\"a\", [\"a\"]);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for a against b\", () => {\n\tconst actual = ensure(\"a\", [\"b\"]);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for a against a, b\", () => {\n\tconst actual = ensure(\"a\", [\"a\", \"b\"]);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for b against a\", () => {\n\tconst actual = ensure(\"b\", [\"a\"]);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for b against b\", () => {\n\tconst actual = ensure(\"b\", [\"b\"]);\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for b against a, b\", () => {\n\tconst actual = ensure(\"b\", [\"a\", \"b\"]);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for c against a, b\", () => {\n\tconst actual = ensure(\"c\", [\"a\", \"b\"]);\n\texpect(actual).toBe(false);\n});\n"
  },
  {
    "path": "@commitlint/ensure/src/enum.ts",
    "content": "export default (value: any, enums: any[] = []): boolean => {\n\tif (value === undefined) {\n\t\treturn false;\n\t}\n\tif (!Array.isArray(enums)) {\n\t\treturn false;\n\t}\n\treturn enums.indexOf(value) > -1;\n};\n"
  },
  {
    "path": "@commitlint/ensure/src/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { globSync } from \"glob\";\nimport camelCase from \"lodash.camelcase\";\n\nimport * as ensure from \"./index.js\";\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\ntest(\"exports all checkers\", async () => {\n\tconst ignore = [\"types\"];\n\tconst expected = _glob(\"*.ts\")\n\t\t.map((f) => camelCase(f))\n\t\t.sort()\n\t\t.filter((item) => !ignore.includes(item));\n\tconst actual = Object.keys(ensure).sort();\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"rules export functions\", () => {\n\tconst actual = Object.values(ensure);\n\texpect(actual.every((rule) => typeof rule === \"function\")).toBe(true);\n});\n\nfunction _glob(pattern: string): string[] {\n\tconst files = globSync(pattern, {\n\t\tignore: [\"**/index.ts\", \"**/*.test.ts\"],\n\t\tcwd: __dirname,\n\t});\n\treturn files.map(relative).map(toExport);\n}\n\nfunction relative(filePath: string): string {\n\treturn path.relative(__dirname, filePath);\n}\n\nfunction toExport(fileName: string): string {\n\treturn path.basename(fileName, path.extname(fileName));\n}\n"
  },
  {
    "path": "@commitlint/ensure/src/index.ts",
    "content": "import ensureCase from \"./case.js\";\nimport ensureEnum from \"./enum.js\";\nimport maxLength from \"./max-length.js\";\nimport maxLineLength from \"./max-line-length.js\";\nimport minLength from \"./min-length.js\";\nimport notEmpty from \"./not-empty.js\";\nimport toCase from \"./to-case.js\";\n\nexport { ensureCase as case };\nexport { ensureEnum as enum };\nexport { maxLength, maxLineLength, minLength, notEmpty, toCase };\n"
  },
  {
    "path": "@commitlint/ensure/src/max-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport ensure from \"./max-length.js\";\n\ntest(\"false for no params\", () => {\n\tconst actual = (ensure as () => boolean)();\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for a against 1\", () => {\n\tconst actual = ensure(\"a\", 1);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for ab against 0\", () => {\n\tconst actual = ensure(\"a\", 0);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for a against 2\", () => {\n\tconst actual = ensure(\"a\", 2);\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for ab against 2\", () => {\n\tconst actual = ensure(\"ab\", 2);\n\texpect(actual).toBe(true);\n});\n"
  },
  {
    "path": "@commitlint/ensure/src/max-length.ts",
    "content": "export default (value: string | null, max: number): boolean =>\n\ttypeof value === \"string\" && value.length <= max;\n"
  },
  {
    "path": "@commitlint/ensure/src/max-line-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport ensure from \"./max-line-length.js\";\n\ntest(\"false for no params\", () => {\n\tconst actual = (ensure as () => boolean)();\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for a against 1\", () => {\n\tconst actual = ensure(\"a\", 1);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for ab against 0\", () => {\n\tconst actual = ensure(\"a\", 0);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for a against 2\", () => {\n\tconst actual = ensure(\"a\", 2);\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for ab against 2\", () => {\n\tconst actual = ensure(\"ab\", 2);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for ab/\\nab/\\nab 1\", () => {\n\tconst actual = ensure(\n\t\t`ab\nab\nab`,\n\t\t2,\n\t);\n\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for ab/\\nab/\\nab 2\", () => {\n\tconst actual = ensure(\n\t\t`ab\nab\nab`,\n\t\t2,\n\t);\n\n\texpect(actual).toBe(true);\n});\n"
  },
  {
    "path": "@commitlint/ensure/src/max-line-length.ts",
    "content": "import ensure from \"./max-length.js\";\n\n// Allow an exception for long lines which contain URLs.\n//\n// This is overly lenient, in order to avoid costly regexps which\n// have to worry about all the many edge cases of valid URLs.\nconst URL_REGEX = /\\bhttps?:\\/\\/\\S+/;\n\nexport default (value: string, max: number): boolean =>\n\ttypeof value === \"string\" &&\n\tvalue\n\t\t.split(/\\r?\\n/)\n\t\t.every((line) => URL_REGEX.test(line) || ensure(line, max));\n"
  },
  {
    "path": "@commitlint/ensure/src/min-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport ensure from \"./min-length.js\";\n\ntest(\"false for no params\", () => {\n\tconst actual = (ensure as () => boolean)();\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for a against 1\", () => {\n\tconst actual = ensure(\"a\", 1);\n\texpect(actual).toBe(true);\n});\n\ntest(\"false for ab against 0\", () => {\n\tconst actual = ensure(\"a\", 0);\n\texpect(actual).toBe(true);\n});\n\ntest(\"true for a against 2\", () => {\n\tconst actual = ensure(\"a\", 2);\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for ab against 2\", () => {\n\tconst actual = ensure(\"ab\", 2);\n\texpect(actual).toBe(true);\n});\n"
  },
  {
    "path": "@commitlint/ensure/src/min-length.ts",
    "content": "export default (value: string | null, min: number): boolean =>\n\ttypeof value === \"string\" && value.length >= min;\n"
  },
  {
    "path": "@commitlint/ensure/src/not-empty.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport ensure from \"./not-empty.js\";\n\ntest(\"false for no params\", () => {\n\tconst actual = (ensure as () => boolean)();\n\texpect(actual).toBe(false);\n});\n\ntest('false for \"\"', () => {\n\tconst actual = ensure(\"\");\n\texpect(actual).toBe(false);\n});\n\ntest(\"true for a\", () => {\n\tconst actual = ensure(\"a\");\n\texpect(actual).toBe(true);\n});\n"
  },
  {
    "path": "@commitlint/ensure/src/not-empty.ts",
    "content": "export default (value: string): boolean =>\n\ttypeof value === \"string\" && value.length > 0;\n"
  },
  {
    "path": "@commitlint/ensure/src/to-case.ts",
    "content": "import { TargetCaseType } from \"@commitlint/types\";\nimport camelCase from \"lodash.camelcase\";\nimport kebabCase from \"lodash.kebabcase\";\nimport snakeCase from \"lodash.snakecase\";\nimport upperFirst from \"lodash.upperfirst\";\nimport startCase from \"lodash.startcase\";\n\nexport default function toCase(input: string, target: TargetCaseType): string {\n\tswitch (target) {\n\t\tcase \"camel-case\":\n\t\t\treturn camelCase(input);\n\t\tcase \"kebab-case\":\n\t\t\treturn kebabCase(input);\n\t\tcase \"snake-case\":\n\t\t\treturn snakeCase(input);\n\t\tcase \"pascal-case\":\n\t\t\treturn upperFirst(camelCase(input));\n\t\tcase \"start-case\":\n\t\t\treturn startCase(input);\n\t\tcase \"upper-case\":\n\t\tcase \"uppercase\":\n\t\t\treturn input.toUpperCase();\n\t\tcase \"sentence-case\":\n\t\tcase \"sentencecase\":\n\t\t\treturn upperFirst(input);\n\t\tcase \"lower-case\":\n\t\tcase \"lowercase\":\n\t\tcase \"lowerCase\": // Backwards compat config-angular v4\n\t\t\treturn input.toLowerCase();\n\t\tdefault:\n\t\t\tthrow new TypeError(`to-case: Unknown target case \"${target}\"`);\n\t}\n}\n"
  },
  {
    "path": "@commitlint/ensure/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src/**/*.ts\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../types\" }]\n}\n"
  },
  {
    "path": "@commitlint/execute-rule/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/execute-rule\n"
  },
  {
    "path": "@commitlint/execute-rule/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/execute-rule/package.json",
    "content": "{\n  \"name\": \"@commitlint/execute-rule\",\n  \"type\": \"module\",\n  \"version\": \"20.0.0\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/execute-rule\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/execute-rule/src/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport execute from \"./index.js\";\n\ntest(\"does nothing without params\", async () => {\n\tconst exec = execute as any;\n\texpect(await exec()).toBeNull();\n});\n\ntest(\"returns plain config\", async () => {\n\tconst actual = await execute([\"name\", \"config\"]);\n\texpect(actual).toEqual([\"name\", \"config\"]);\n});\n\ntest(\"unwraps promised config\", async () => {\n\tconst actual = await execute([\"name\", Promise.resolve(\"config\")]);\n\texpect(actual).toEqual([\"name\", \"config\"]);\n});\n\ntest(\"executes config functions\", async () => {\n\tconst actual = await execute([\"name\", () => \"config\"]);\n\texpect(actual).toEqual([\"name\", \"config\"]);\n});\n\ntest(\"executes async config functions\", async () => {\n\tconst actual = await execute([\"name\", async () => \"config\"]);\n\texpect(actual).toEqual([\"name\", \"config\"]);\n});\n"
  },
  {
    "path": "@commitlint/execute-rule/src/index.ts",
    "content": "type Rule<T> = readonly [string, Config<T>];\ntype Config<T> = T | Promise<T> | ExectableConfig<T>;\ntype ExectableConfig<T> = (() => T) | (() => Promise<T>);\n\ntype ExecutedRule<T> = readonly [string, T];\n\nexport default execute;\n\nexport async function execute<T = unknown>(\n\trule?: Rule<T>,\n): Promise<ExecutedRule<T> | null> {\n\tif (!Array.isArray(rule)) {\n\t\treturn null;\n\t}\n\n\tconst [name, config] = rule;\n\n\tconst fn = executable(config) ? config : async () => config;\n\n\treturn [name, await fn()];\n}\n\nfunction executable<T>(config: Config<T>): config is ExectableConfig<T> {\n\treturn typeof config === \"function\";\n}\n"
  },
  {
    "path": "@commitlint/execute-rule/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@commitlint/format/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n\n### Features\n\n* **format:** print full commit message for valid commits if -V ([#4026](https://github.com/conventional-changelog/commitlint/issues/4026)) ([a7bbc49](https://github.com/conventional-changelog/commitlint/commit/a7bbc494e34885aba3f4b0c03b37d18ef2b8fbff))\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/format\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n### Features\n\n- extend helpUrl from shareable config ([#2846](https://github.com/conventional-changelog/commitlint/issues/2846)) ([d7e2e2b](https://github.com/conventional-changelog/commitlint/commit/d7e2e2b943be383f99f4000b6b6bed0eab03bfcf))\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/format\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/format\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/format\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n### Bug Fixes\n\n- **types:** correct chalkColor type ([#2420](https://github.com/conventional-changelog/commitlint/issues/2420)) ([ef8bdad](https://github.com/conventional-changelog/commitlint/commit/ef8bdad96c9ee7c3ad67f8280818c7f49c1df1fe))\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/format\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency chalk to v4 ([#1275](https://github.com/conventional-changelog/commitlint/issues/1275)) ([a5d8fa1](https://github.com/conventional-changelog/commitlint/commit/a5d8fa118e8221361f14f5fd2b21d7aaad008a27))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/format\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/format\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/format\n\n## [7.6.1](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.1) (2019-05-09)\n\n### Bug Fixes\n\n- ensure format() is available as commonjs default export [#645](https://github.com/conventional-changelog/commitlint/issues/645) ([ec3da92](https://github.com/conventional-changelog/commitlint/commit/ec3da92))\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n### Bug Fixes\n\n- avoid excessive help text [#606](https://github.com/conventional-changelog/commitlint/issues/606) ([#637](https://github.com/conventional-changelog/commitlint/issues/637)) ([8f3c3b1](https://github.com/conventional-changelog/commitlint/commit/8f3c3b1))\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- cleanup message for input with no config ([#519](https://github.com/conventional-changelog/commitlint/issues/519)) ([7d9e760](https://github.com/conventional-changelog/commitlint/commit/7d9e760))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.4.0\"></a>\n\n# [7.4.0](https://github.com/conventional-changelog/commitlint/compare/v7.3.2...v7.4.0) (2019-01-27)\n\n### Bug Fixes\n\n- correction to need help link ([#540](https://github.com/conventional-changelog/commitlint/issues/540)) ([fa6168a](https://github.com/conventional-changelog/commitlint/commit/fa6168a))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/format\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- **format:** add new line to result ([#518](https://github.com/conventional-changelog/commitlint/issues/518)) ([f1d443b](https://github.com/conventional-changelog/commitlint/commit/f1d443b)), closes [#504](https://github.com/conventional-changelog/commitlint/issues/504)\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package @commitlint/format\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n**Note:** Version bump only for package @commitlint/format\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/format\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/format\n"
  },
  {
    "path": "@commitlint/format/README.md",
    "content": "# @commitlint/format\n\nFormat commitlint reports\n\n## Getting started\n\n```shell\nnpm install --save @commitlint/format\n```\n\n## Documentation\n\nConsult [API docs](https://commitlint.js.org/api/format) for comprehensive documentation.\n\nDocumentation generated from [`docs` folder](../../docs/api/format.md).\n"
  },
  {
    "path": "@commitlint/format/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/format/package.json",
    "content": "{\n  \"name\": \"@commitlint/format\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Format commitlint reports\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-import\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/format\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"dependencies\": {\n    \"@commitlint/types\": \"^20.5.0\",\n    \"picocolors\": \"^1.1.1\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/format/src/format.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport { format, formatResult } from \"./index.js\";\n\ntest(\"does nothing without arguments\", () => {\n\tconst actual = format();\n\texpect(actual).toEqual(\"\");\n});\n\ntest(\"does nothing without report results\", () => {\n\tconst actual = format({ results: [] });\n\texpect(actual).toEqual(\"\");\n});\n\ntest(\"does nothing without .errors and .warnings\", () => {\n\tconst actual = format({ results: [{}] });\n\texpect(actual).toEqual(\"\");\n});\n\ntest(\"returns empty summary if verbose\", () => {\n\tconst actual = format(\n\t\t{\n\t\t\tresults: [\n\t\t\t\t{\n\t\t\t\t\terrors: [],\n\t\t\t\t\twarnings: [],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tverbose: true,\n\t\t},\n\t);\n\n\texpect(actual).toContain(\"0 problems, 0 warnings\");\n});\n\ntest(\"returns empty summary with full commit message if verbose\", () => {\n\tconst actual = format(\n\t\t{\n\t\t\tresults: [\n\t\t\t\t{\n\t\t\t\t\terrors: [],\n\t\t\t\t\twarnings: [],\n\t\t\t\t\tinput:\n\t\t\t\t\t\t\"feat(cli): this is a valid header\\n\\nThis is a valid body\\n\\nSigned-off-by: tester\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tverbose: true,\n\t\t\tcolor: false,\n\t\t},\n\t);\n\n\texpect(actual).toStrictEqual(\n\t\t\"⧗   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\",\n\t);\n});\n\ntest(\"returns a correct summary of empty .errors and .warnings\", () => {\n\tconst actualError = format({\n\t\tresults: [\n\t\t\t{\n\t\t\t\terrors: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlevel: 2,\n\t\t\t\t\t\tname: \"error-name\",\n\t\t\t\t\t\tmessage: \"There was an error\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\tconst actualWarning = format({\n\t\tresults: [\n\t\t\t{\n\t\t\t\twarnings: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlevel: 1,\n\t\t\t\t\t\tname: \"warning-name\",\n\t\t\t\t\t\tmessage: \"There was a problem\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(actualError).toContain(\"There was an error\");\n\texpect(actualError).toContain(\"1 problems, 0 warnings\");\n\texpect(actualWarning).toContain(\"There was a problem\");\n\texpect(actualWarning).toContain(\"0 problems, 1 warnings\");\n});\n\ntest(\"uses appropriate signs by default\", () => {\n\tconst actualError = format({\n\t\tresults: [\n\t\t\t{\n\t\t\t\terrors: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlevel: 2,\n\t\t\t\t\t\tname: \"error-name\",\n\t\t\t\t\t\tmessage: \"There was an error\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\tconst actualWarning = format({\n\t\tresults: [\n\t\t\t{\n\t\t\t\twarnings: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlevel: 1,\n\t\t\t\t\t\tname: \"warning-name\",\n\t\t\t\t\t\tmessage: \"There was a problem\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(actualError).toContain(\"✖\");\n\texpect(actualWarning).toContain(\"⚠\");\n});\n\ntest(\"uses signs as configured\", () => {\n\tconst options = { signs: [\"HNT\", \"WRN\", \"ERR\"] as [string, string, string] };\n\tconst actualError = format(\n\t\t{\n\t\t\tresults: [\n\t\t\t\t{\n\t\t\t\t\terrors: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlevel: 2,\n\t\t\t\t\t\t\tname: \"error-name\",\n\t\t\t\t\t\t\tmessage: \"There was an error\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\toptions,\n\t);\n\n\tconst actualWarning = format(\n\t\t{\n\t\t\tresults: [\n\t\t\t\t{\n\t\t\t\t\twarnings: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlevel: 1,\n\t\t\t\t\t\t\tname: \"warning-name\",\n\t\t\t\t\t\t\tmessage: \"There was a problem\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\toptions,\n\t);\n\n\texpect(actualError).toContain(\"ERR\");\n\texpect(actualWarning).toContain(\"WRN\");\n});\n\ntest(\"format result is empty without arguments\", () => {\n\tconst actual = formatResult();\n\tconst actualText = actual.join(\"\\n\");\n\texpect(actualText).toBe(\"\");\n});\n\ntest(\"format result transforms error to text\", () => {\n\tconst actual = formatResult({\n\t\terrors: [\n\t\t\t{\n\t\t\t\tlevel: 2,\n\t\t\t\tname: \"error-name\",\n\t\t\t\tmessage: \"There was an error\",\n\t\t\t},\n\t\t],\n\t});\n\n\tconst actualText = actual.join(\"\\n\");\n\n\texpect(actualText).toContain(\"error-name\");\n\texpect(actualText).toContain(\"There was an error\");\n\texpect(actualText).toContain(\"1 problems, 0 warnings\");\n});\n\ntest(\"format result transforms warning to text\", () => {\n\tconst actual = formatResult({\n\t\twarnings: [\n\t\t\t{\n\t\t\t\tlevel: 1,\n\t\t\t\tname: \"warning-name\",\n\t\t\t\tmessage: \"There was a warning\",\n\t\t\t},\n\t\t],\n\t});\n\n\tconst actualText = actual.join(\"\\n\");\n\n\texpect(actualText).toContain(\"warning-name\");\n\texpect(actualText).toContain(\"There was a warning\");\n\texpect(actualText).toContain(\"0 problems, 1 warnings\");\n});\n\ntest(\"format result prints help for errors\", () => {\n\tconst actual = formatResult(\n\t\t{\n\t\t\terrors: [\n\t\t\t\t{\n\t\t\t\t\tlevel: 2,\n\t\t\t\t\tname: \"error-name\",\n\t\t\t\t\tmessage: \"There was an error\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\thelpUrl: \"https://example.com\",\n\t\t},\n\t);\n\n\texpect(actual).toEqual(\n\t\texpect.arrayContaining([expect.stringContaining(\"Get help:\")]),\n\t);\n});\n\ntest(\"format result prints help for warnings\", () => {\n\tconst actual = formatResult(\n\t\t{\n\t\t\twarnings: [\n\t\t\t\t{\n\t\t\t\t\tlevel: 2,\n\t\t\t\t\tname: \"warning-name\",\n\t\t\t\t\tmessage: \"There was a warning\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\thelpUrl: \"https://example.com\",\n\t\t},\n\t);\n\n\texpect(actual).toEqual(\n\t\texpect.arrayContaining([expect.stringContaining(\"Get help:\")]),\n\t);\n});\n\ntest(\"format result help cotains options.helpUrl\", () => {\n\tconst helpUrl = \"https://example.com\";\n\n\tconst actual = formatResult(\n\t\t{\n\t\t\twarnings: [\n\t\t\t\t{\n\t\t\t\t\tlevel: 2,\n\t\t\t\t\tname: \"warning-name\",\n\t\t\t\t\tmessage: \"There was a warning\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\thelpUrl,\n\t\t},\n\t);\n\n\texpect(actual).toEqual(\n\t\texpect.arrayContaining([expect.stringContaining(helpUrl)]),\n\t);\n});\n\ntest(\"format result omits help for empty problems\", () => {\n\tconst actual = formatResult({\n\t\twarnings: [],\n\t});\n\n\texpect(actual).not.toEqual(\n\t\texpect.arrayContaining([expect.stringContaining(\"Get help:\")]),\n\t);\n});\n\ntest(\"format result should not contain `Get help` prefix if helpUrl is not provided\", () => {\n\tconst actual = formatResult(\n\t\t{\n\t\t\twarnings: [\n\t\t\t\t{\n\t\t\t\t\tlevel: 2,\n\t\t\t\t\tname: \"warning-name\",\n\t\t\t\t\tmessage: \"There was a warning\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\thelpUrl: \"\",\n\t\t},\n\t);\n\n\texpect(actual).not.toEqual(\n\t\texpect.arrayContaining([expect.stringContaining(\"Get help:\")]),\n\t);\n});\n"
  },
  {
    "path": "@commitlint/format/src/format.ts",
    "content": "import pc from \"picocolors\";\nimport {\n\tPicocolorsColor,\n\tFormattableReport,\n\tFormatOptions,\n\tFormattableResult,\n\tWithInput,\n} from \"@commitlint/types\";\n\nconst DEFAULT_SIGNS = [\" \", \"⚠\", \"✖\"] as const;\nconst DEFAULT_COLORS: readonly [\n\tPicocolorsColor,\n\tPicocolorsColor,\n\tPicocolorsColor,\n] = [\"white\", \"yellow\", \"red\"] as const;\n\nexport function format(\n\treport: FormattableReport = {},\n\toptions: FormatOptions = {},\n): string {\n\tconst { results = [] } = report;\n\tconst fi = (result: FormattableResult & WithInput) =>\n\t\tformatInput(result, options);\n\tconst fr = (result: FormattableResult) => formatResult(result, options);\n\n\treturn results\n\t\t.filter((r) => Array.isArray(r.warnings) || Array.isArray(r.errors))\n\t\t.map((result) => [...fi(result), ...fr(result)])\n\t\t.reduce(\n\t\t\t(acc, item) => (Array.isArray(item) ? [...acc, ...item] : [...acc, item]),\n\t\t\t[],\n\t\t)\n\t\t.join(\"\\n\");\n}\n\nfunction formatInput(\n\tresult: FormattableResult & WithInput,\n\toptions: FormatOptions = {},\n): string[] {\n\tconst { color: enabled = true } = options;\n\tconst { errors = [], warnings = [], input = \"\" } = result;\n\n\tif (!input) {\n\t\treturn [\"\"];\n\t}\n\n\tconst sign = \"⧗\";\n\tconst decoration = enabled ? pc.gray(sign) : sign;\n\n\tconst decoratedInput = enabled ? pc.bold(input) : input;\n\tconst hasProblems = errors.length > 0 || warnings.length > 0;\n\n\treturn options.verbose || hasProblems\n\t\t? [`${decoration}   input: ${decoratedInput}`]\n\t\t: [];\n}\n\nexport function formatResult(\n\tresult: FormattableResult = {},\n\toptions: FormatOptions = {},\n): string[] {\n\tconst {\n\t\tsigns = DEFAULT_SIGNS,\n\t\tcolors = DEFAULT_COLORS,\n\t\tcolor: enabled = true,\n\t} = options;\n\tconst { errors = [], warnings = [] } = result;\n\n\tconst problems = [...errors, ...warnings].map((problem) => {\n\t\tconst sign = signs[problem.level] || \"\";\n\t\tconst colorName: PicocolorsColor =\n\t\t\tcolors[problem.level] || (\"white\" as const);\n\t\tconst colorFn = pc[colorName];\n\t\tconst decoration = enabled ? colorFn(sign) : sign;\n\t\tconst name = enabled ? pc.gray(`[${problem.name}]`) : `[${problem.name}]`;\n\t\treturn `${decoration}   ${problem.message} ${name}`;\n\t});\n\n\tconst sign = selectSign(result);\n\tconst colorName = selectColor(result);\n\n\tconst deco = enabled ? pc[colorName](sign) : sign;\n\tconst el = errors.length;\n\tconst wl = warnings.length;\n\tconst hasProblems = problems.length > 0;\n\n\tconst summary =\n\t\toptions.verbose || hasProblems\n\t\t\t? `${deco}   found ${el} problems, ${wl} warnings`\n\t\t\t: undefined;\n\n\tconst fmtSummary =\n\t\tenabled && typeof summary === \"string\" ? pc.bold(summary) : summary;\n\n\tconst help =\n\t\thasProblems && options.helpUrl\n\t\t\t? `ⓘ   Get help: ${options.helpUrl}`\n\t\t\t: undefined;\n\n\treturn [\n\t\t...problems,\n\t\thasProblems ? \"\" : undefined,\n\t\tfmtSummary,\n\t\thelp,\n\t\thasProblems ? \"\" : undefined,\n\t].filter((line): line is string => typeof line === \"string\");\n}\n\nexport default format;\n\nfunction selectSign(result: FormattableResult): string {\n\tif ((result.errors || []).length > 0) {\n\t\treturn \"✖\";\n\t}\n\treturn (result.warnings || []).length ? \"⚠\" : \"✔\";\n}\n\nfunction selectColor(result: FormattableResult): PicocolorsColor {\n\tif ((result.errors || []).length > 0) {\n\t\treturn \"red\";\n\t}\n\treturn (result.warnings || []).length ? \"yellow\" : \"green\";\n}\n"
  },
  {
    "path": "@commitlint/format/src/index.ts",
    "content": "export { default } from \"./format.js\";\nexport * from \"./format.js\";\n"
  },
  {
    "path": "@commitlint/format/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../types\" }]\n}\n"
  },
  {
    "path": "@commitlint/is-ignored/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n\n### Bug Fixes\n\n* **is-ignored:** strip CI skip markers from release commits ([#4637](https://github.com/conventional-changelog/commitlint/issues/4637)) ([56a6fd0](https://github.com/conventional-changelog/commitlint/commit/56a6fd069dc8a46054ce23ddd388ce924ca499c2))\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Reverts\n\n* 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)\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n\n### Bug Fixes\n\n* 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))\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n\n### Features\n\n* **is-ignored:** ignore reapply commits ([#4186](https://github.com/conventional-changelog/commitlint/issues/4186)) ([49ba56d](https://github.com/conventional-changelog/commitlint/commit/49ba56d9dd4c72e918005e6ca62f110a393b8f07))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n\n### Bug Fixes\n\n* **is-ignored:** ignore \"amend!\" commits ([#4024](https://github.com/conventional-changelog/commitlint/issues/4024)) ([90078f6](https://github.com/conventional-changelog/commitlint/commit/90078f6a58523e0bde386b9b6aa3c05e8b916653))\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n\n### Bug Fixes\n\n* update dependency semver to v7.6.0 ([#3900](https://github.com/conventional-changelog/commitlint/issues/3900)) ([df33003](https://github.com/conventional-changelog/commitlint/commit/df33003dce77bc5ff48678cddf9401dffedaeb57))\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n\n### Bug Fixes\n\n* update dependency semver to v7.5.0 ([#3604](https://github.com/conventional-changelog/commitlint/issues/3604)) ([01e35e0](https://github.com/conventional-changelog/commitlint/commit/01e35e06cf9123a0c367e0d0ac79988ec4334e6a))\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n### Bug Fixes\n\n- update dependency semver to v7.3.8 ([#3441](https://github.com/conventional-changelog/commitlint/issues/3441)) ([7599ad6](https://github.com/conventional-changelog/commitlint/commit/7599ad6ab622ecbb6efa9ddba7acc3bbf66db5b5))\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n### Bug Fixes\n\n- update dependency semver to v7.3.6 ([#3112](https://github.com/conventional-changelog/commitlint/issues/3112)) ([ad886fd](https://github.com/conventional-changelog/commitlint/commit/ad886fd7ea46bc2df346099f9d4f10defd51fe75))\n- update dependency semver to v7.3.7 ([#3119](https://github.com/conventional-changelog/commitlint/issues/3119)) ([c9c49b2](https://github.com/conventional-changelog/commitlint/commit/c9c49b2de935528d84a817de750cd65b8f765c48))\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n### Bug Fixes\n\n- **is-ignored:** ignore merge tag commit messages ([#2920](https://github.com/conventional-changelog/commitlint/issues/2920)) ([914782a](https://github.com/conventional-changelog/commitlint/commit/914782aad70d353baf4d9fbbf9824c0211241484))\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n### Bug Fixes\n\n- update dependency semver to v7.3.5 ([#2519](https://github.com/conventional-changelog/commitlint/issues/2519)) ([5113f22](https://github.com/conventional-changelog/commitlint/commit/5113f22c620e7b187fd558e5befa541b448ea18b))\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- update dependency semver to v7.3.4 ([#2336](https://github.com/conventional-changelog/commitlint/issues/2336)) ([790b61a](https://github.com/conventional-changelog/commitlint/commit/790b61afa668d0eab80bbe49db58d3d5d29bb16e))\n- **is-ignored:** ignore azure devops messages ([#2230](https://github.com/conventional-changelog/commitlint/issues/2230)) ([fe29ce7](https://github.com/conventional-changelog/commitlint/commit/fe29ce76bd87d5b42048228fbf0f47cc8d5411ec))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency semver to v7.3.2 ([#1369](https://github.com/conventional-changelog/commitlint/issues/1369)) ([3c09722](https://github.com/conventional-changelog/commitlint/commit/3c09722d2db85a94cd1f4bf25c6b4251b2c41bbb))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- update dependency semver to v7.1.3 ([#995](https://github.com/conventional-changelog/commitlint/issues/995)) ([4ee307a](https://github.com/conventional-changelog/commitlint/commit/4ee307a1f8c861ae5d8a038560d166c5d00ea8ba))\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n### Bug Fixes\n\n- **is-ignored:** move types to dev dependencies ([#897](https://github.com/conventional-changelog/commitlint/issues/897)) ([aabc549](https://github.com/conventional-changelog/commitlint/commit/aabc549))\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n### Features\n\n- config based is-ignored overrides ([#595](https://github.com/conventional-changelog/commitlint/issues/595)) ([2434d71](https://github.com/conventional-changelog/commitlint/commit/2434d71))\n\n## [7.5.1](https://github.com/conventional-changelog/commitlint/compare/v7.5.0...v7.5.1) (2019-02-09)\n\n### Bug Fixes\n\n- **is-ignored:** ignore bitbuckets automatic merge ([#573](https://github.com/conventional-changelog/commitlint/issues/573)) ([e5bdc5c](https://github.com/conventional-changelog/commitlint/commit/e5bdc5c))\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n### Bug Fixes\n\n- ignore merge messages with text after newline ([b32bc93](https://github.com/conventional-changelog/commitlint/commit/b32bc93))\n- use grouped regex to ignore merge commits ([#439](https://github.com/conventional-changelog/commitlint/issues/439)) ([905e9d5](https://github.com/conventional-changelog/commitlint/commit/905e9d5))\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n### Features\n\n- **wildcards:** add new wildcard patterns [#315](https://github.com/conventional-changelog/commitlint/issues/315) ([e9ea17f](https://github.com/conventional-changelog/commitlint/commit/e9ea17f))\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/is-ignored\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n### Bug Fixes\n\n- update dependency semver to v5.5.0 ([#236](https://github.com/conventional-changelog/commitlint/issues/236)) ([6c52bd9](https://github.com/conventional-changelog/commitlint/commit/6c52bd9))\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n### Bug Fixes\n\n- ignore branch merges with multiple newlines ([#227](https://github.com/conventional-changelog/commitlint/issues/227)) ([1f0c5ca](https://github.com/conventional-changelog/commitlint/commit/1f0c5ca))\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n### Bug Fixes\n\n- ignore branch merges with newlines ([#214](https://github.com/conventional-changelog/commitlint/issues/214)) ([c94c4dc](https://github.com/conventional-changelog/commitlint/commit/c94c4dc))\n"
  },
  {
    "path": "@commitlint/is-ignored/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/is-ignored/package.json",
    "content": "{\n  \"name\": \"@commitlint/is-ignored\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/is-ignored\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/parse\": \"^20.5.0\",\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/semver\": \"^7.5.7\"\n  },\n  \"dependencies\": {\n    \"@commitlint/types\": \"^20.5.0\",\n    \"semver\": \"^7.6.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/is-ignored/src/defaults.ts",
    "content": "import semver from \"semver\";\nimport { Matcher } from \"@commitlint/types\";\n\nconst isSemver = (c: string): boolean => {\n\tconst firstLine = c.split(\"\\n\").shift();\n\n\tif (typeof firstLine !== \"string\") {\n\t\treturn false;\n\t}\n\n\tconst stripped = firstLine\n\t\t.replace(/^chore(\\([^)]+\\))?:/, \"\")\n\t\t.replace(/\\[(skip|ci)(-|\\s)(ci|skip)\\]/i, \"\")\n\t\t.replace(/\\((skip|ci)(-|\\s)(ci|skip)\\)/i, \"\")\n\t\t.trim();\n\treturn semver.valid(stripped) !== null;\n};\n\nconst test = (r: RegExp): ((c: string) => boolean) => r.test.bind(r);\n\nexport const wildcards: Matcher[] = [\n\ttest(\n\t\t/^((Merge pull request)|(Merge (.*?) into (.*?)|(Merge branch (.*?)))(?:\\r?\\n)*$)/m,\n\t),\n\ttest(/^(Merge tag (.*?))(?:\\r?\\n)*$/m),\n\ttest(/^(R|r)evert (.*)/),\n\ttest(/^(R|r)eapply (.*)/),\n\ttest(/^(amend|fixup|squash)!/),\n\tisSemver,\n\ttest(/^(Merged (.*?)(in|into) (.*)|Merged PR (.*): (.*))/),\n\ttest(/^Merge remote-tracking branch(\\s*)(.*)/),\n\ttest(/^Automatic merge(.*)/),\n\ttest(/^Auto-merged (.*?) into (.*)/),\n];\n"
  },
  {
    "path": "@commitlint/is-ignored/src/index.ts",
    "content": "export * from \"./is-ignored.js\";\nexport { default } from \"./is-ignored.js\";\n"
  },
  {
    "path": "@commitlint/is-ignored/src/is-ignored.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport isIgnored from \"./is-ignored.js\";\n\nconst VERSION_MESSAGES = [\n\t\"0.0.1\",\n\t\"0.1.0\",\n\t\"1.0.0\",\n\t\"0.0.1-alpha\",\n\t\"0.0.1-some-crazy-tag\",\n\t\"0.0.1-0\",\n\t\"0.0.1-999\",\n\t\"0.0.1-alpha.0\",\n\t\"0.0.1-alpha.999\",\n\t\"0.0.1-some-crazy-tag.0\",\n\t\"0.0.1-some-crazy-tag.999\",\n\t\"0.0.1-1e69d54\",\n\t\"v0.0.1\",\n\t\" v3.0.0\",\n];\n\nconst AMENDMENTS = [\n\t\"Signed-off-by: Developer <example@example.com>\",\n\t\"Change-Id: I895114872a515a269487a683124b63303818e19c\",\n\t\"Signed-off-by: Developer <example@example.com>\\nChange-Id: I895114872a515a269487a683124b63303818e19c\",\n];\n\nconst AMENDED_VERSION_MESSAGES = VERSION_MESSAGES.reduce<string[]>(\n\t(results, message) => {\n\t\treturn [\n\t\t\t...results,\n\t\t\t...AMENDMENTS.map((amendment) => `${message}\\n\\n${amendment}`),\n\t\t];\n\t},\n\t[],\n);\n\ntest(\"should return false when called without arguments\", () => {\n\texpect(isIgnored()).toBe(false);\n});\n\ntest(\"should return false when called with empty string\", () => {\n\texpect(isIgnored(\"\")).toBe(false);\n});\n\ntest(\"should return false for normal commit\", () => {\n\texpect(isIgnored(\"initial commit\")).toBe(false);\n});\n\ntest(\"should return true for branch merges\", () => {\n\texpect(isIgnored(\"Merge branch 'iss53'\")).toBe(true);\n});\n\ntest(\"should return true for branch merges with newline characters\", () => {\n\texpect(isIgnored(\"Merge branch 'ctrom-YarnBuild'\\n\")).toBe(true);\n\texpect(isIgnored(\"Merge branch 'ctrom-YarnBuild'\\r\\n\")).toBe(true);\n});\n\ntest(\"should return true for branch merges with multiple newline characters\", () => {\n\texpect(isIgnored(\"Merge branch 'ctrom-YarnBuild'\\n\\n\\n\")).toBe(true);\n\texpect(isIgnored(\"Merge branch 'ctrom-YarnBuild'\\r\\n\\r\\n\\r\\n\")).toBe(true);\n});\n\ntest(\"should return true for merged PRs\", () => {\n\texpect(isIgnored(\"Merge pull request #369\")).toBe(true);\n});\n\ntest(\"should return true for branch merges with newline characters and more characters after it\", () => {\n\texpect(isIgnored(\"Merge branch 'ctrom-YarnBuild'\\n \")).toBe(true);\n\texpect(isIgnored(\"Merge branch 'ctrom-YarnBuild'\\r\\n # some comment\")).toBe(\n\t\ttrue,\n\t);\n});\n\ntest(\"should return true for tag merges\", () => {\n\texpect(isIgnored(\"Merge tag '1.1.1'\")).toBe(true);\n\texpect(isIgnored(\"Merge tag 'a tag'\")).toBe(true);\n});\n\ntest(\"should return true for tag merges with newline characters\", () => {\n\texpect(isIgnored(\"Merge tag '1.1.1'\\n\")).toBe(true);\n\texpect(isIgnored(\"Merge tag '1.1.1'\\r\\n\")).toBe(true);\n});\n\ntest(\"should return true for tag merges with multiple newline characters\", () => {\n\texpect(isIgnored(\"Merge tag '1.1.1'\\n\\n\\n\")).toBe(true);\n\texpect(isIgnored(\"Merge tag '1.1.1'\\r\\n\\r\\n\\r\\n\")).toBe(true);\n});\n\ntest(\"should return true for tag merges with newline characters and more characters after it\", () => {\n\texpect(isIgnored(\"Merge tag '1.1.1'\\n \")).toBe(true);\n\texpect(isIgnored(\"Merge tag '1.1.1'\\r\\n # some comment\")).toBe(true);\n});\n\ntest(\"should return true for revert commits\", () => {\n\texpect(\n\t\tisIgnored(\n\t\t\t`Revert \"docs: add recipe for linting of all commits in a PR (#36)\"\\n\\nThis reverts commit 1e69d542c16c2a32acfd139e32efa07a45f19111.`,\n\t\t),\n\t).toBe(true);\n\texpect(\n\t\tisIgnored(\n\t\t\t`revert \"docs: add recipe for linting of all commits in a PR (#36)\"\\n\\nThis reverts commit 1e69d542c16c2a32acfd139e32efa07a45f19111.`,\n\t\t),\n\t).toBe(true);\n});\n\ntest(\"should ignore npm semver commits\", () => {\n\tVERSION_MESSAGES.forEach((message) => expect(isIgnored(message)).toBe(true));\n});\n\ntest(\"should ignore npm semver commits with chore\", () => {\n\tVERSION_MESSAGES.forEach((message) =>\n\t\texpect(isIgnored(`chore: ${message}`)).toBe(true),\n\t);\n\tVERSION_MESSAGES.forEach((message) =>\n\t\texpect(isIgnored(`chore(release): ${message}`)).toBe(true),\n\t);\n});\n\ntest(\"should ignore npm semver commits with footers\", () => {\n\tAMENDED_VERSION_MESSAGES.forEach((message) =>\n\t\texpect(isIgnored(message)).toBe(true),\n\t);\n});\n\ntest(\"should ignore npm semver commits with CI skip markers\", () => {\n\texpect(isIgnored(\"2.3.3-beta.1 [skip ci]\")).toBe(true);\n\texpect(isIgnored(\"2.3.3-beta.1 [ci skip]\")).toBe(true);\n\texpect(isIgnored(\"2.3.3-beta.1 [skip-ci]\")).toBe(true);\n\texpect(isIgnored(\"2.3.3-beta.1 [ci-skip]\")).toBe(true);\n\texpect(isIgnored(\"2.3.3-beta.1 (skip ci)\")).toBe(true);\n\texpect(isIgnored(\"2.3.3-beta.1 (ci skip)\")).toBe(true);\n\texpect(isIgnored(\"2.3.3-beta.1 (skip-ci)\")).toBe(true);\n\texpect(isIgnored(\"2.3.3-beta.1 (ci-skip)\")).toBe(true);\n});\n\ntest(\"should ignore npm semver commits with chore and CI skip markers\", () => {\n\texpect(isIgnored(\"chore(release): 2.3.3-beta.1 [skip ci]\")).toBe(true);\n\texpect(isIgnored(\"chore(release): 2.3.3-beta.1 [ci skip]\")).toBe(true);\n\texpect(isIgnored(\"chore: 2.3.3-beta.1 [skip ci]\")).toBe(true);\n\texpect(isIgnored(\"chore: 2.3.3-beta.1 [ci skip]\")).toBe(true);\n});\n\ntest(\"should return true amend commits\", () => {\n\texpect(isIgnored(\"amend! initial commit\")).toBe(true);\n});\n\ntest(\"should return true fixup commits\", () => {\n\texpect(isIgnored(\"fixup! initial commit\")).toBe(true);\n});\n\ntest(\"should return true squash commits\", () => {\n\texpect(isIgnored(\"squash! initial commit\")).toBe(true);\n});\n\ntest(\"should return true for bitbucket merge commits\", () => {\n\texpect(\n\t\tisIgnored(\"Merged in feature/facebook-friends-sync (pull request #8)\"),\n\t).toBe(true);\n\texpect(\n\t\tisIgnored(\"Merged develop into feature/component-form-select-card\"),\n\t).toBe(true);\n\texpect(isIgnored(\"Automatic merge\")).toBe(true);\n});\n\ntest(\"should return true for automatic merge commits\", () => {\n\texpect(isIgnored(\"Auto-merged develop into master\")).toBe(true);\n\texpect(isIgnored(\"Merge remote-tracking branch\")).toBe(true);\n});\n\ntest(\"should return true for azure devops merge commits\", () => {\n\texpect(isIgnored(\"Merged PR 123: Description here\")).toBe(true);\n});\n\ntest(\"should return false for commits containing, but not starting, with merge branch\", () => {\n\texpect(isIgnored(\"foo bar Merge branch xxx\")).toBe(false);\n});\n\ntest(\"should return false for commits containing, but not starting, with merge tag\", () => {\n\texpect(isIgnored(\"foo bar Merge tag '1.1.1'\")).toBe(false);\n});\n\ntest(\"should return false for ignored message if defaults is false\", () => {\n\texpect(\n\t\tisIgnored(\"Auto-merged develop into master\", {\n\t\t\tdefaults: false,\n\t\t}),\n\t).toBe(false);\n});\n\ntest(\"should return false for ignored message if custom ignores and defaults is false\", () => {\n\texpect(\n\t\tisIgnored(\"Auto-merged develop into master\", {\n\t\t\tdefaults: false,\n\t\t}),\n\t).toBe(false);\n});\n\ntest(\"should throw error if ignores is not an array\", () => {\n\tconst ignoredString = \"this should be ignored\";\n\texpect(() => {\n\t\tisIgnored(ignoredString, {\n\t\t\tignores: \"throws error\",\n\t\t} as any);\n\t}).toThrow(\"ignores must be of type array, received \");\n});\n\ntest(\"should return true for custom ignores as function\", () => {\n\tconst ignoredString = \"this should be ignored\";\n\texpect(\n\t\tisIgnored(ignoredString, {\n\t\t\tignores: [(c) => c === ignoredString],\n\t\t}),\n\t).toBe(true);\n});\n\ntest(\"should throw error if any element of ignores is not a function\", () => {\n\tconst ignoredString = \"this should be ignored\";\n\texpect(() => {\n\t\tisIgnored(ignoredString, {\n\t\t\tignores: [\"throws error\"],\n\t\t} as any);\n\t}).toThrow(\"ignores must be array of type function, received items of type:\");\n});\n"
  },
  {
    "path": "@commitlint/is-ignored/src/is-ignored.ts",
    "content": "import { wildcards } from \"./defaults.js\";\nimport { IsIgnoredOptions } from \"@commitlint/types\";\n\nexport default function isIgnored(\n\tcommit: string = \"\",\n\topts: IsIgnoredOptions = {},\n): boolean {\n\tconst ignores = typeof opts.ignores === \"undefined\" ? [] : opts.ignores;\n\n\tif (!Array.isArray(ignores)) {\n\t\tthrow new Error(\n\t\t\t`ignores must be of type array, received ${ignores} of type ${typeof ignores}`,\n\t\t);\n\t}\n\n\tconst invalids = ignores.filter((c) => typeof c !== \"function\");\n\n\tif (invalids.length > 0) {\n\t\tthrow new Error(\n\t\t\t`ignores must be array of type function, received items of type: ${invalids\n\t\t\t\t.map((i) => typeof i)\n\t\t\t\t.join(\", \")}`,\n\t\t);\n\t}\n\n\tconst base = opts.defaults === false ? [] : wildcards;\n\treturn [...base, ...ignores].some((w) => w(commit));\n}\n"
  },
  {
    "path": "@commitlint/is-ignored/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src/**/*.ts\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../types\" }]\n}\n"
  },
  {
    "path": "@commitlint/lint/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/lint\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/lint\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/lint\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/lint\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/lint\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/lint\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/lint\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/lint\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n- ignore empty commit messages [#615](https://github.com/conventional-changelog/commitlint/issues/615) ([#676](https://github.com/conventional-changelog/commitlint/issues/676)) ([c3eb1a7](https://github.com/conventional-changelog/commitlint/commit/c3eb1a76e08213d7ce1f200e35f8d5d6de18982a))\n\n### Features\n\n- add async promise based rules methods into lint ([#976](https://github.com/conventional-changelog/commitlint/issues/976)) ([4443062](https://github.com/conventional-changelog/commitlint/commit/444306249b8a3d04524538f61edca8f6cc10d75f))\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n**Note:** Version bump only for package @commitlint/lint\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/lint\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n### Features\n\n- adds support for plugins ([#228](https://github.com/conventional-changelog/commitlint/issues/228)) ([#588](https://github.com/conventional-changelog/commitlint/issues/588)) ([cea4564](https://github.com/conventional-changelog/commitlint/commit/cea4564))\n- config based is-ignored overrides ([#595](https://github.com/conventional-changelog/commitlint/issues/595)) ([2434d71](https://github.com/conventional-changelog/commitlint/commit/2434d71))\n\n## [7.5.2](https://github.com/conventional-changelog/commitlint/compare/v7.5.1...v7.5.2) (2019-02-11)\n\n**Note:** Version bump only for package @commitlint/lint\n\n## [7.5.1](https://github.com/conventional-changelog/commitlint/compare/v7.5.0...v7.5.1) (2019-02-09)\n\n**Note:** Version bump only for package @commitlint/lint\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.4.0\"></a>\n\n# [7.4.0](https://github.com/conventional-changelog/commitlint/compare/v7.3.2...v7.4.0) (2019-01-27)\n\n**Note:** Version bump only for package @commitlint/lint\n\n<a name=\"7.3.2\"></a>\n\n## [7.3.2](https://github.com/conventional-changelog/commitlint/compare/v7.3.1...v7.3.2) (2019-01-15)\n\n### Bug Fixes\n\n- move loadsh to dependencies ([1bb66a4](https://github.com/conventional-changelog/commitlint/commit/1bb66a4))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/lint\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package @commitlint/lint\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n**Note:** Version bump only for package @commitlint/lint\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/lint\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n**Note:** Version bump only for package @commitlint/lint\n\n<a name=\"6.2.0\"></a>\n\n# [6.2.0](https://github.com/conventional-changelog/commitlint/compare/v6.1.3...v6.2.0) (2018-05-01)\n\n### Features\n\n- print commit message when the message is invalid ([86c34f1](https://github.com/conventional-changelog/commitlint/commit/86c34f1)), closes [#222](https://github.com/conventional-changelog/commitlint/issues/222)\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/lint\n"
  },
  {
    "path": "@commitlint/lint/README.md",
    "content": "# @commitlint/lint\n\nLint a string against commitlint rules\n\n## Getting started\n\n```shell\nnpm install --save @commitlint/lint\n```\n\n## Documentation\n\nConsult [API docs](https://commitlint.js.org/api/lint) for comprehensive documentation.\n\nDocumentation generated from [`docs` folder](../../docs/api/format.md).\n"
  },
  {
    "path": "@commitlint/lint/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/lint/package.json",
    "content": "{\n  \"name\": \"@commitlint/lint\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint a string against commitlint rules\",\n  \"main\": \"lib/lint.js\",\n  \"types\": \"lib/lint.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-import\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/lint\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"dependencies\": {\n    \"@commitlint/is-ignored\": \"^20.5.0\",\n    \"@commitlint/parse\": \"^20.5.0\",\n    \"@commitlint/rules\": \"^20.5.0\",\n    \"@commitlint/types\": \"^20.5.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/lint/src/commit-message.ts",
    "content": "export interface CommitMessageData {\n\theader: string | null;\n\tbody?: string | null;\n\tfooter?: string | null;\n}\n\nexport const buildCommitMessage = ({\n\theader,\n\tbody,\n\tfooter,\n}: CommitMessageData): string => {\n\tlet message = header;\n\n\tmessage = body ? `${message}\\n\\n${body}` : message;\n\tmessage = footer ? `${message}\\n\\n${footer}` : message;\n\n\treturn message || \"\";\n};\n"
  },
  {
    "path": "@commitlint/lint/src/lint.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport lint from \"./lint.js\";\n\ntest(\"throws without params\", async () => {\n\tconst error = (lint as any)();\n\tawait expect(error).rejects.toThrow(\"Expected a raw commit\");\n});\n\ntest(\"positive on empty message\", async () => {\n\texpect(await lint(\"\")).toMatchObject({\n\t\tvalid: true,\n\t\terrors: [],\n\t\twarnings: [],\n\t});\n});\n\ntest(\"positive on stub message and no rule\", async () => {\n\tconst actual = await lint(\"foo: bar\");\n\texpect(actual.valid).toBe(true);\n});\n\ntest(\"positive on stub message and adhered rule\", async () => {\n\tconst actual = await lint(\"foo: bar\", {\n\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", [\"foo\"]],\n\t});\n\texpect(actual.valid).toBe(true);\n});\n\ntest(\"negative on stub message and broken rule\", async () => {\n\tconst actual = await lint(\"foo: bar\", {\n\t\t\"type-enum\": [RuleConfigSeverity.Error, \"never\", [\"foo\"]],\n\t});\n\texpect(actual.valid).toBe(false);\n});\n\ntest(\"positive on ignored message and broken rule\", async () => {\n\tconst actual = await lint('Revert \"some bogus commit\"', {\n\t\t\"type-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t});\n\texpect(actual.valid).toBe(true);\n\texpect(actual.input).toBe('Revert \"some bogus commit\"');\n});\n\ntest(\"negative on ignored message, disabled ignored messages and broken rule\", async () => {\n\tconst actual = await lint(\n\t\t'Revert \"some bogus commit\"',\n\t\t{\n\t\t\t\"type-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t\t{\n\t\t\tdefaultIgnores: false,\n\t\t},\n\t);\n\texpect(actual.valid).toBe(false);\n});\n\ntest(\"positive on custom ignored message and broken rule\", async () => {\n\tconst ignoredMessage = \"some ignored custom message\";\n\tconst actual = await lint(\n\t\tignoredMessage,\n\t\t{\n\t\t\t\"type-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t\t{\n\t\t\tignores: [(c) => c === ignoredMessage],\n\t\t},\n\t);\n\texpect(actual.valid).toBe(true);\n\texpect(actual.input).toBe(ignoredMessage);\n});\n\ntest(\"positive on stub message and opts\", async () => {\n\tconst actual = await lint(\n\t\t\"foo-bar\",\n\t\t{\n\t\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", [\"foo\"]],\n\t\t\t\"type-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t\t{\n\t\t\tparserOpts: {\n\t\t\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/,\n\t\t\t},\n\t\t},\n\t);\n\texpect(actual.valid).toBe(true);\n});\n\ntest(\"throws for invalid rule names\", async () => {\n\tconst error = lint(\"foo\", {\n\t\tfoo: [RuleConfigSeverity.Error, \"always\"],\n\t\tbar: [RuleConfigSeverity.Warning, \"never\"],\n\t});\n\n\tawait expect(error).rejects.toThrow(\n\t\t/^Found rules without implementation: foo, bar/,\n\t);\n});\n\ntest(\"throws for invalid rule config\", async () => {\n\tconst error = lint(\"type(scope): foo\", {\n\t\t\"type-enum\": 1,\n\t\t\"scope-enum\": { 0: 2, 1: \"never\", 2: [\"foo\"], length: 3 },\n\t} as any);\n\n\tawait expect(error).rejects.toThrow(\"type-enum must be array\");\n\tawait expect(error).rejects.toThrow(\"scope-enum must be array\");\n});\n\ntest(\"allows disable shorthand\", async () => {\n\tconst result = lint(\"foo\", { \"type-enum\": [0], \"scope-enum\": [0] });\n\n\tawait expect(result).resolves.toEqual({\n\t\terrors: [],\n\t\tinput: \"foo\",\n\t\tvalid: true,\n\t\twarnings: [],\n\t});\n});\n\ntest(\"throws for rule with invalid length\", async () => {\n\tconst error = lint(\"type(scope): foo\", { \"scope-enum\": [1, 2, 3, 4] } as any);\n\n\tawait expect(error).rejects.toThrow(\"scope-enum must be 2 or 3 items long\");\n});\n\ntest(\"throws for rule with invalid level\", async () => {\n\tconst error = lint(\"type(scope): foo\", {\n\t\t\"type-enum\": [\"2\", \"always\"] as any,\n\t\t\"header-max-length\": [{}, \"always\"] as any,\n\t});\n\tawait expect(error).rejects.toThrow(\"rule type-enum must be number\");\n\tawait expect(error).rejects.toThrow(\"rule header-max-length must be number\");\n});\n\ntest(\"throws for rule with out of range level\", async () => {\n\tconst error = lint(\"type(scope): foo\", {\n\t\t\"type-enum\": [-1, \"always\"] as any,\n\t\t\"header-max-length\": [3, \"always\"] as any,\n\t});\n\n\tawait expect(error).rejects.toThrow(\"rule type-enum must be between 0 and 2\");\n\tawait expect(error).rejects.toThrow(\n\t\t\"rule header-max-length must be between 0 and 2\",\n\t);\n});\n\ntest(\"throws for rule with invalid condition\", async () => {\n\tconst error = lint(\"type(scope): foo\", {\n\t\t\"type-enum\": [1, 2] as any,\n\t\t\"header-max-length\": [1, {}] as any,\n\t});\n\n\tawait expect(error).rejects.toThrow(\"type-enum must be string\");\n\tawait expect(error).rejects.toThrow(\"header-max-length must be string\");\n});\n\ntest(\"throws for rule with out of range condition\", async () => {\n\tconst error = lint(\"type(scope): foo\", {\n\t\t\"type-enum\": [RuleConfigSeverity.Warning, \"foo\"] as any,\n\t\t\"header-max-length\": [RuleConfigSeverity.Warning, \"bar\"] as any,\n\t});\n\n\tawait expect(error).rejects.toThrow('type-enum must be \"always\" or \"never\"');\n\tawait expect(error).rejects.toThrow(\n\t\t'header-max-length must be \"always\" or \"never\"',\n\t);\n});\n\ntest(\"succeds for issue\", async () => {\n\tconst report = await lint(\"somehting #1\", {\n\t\t\"references-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t});\n\n\texpect(report.valid).toBe(true);\n});\n\ntest(\"fails for issue\", async () => {\n\tconst report = await lint(\"somehting #1\", {\n\t\t\"references-empty\": [RuleConfigSeverity.Error, \"always\"],\n\t});\n\n\texpect(report.valid).toBe(false);\n});\n\ntest(\"succeds for custom issue prefix\", async () => {\n\tconst report = await lint(\n\t\t\"somehting REF-1\",\n\t\t{\n\t\t\t\"references-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t\t{\n\t\t\tparserOpts: {\n\t\t\t\tissuePrefixes: [\"REF-\"],\n\t\t\t},\n\t\t},\n\t);\n\n\texpect(report.valid).toBe(true);\n});\n\ntest(\"fails for custom issue prefix\", async () => {\n\tconst report = await lint(\n\t\t\"somehting #1\",\n\t\t{\n\t\t\t\"references-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t\t{\n\t\t\tparserOpts: {\n\t\t\t\tissuePrefixes: [\"REF-\"],\n\t\t\t},\n\t\t},\n\t);\n\n\texpect(report.valid).toBe(false);\n});\n\ntest(\"fails for custom plugin rule\", async () => {\n\tconst report = await lint(\n\t\t\"somehting #1\",\n\t\t{\n\t\t\t\"plugin-rule\": [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t\t{\n\t\t\tplugins: {\n\t\t\t\t\"plugin-example\": {\n\t\t\t\t\trules: {\n\t\t\t\t\t\t\"plugin-rule\": () => [false],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t);\n\n\texpect(report.valid).toBe(false);\n});\n\ntest(\"passes for custom plugin rule\", async () => {\n\tconst report = await lint(\n\t\t\"somehting #1\",\n\t\t{\n\t\t\t\"plugin-rule\": [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t\t{\n\t\t\tplugins: {\n\t\t\t\t\"plugin-example\": {\n\t\t\t\t\trules: {\n\t\t\t\t\t\t\"plugin-rule\": () => [true],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t);\n\n\texpect(report.valid).toBe(true);\n});\n\ntest(\"returns original message only with commit header\", async () => {\n\tconst message = \"foo: bar\";\n\tconst report = await lint(message);\n\n\texpect(report.input).toBe(message);\n});\n\ntest(\"returns original message with commit header and body\", async () => {\n\tconst message = \"foo: bar/n/nFoo bar bizz buzz.\";\n\tconst report = await lint(message);\n\n\texpect(report.input).toBe(message);\n});\n\ntest(\"returns original message with commit header, body and footer\", async () => {\n\tconst message = \"foo: bar/n/nFoo bar bizz buzz./n/nCloses #1\";\n\tconst report = await lint(message);\n\n\texpect(report.input).toBe(message);\n});\n\ntest(\"returns original message with commit header, body and footer, parsing comments\", async () => {\n\tconst expected = \"foo: bar/n/nFoo bar bizz buzz./n/nCloses #1\";\n\tconst message = `${expected}\\n\\n# Some comment to ignore`;\n\tconst report = await lint(\n\t\tmessage,\n\t\t{\n\t\t\t\"references-empty\": [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t\t{\n\t\t\tparserOpts: {\n\t\t\t\tcommentChar: \"#\",\n\t\t\t},\n\t\t},\n\t);\n\n\texpect(report.input).toBe(expected);\n});\n\ntest(\"passes for async rule\", async () => {\n\tconst report = await lint(\n\t\t\"somehting #1\",\n\t\t{\n\t\t\t\"async-rule\": [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t\t{\n\t\t\tplugins: {\n\t\t\t\t\"example-plugin\": {\n\t\t\t\t\trules: {\n\t\t\t\t\t\t\"async-rule\": async () => [true, \"all good\"] as const,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t);\n\n\texpect(report.valid).toBe(true);\n});\n"
  },
  {
    "path": "@commitlint/lint/src/lint.ts",
    "content": "import util from \"node:util\";\nimport isIgnored from \"@commitlint/is-ignored\";\nimport parse from \"@commitlint/parse\";\nimport defaultRules from \"@commitlint/rules\";\nimport type {\n\tLintOptions,\n\tLintOutcome,\n\tLintRuleOutcome,\n\tRule,\n\tBaseRule,\n\tRuleType,\n\tQualifiedRules,\n} from \"@commitlint/types\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport { buildCommitMessage } from \"./commit-message.js\";\n\nexport default async function lint(\n\tmessage: string,\n\trawRulesConfig?: QualifiedRules,\n\trawOpts?: LintOptions,\n): Promise<LintOutcome> {\n\tconst opts = rawOpts\n\t\t? rawOpts\n\t\t: { defaultIgnores: undefined, ignores: undefined };\n\tconst rulesConfig = rawRulesConfig || {};\n\n\t// Found a wildcard match, skip\n\tif (\n\t\tisIgnored(message, { defaults: opts.defaultIgnores, ignores: opts.ignores })\n\t) {\n\t\treturn {\n\t\t\tvalid: true,\n\t\t\terrors: [],\n\t\t\twarnings: [],\n\t\t\tinput: message,\n\t\t};\n\t}\n\n\t// Parse the commit message\n\tconst parsed =\n\t\tmessage === \"\"\n\t\t\t? { header: null, body: null, footer: null }\n\t\t\t: await parse(message, undefined, opts.parserOpts);\n\n\tif (\n\t\tparsed.header === null &&\n\t\tparsed.body === null &&\n\t\tparsed.footer === null\n\t) {\n\t\t// Commit is empty, skip\n\t\treturn {\n\t\t\tvalid: true,\n\t\t\terrors: [],\n\t\t\twarnings: [],\n\t\t\tinput: message,\n\t\t};\n\t}\n\n\tconst allRules: Map<string, BaseRule<never, RuleType>> = new Map(\n\t\tObject.entries(defaultRules),\n\t);\n\n\tif (opts.plugins) {\n\t\tObject.values(opts.plugins).forEach((plugin) => {\n\t\t\tif (plugin.rules) {\n\t\t\t\tObject.keys(plugin.rules).forEach((ruleKey) =>\n\t\t\t\t\tallRules.set(ruleKey, plugin.rules[ruleKey]),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Find invalid rules configs\n\tconst missing = Object.keys(rulesConfig).filter(\n\t\t(name) => typeof allRules.get(name) !== \"function\",\n\t);\n\n\tif (missing.length > 0) {\n\t\tconst names = [...allRules.keys()];\n\t\tthrow new RangeError(\n\t\t\t[\n\t\t\t\t`Found rules without implementation: ${missing.join(\", \")}.`,\n\t\t\t\t`Supported rules are: ${names.join(\", \")}.`,\n\t\t\t].join(\"\\n\"),\n\t\t);\n\t}\n\n\tconst invalid = Object.entries(rulesConfig)\n\t\t.map(([name, config]) => {\n\t\t\tif (!Array.isArray(config)) {\n\t\t\t\treturn new Error(\n\t\t\t\t\t`config for rule ${name} must be array, received ${util.inspect(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t)} of type ${typeof config}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst [level] = config;\n\n\t\t\tif (level === RuleConfigSeverity.Disabled && config.length === 1) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst [, when] = config;\n\n\t\t\tif (typeof level !== \"number\" || isNaN(level)) {\n\t\t\t\treturn new Error(\n\t\t\t\t\t`level for rule ${name} must be number, received ${util.inspect(\n\t\t\t\t\t\tlevel,\n\t\t\t\t\t)} of type ${typeof level}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (config.length < 2 || config.length > 3) {\n\t\t\t\treturn new Error(\n\t\t\t\t\t`config for rule ${name} must be 2 or 3 items long, received ${util.inspect(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t)} of length ${config.length}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (level < 0 || level > 2) {\n\t\t\t\treturn new RangeError(\n\t\t\t\t\t`level for rule ${name} must be between 0 and 2, received ${util.inspect(\n\t\t\t\t\t\tlevel,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof when !== \"string\") {\n\t\t\t\treturn new Error(\n\t\t\t\t\t`condition for rule ${name} must be string, received ${util.inspect(\n\t\t\t\t\t\twhen,\n\t\t\t\t\t)} of type ${typeof when}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (when !== \"never\" && when !== \"always\") {\n\t\t\t\treturn new Error(\n\t\t\t\t\t`condition for rule ${name} must be \"always\" or \"never\", received ${util.inspect(\n\t\t\t\t\t\twhen,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t})\n\t\t.filter((item): item is Error => item instanceof Error);\n\n\tif (invalid.length > 0) {\n\t\tthrow new Error(invalid.map((i) => i.message).join(\"\\n\"));\n\t}\n\n\t// Validate against all rules\n\tconst pendingResults = Object.entries(rulesConfig)\n\t\t// Level 0 rules are ignored\n\t\t.filter(([, config]) => !!config && config.length && config[0] > 0)\n\t\t.map(async (entry) => {\n\t\t\tconst [name, config] = entry;\n\t\t\tconst [level, when, value] = config!; //\n\n\t\t\tconst rule = allRules.get(name);\n\n\t\t\tif (!rule) {\n\t\t\t\tthrow new Error(`Could not find rule implementation for ${name}`);\n\t\t\t}\n\n\t\t\tconst executableRule = rule as Rule<unknown>;\n\t\t\tconst [valid, message] = await executableRule(parsed, when, value);\n\n\t\t\treturn {\n\t\t\t\tlevel,\n\t\t\t\tvalid,\n\t\t\t\tname,\n\t\t\t\tmessage,\n\t\t\t};\n\t\t});\n\n\tconst results = (await Promise.all(pendingResults)).filter(\n\t\t(result): result is LintRuleOutcome => result !== null,\n\t);\n\n\tconst errors = results.filter(\n\t\t(result) => result.level === RuleConfigSeverity.Error && !result.valid,\n\t);\n\tconst warnings = results.filter(\n\t\t(result) => result.level === RuleConfigSeverity.Warning && !result.valid,\n\t);\n\n\tconst valid = errors.length === 0;\n\n\treturn {\n\t\tvalid,\n\t\terrors,\n\t\twarnings,\n\t\tinput: buildCommitMessage(parsed),\n\t};\n}\n"
  },
  {
    "path": "@commitlint/lint/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [\n    { \"path\": \"../is-ignored\" },\n    { \"path\": \"../parse\" },\n    { \"path\": \"../rules\" },\n    { \"path\": \"../types\" }\n  ]\n}\n"
  },
  {
    "path": "@commitlint/load/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n\n### Bug Fixes\n\n* **load:** resolve async config exports in CJS projects ([#4659](https://github.com/conventional-changelog/commitlint/issues/4659)) ([fce263f](https://github.com/conventional-changelog/commitlint/commit/fce263f544977958f476d6f4c8539e5fab996198)), closes [#4557](https://github.com/conventional-changelog/commitlint/issues/4557)\n* **resolve-extends:** always resolve extended parser presets for proper merging ([#4647](https://github.com/conventional-changelog/commitlint/issues/4647)) ([e9ef76c](https://github.com/conventional-changelog/commitlint/commit/e9ef76caf44e77f22086910ce706bbe0c03b0ab5)), closes [#4640](https://github.com/conventional-changelog/commitlint/issues/4640)\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n\n### Bug Fixes\n\n* footer parser does not escape special chars for regex [#4560](https://github.com/conventional-changelog/commitlint/issues/4560) ([#4634](https://github.com/conventional-changelog/commitlint/issues/4634)) ([8ff7c7f](https://github.com/conventional-changelog/commitlint/commit/8ff7c7fcbc2db2b45910ecb5c01e9f1763060770))\n* npx usage [#613](https://github.com/conventional-changelog/commitlint/issues/613) ([#4630](https://github.com/conventional-changelog/commitlint/issues/4630)) ([1644f1e](https://github.com/conventional-changelog/commitlint/commit/1644f1e8f74a844547e44e3e7a76fabbb96775f8)), closes [#3](https://github.com/conventional-changelog/commitlint/issues/3) [#1](https://github.com/conventional-changelog/commitlint/issues/1) [#2](https://github.com/conventional-changelog/commitlint/issues/2) [#4](https://github.com/conventional-changelog/commitlint/issues/4) [#5](https://github.com/conventional-changelog/commitlint/issues/5) [#7](https://github.com/conventional-changelog/commitlint/issues/7) [#6](https://github.com/conventional-changelog/commitlint/issues/6)\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n\n### Features\n\n* upgrade conventional commit packages [#4082](https://github.com/conventional-changelog/commitlint/issues/4082) ([#4597](https://github.com/conventional-changelog/commitlint/issues/4597)) ([3aaf0a6](https://github.com/conventional-changelog/commitlint/commit/3aaf0a603c4047d268d85207957c919f45b60e1f))\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n\n### Features\n\n* add support for .mts config file ([#4581](https://github.com/conventional-changelog/commitlint/issues/4581)) ([66e05ab](https://github.com/conventional-changelog/commitlint/commit/66e05abc34dd33bed7b5d1830328bc8740b71eaa))\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n\n### Features\n\n* **load:** update cosmiconfig to v9 to add support for `package.yaml` config ([#3976](https://github.com/conventional-changelog/commitlint/issues/3976)) ([94eab40](https://github.com/conventional-changelog/commitlint/commit/94eab40798e0c8d3945aa2b1e629669b231d8468))\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n\n### Bug Fixes\n\n* drop `resolve-from`, `resolve-global` and `import-fresh`, resolve global packages correctly ([#3939](https://github.com/conventional-changelog/commitlint/issues/3939)) ([8793c63](https://github.com/conventional-changelog/commitlint/commit/8793c639c083c33714da0a29429b338776813d0c)), closes [#3938](https://github.com/conventional-changelog/commitlint/issues/3938)\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n\n### Bug Fixes\n\n* **@commitlint/load:** Remove unused `@types/node` dependency ([#3801](https://github.com/conventional-changelog/commitlint/issues/3801)) ([7b3f8b3](https://github.com/conventional-changelog/commitlint/commit/7b3f8b3fe106311682a2e8ad281dd9a4e42443c6))\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n## [18.4.1](https://github.com/conventional-changelog/commitlint/compare/v18.4.0...v18.4.1) (2023-11-12)\n\n\n### Bug Fixes\n\n* update cosmiconfig to specific version ([#3755](https://github.com/conventional-changelog/commitlint/issues/3755)) ([636b8b1](https://github.com/conventional-changelog/commitlint/commit/636b8b1338835b239ab0585e062bfe305fca4424))\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n\n### Features\n\n* bump cosmiconfig version and conditionally support mjs config ([#3747](https://github.com/conventional-changelog/commitlint/issues/3747)) ([a2b65fc](https://github.com/conventional-changelog/commitlint/commit/a2b65fc0cfee2259e197c291ea40ef2d076ab837))\n\n\n\n\n\n# [18.2.0](https://github.com/conventional-changelog/commitlint/compare/v18.1.0...v18.2.0) (2023-10-26)\n\n\n### Features\n\n* **load:** use cosmiconfig-typescript-loader v5 to remove ts-node dependency for @commitlint/load ([#3722](https://github.com/conventional-changelog/commitlint/issues/3722)) ([1ff49ea](https://github.com/conventional-changelog/commitlint/commit/1ff49ea14adb180eb54ec3d7479990b66ba26720))\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n\n### Features\n\n* lazy load cosmiconfig-typescript-loader ([#3694](https://github.com/conventional-changelog/commitlint/issues/3694)) ([b058c7c](https://github.com/conventional-changelog/commitlint/commit/b058c7cc49333e7898402fa55467ec097801ce25))\n\n\n\n\n\n## [17.7.2](https://github.com/conventional-changelog/commitlint/compare/v17.7.1...v17.7.2) (2023-09-28)\n\n\n### Bug Fixes\n\n* update dependency @types/node to v20.5.1 ([#3653](https://github.com/conventional-changelog/commitlint/issues/3653)) ([cd8b775](https://github.com/conventional-changelog/commitlint/commit/cd8b7750d3a15fbfd96e20196d53df064df6e138))\n\n\n\n\n\n## [17.7.1](https://github.com/conventional-changelog/commitlint/compare/v17.7.0...v17.7.1) (2023-08-10)\n\n\n### Reverts\n\n* Revert \"feat(load): use cosmiconfig-typescript-loader v5 to remove ts-node dependency for @commitlint/load (#3633)\" ([8e41897](https://github.com/conventional-changelog/commitlint/commit/8e41897a42c45988ff8c25576c4f13bb11d84c4e)), closes [#3633](https://github.com/conventional-changelog/commitlint/issues/3633)\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n\n### Features\n\n* **load:** use cosmiconfig-typescript-loader v5 to remove ts-node dependency for @commitlint/load ([#3633](https://github.com/conventional-changelog/commitlint/issues/3633)) ([4aa46d7](https://github.com/conventional-changelog/commitlint/commit/4aa46d796ad74958f5569d3346b60a1f92c33892))\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n\n### Features\n\n* support typescript 5.0 ([#3566](https://github.com/conventional-changelog/commitlint/issues/3566)) ([c0a27ff](https://github.com/conventional-changelog/commitlint/commit/c0a27ffa3dcaef296ef58ce37bd8ca0a9d315d6e))\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n\n### Bug Fixes\n\n* **load:** fixes a bug when a ts commitlint config is compiled twice ([#3499](https://github.com/conventional-changelog/commitlint/issues/3499)) ([dc2c899](https://github.com/conventional-changelog/commitlint/commit/dc2c899b5d7e4e7a7be79901b28e46da9f519211))\n\n\n\n\n\n## [17.4.1](https://github.com/conventional-changelog/commitlint/compare/v17.4.0...v17.4.1) (2023-01-09)\n\n**Note:** Version bump only for package @commitlint/load\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n### Bug Fixes\n\n- update dependency cosmiconfig to v8 ([#3459](https://github.com/conventional-changelog/commitlint/issues/3459)) ([ee732fe](https://github.com/conventional-changelog/commitlint/commit/ee732fe0ef2057bdae93b7c368392934ac0de3af))\n\n### Features\n\n- support config .cts extension ([#3461](https://github.com/conventional-changelog/commitlint/issues/3461)) ([85ad18b](https://github.com/conventional-changelog/commitlint/commit/85ad18b8990567df516effcacbf04edbcbb6b6d7))\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/load\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [17.1.2](https://github.com/conventional-changelog/commitlint/compare/v17.1.1...v17.1.2) (2022-08-29)\n\n### Bug Fixes\n\n- **load:** add ts-node as direct dependency ([#3351](https://github.com/conventional-changelog/commitlint/issues/3351)) ([3b66891](https://github.com/conventional-changelog/commitlint/commit/3b668911d8f9fd93e0f613842d5c0b7c3f24360a))\n- update dependency cosmiconfig-typescript-loader to v4 ([#3346](https://github.com/conventional-changelog/commitlint/issues/3346)) ([5a9d80f](https://github.com/conventional-changelog/commitlint/commit/5a9d80fba352deae1c2855792be4f8458a973431))\n\n## [17.1.1](https://github.com/conventional-changelog/commitlint/compare/v17.1.0...v17.1.1) (2022-08-27)\n\n### Bug Fixes\n\n- **load:** peer-dep version [#3345](https://github.com/conventional-changelog/commitlint/issues/3345) ([2dd7b50](https://github.com/conventional-changelog/commitlint/commit/2dd7b50c983e2720ad25c368e5a0f13b80ab7927))\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n### Bug Fixes\n\n- update dependency cosmiconfig-typescript-loader to v3 ([#3253](https://github.com/conventional-changelog/commitlint/issues/3253)) ([4e87d14](https://github.com/conventional-changelog/commitlint/commit/4e87d1431df6d39990e5f56a579604b1b3268ce6))\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/load\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n### Bug Fixes\n\n- update dependency cosmiconfig-typescript-loader to v2 ([#3154](https://github.com/conventional-changelog/commitlint/issues/3154)) ([20122e8](https://github.com/conventional-changelog/commitlint/commit/20122e8d6e999b74eab3bab08a6d52cda3f13e37))\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n### Bug Fixes\n\n- **load:** satisfy @types/node peer dependency for cosmiconfig-loader-typescript ([#3008](https://github.com/conventional-changelog/commitlint/issues/3008)) ([338180c](https://github.com/conventional-changelog/commitlint/commit/338180c7174625cddd7a0ea2b9d2786fee375756)), closes [#3007](https://github.com/conventional-changelog/commitlint/issues/3007)\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n### Features\n\n- **load:** accept functions as parser presets ([#2982](https://github.com/conventional-changelog/commitlint/issues/2982)) ([420e8d6](https://github.com/conventional-changelog/commitlint/commit/420e8d6a4d5663ade953272275a9e0fa7c5ddff0)), closes [#2964](https://github.com/conventional-changelog/commitlint/issues/2964) [#2964](https://github.com/conventional-changelog/commitlint/issues/2964)\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n### Features\n\n- config validation ([#2412](https://github.com/conventional-changelog/commitlint/issues/2412)) ([c717202](https://github.com/conventional-changelog/commitlint/commit/c7172022097b11f46b33617e4a94d751243c1049)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n### Bug Fixes\n\n- **types:** fix signature of QualifiedRuleConfig for async configurations ([#2868](https://github.com/conventional-changelog/commitlint/issues/2868)) ([#2869](https://github.com/conventional-changelog/commitlint/issues/2869)) ([c7f355b](https://github.com/conventional-changelog/commitlint/commit/c7f355b25e5baddab0b9559892f5ce4112e4f93a))\n\n### Features\n\n- simplify config resolution ([#2398](https://github.com/conventional-changelog/commitlint/issues/2398)) ([8a8384f](https://github.com/conventional-changelog/commitlint/commit/8a8384f3c18954447cb633e76a573e1db71a1440)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n### Features\n\n- extend helpUrl from shareable config ([#2846](https://github.com/conventional-changelog/commitlint/issues/2846)) ([d7e2e2b](https://github.com/conventional-changelog/commitlint/commit/d7e2e2b943be383f99f4000b6b6bed0eab03bfcf))\n- **load:** add support for `.commitlintrc.cjs` and `commitlint.config.cjs` files ([#2797](https://github.com/conventional-changelog/commitlint/issues/2797)) ([fabb495](https://github.com/conventional-changelog/commitlint/commit/fabb49509730609276ff9ef6357536c95a1f6bb1))\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [13.2.1](https://github.com/conventional-changelog/commitlint/compare/v13.2.0...v13.2.1) (2021-10-09)\n\n### Bug Fixes\n\n- **load:** added a direct dependency on typescript ([#2785](https://github.com/conventional-changelog/commitlint/issues/2785)) ([9c17f8d](https://github.com/conventional-changelog/commitlint/commit/9c17f8d423404b484f72df41358a18bd90014ecd)), closes [EndemolShineGroup/cosmiconfig-typescript-loader#147](https://github.com/EndemolShineGroup/cosmiconfig-typescript-loader/issues/147) [#2779](https://github.com/conventional-changelog/commitlint/issues/2779)\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n### Bug Fixes\n\n- **types:** user config prompt ([6d7a1c4](https://github.com/conventional-changelog/commitlint/commit/6d7a1c40e2f8a8ff22595e0e17f71f3702b0699c))\n\n### Features\n\n- **load:** add cosmiconfig typescript loader ([b65aced](https://github.com/conventional-changelog/commitlint/commit/b65acedc3334a859811762539ec8716de3e73f85))\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/load\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/load\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n### Bug Fixes\n\n- **load:** use `Rule | AsyncRule | SyncRule` as rule value type in `Plugin` ([#2146](https://github.com/conventional-changelog/commitlint/issues/2146)) ([75b67b8](https://github.com/conventional-changelog/commitlint/commit/75b67b8fb7fc4df21267b98f0c9daeeb1130b824))\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- update dependency execa to v4.1.0 ([#2251](https://github.com/conventional-changelog/commitlint/issues/2251)) ([b5743dd](https://github.com/conventional-changelog/commitlint/commit/b5743dd1e49bbe7eac03f34bc38c59df5fbaf2a0))\n- update dependency execa to v5 ([#2341](https://github.com/conventional-changelog/commitlint/issues/2341)) ([f349df9](https://github.com/conventional-changelog/commitlint/commit/f349df90f08096a9bcad46b5e55b411aac327a24))\n\n### Features\n\n- **load:** allow specifying helpUrl via config ([#2180](https://github.com/conventional-changelog/commitlint/issues/2180)) ([d6795a3](https://github.com/conventional-changelog/commitlint/commit/d6795a3c4633ba6efd7a0fcff48339dc291cd832))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/load\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency cosmiconfig to v7 ([#2044](https://github.com/conventional-changelog/commitlint/issues/2044)) ([f4db933](https://github.com/conventional-changelog/commitlint/commit/f4db93324698ea39528be0d2692151546c2b5517))\n- update dependency execa to v4 ([#1936](https://github.com/conventional-changelog/commitlint/issues/1936)) ([8efb441](https://github.com/conventional-changelog/commitlint/commit/8efb44193058d286f7325327a6d33936b273ec91))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n### Bug Fixes\n\n- **load:** resolve plugins from extended configs ([#1976](https://github.com/conventional-changelog/commitlint/issues/1976)) ([d0f0eb9](https://github.com/conventional-changelog/commitlint/commit/d0f0eb9fde7efc2dff7a3aad190ded14303d3079))\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency chalk to v4 ([#1275](https://github.com/conventional-changelog/commitlint/issues/1275)) ([a5d8fa1](https://github.com/conventional-changelog/commitlint/commit/a5d8fa118e8221361f14f5fd2b21d7aaad008a27))\n\n### Features\n\n- add local plugins support ([#1692](https://github.com/conventional-changelog/commitlint/issues/1692)) ([7b29c48](https://github.com/conventional-changelog/commitlint/commit/7b29c48321b513e091849fbb2cc2bf0e6ebb94a6))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/load\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/load\n\n## [8.3.1](https://github.com/conventional-changelog/commitlint/compare/v8.3.0...v8.3.1) (2019-10-16)\n\n### Bug Fixes\n\n- **load:** resolve nested parser preset factories ([#831](https://github.com/conventional-changelog/commitlint/issues/831)) ([73a7df7](https://github.com/conventional-changelog/commitlint/commit/73a7df7))\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n### Features\n\n- **config-conventional:** use parser with short breaking change support ([#821](https://github.com/conventional-changelog/commitlint/issues/821)) ([4b5300a](https://github.com/conventional-changelog/commitlint/commit/4b5300a))\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/load\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n### Bug Fixes\n\n- add explicit dependency on chalk ([#687](https://github.com/conventional-changelog/commitlint/issues/687)) ([9075844](https://github.com/conventional-changelog/commitlint/commit/9075844))\n\n## [7.6.1](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.1) (2019-05-09)\n\n### Bug Fixes\n\n- handle absolute config paths correctly [#647](https://github.com/conventional-changelog/commitlint/issues/647) ([49b3a77](https://github.com/conventional-changelog/commitlint/commit/49b3a77))\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n### Bug Fixes\n\n- remove unneeded dev dependency ([6ccaf79](https://github.com/conventional-changelog/commitlint/commit/6ccaf79))\n- update cosmiconfig to safe >=5 [#599](https://github.com/conventional-changelog/commitlint/issues/599) ([f186fcb](https://github.com/conventional-changelog/commitlint/commit/f186fcb))\n\n### Features\n\n- adds support for plugins ([#228](https://github.com/conventional-changelog/commitlint/issues/228)) ([#588](https://github.com/conventional-changelog/commitlint/issues/588)) ([cea4564](https://github.com/conventional-changelog/commitlint/commit/cea4564))\n- config based is-ignored overrides ([#595](https://github.com/conventional-changelog/commitlint/issues/595)) ([2434d71](https://github.com/conventional-changelog/commitlint/commit/2434d71))\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/load\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n\n### Features\n\n- check stage before entering prompt ([#495](https://github.com/conventional-changelog/commitlint/issues/495)) ([3b3667a](https://github.com/conventional-changelog/commitlint/commit/3b3667a)), closes [#51](https://github.com/conventional-changelog/commitlint/issues/51) [#51](https://github.com/conventional-changelog/commitlint/issues/51)\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n### Bug Fixes\n\n- improve format module resolving ([#464](https://github.com/conventional-changelog/commitlint/issues/464)) ([baed8b1](https://github.com/conventional-changelog/commitlint/commit/baed8b1))\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n### Features\n\n- **load:** add formatter option with default value ([b0e63d9](https://github.com/conventional-changelog/commitlint/commit/b0e63d9))\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/load\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/load\n"
  },
  {
    "path": "@commitlint/load/README.md",
    "content": "# @commitlint/load\n\nLoad shared commitlint configuration\n\n## Getting started\n\n```shell\nnpm install --save-dev @commitlint/load\n```\n\n## Documentation\n\nConsult [API docs](https://commitlint.js.org/api/load) for comprehensive documentation.\n\nDocumentation generated from [`docs` folder](../../docs/api/format.md).\n"
  },
  {
    "path": "@commitlint/load/fixtures/async-config-function/commitlint.config.cjs",
    "content": "'use strict';\n\nmodule.exports = async () => ({\n\trules: {\n\t\t'body-case': [2, 'never', 'upper-case'],\n\t},\n});\n"
  },
  {
    "path": "@commitlint/load/fixtures/async-config-function/package.json",
    "content": "{\n  \"name\": \"async-config-function-test\"\n}\n"
  },
  {
    "path": "@commitlint/load/fixtures/async-config-promise/commitlint.config.cjs",
    "content": "'use strict';\n\nmodule.exports = Promise.resolve({\n\trules: {\n\t\t'body-case': [2, 'never', 'upper-case'],\n\t},\n});\n"
  },
  {
    "path": "@commitlint/load/fixtures/async-config-promise/package.json",
    "content": "{\n  \"name\": \"async-config-promise-test\"\n}\n"
  },
  {
    "path": "@commitlint/load/fixtures/basic/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\t'body-case': [1, 'never', 'camel-case']\n\t}\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/.commitlintrc",
    "content": "formatter: '@commitlint/format'\nrules:\n  zero: [0, 'never']\n  one: [1, 'always']\n  two: [2, 'never']"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/.commitlintrc.cjs",
    "content": "'use strict';\n\nmodule.exports = {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/.commitlintrc.cts",
    "content": "'use strict';\n\nmodule.exports = {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/.commitlintrc.js",
    "content": "module.exports = {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/.commitlintrc.json",
    "content": "{\n  \"formatter\": \"@commitlint/format\",\n\t\"rules\": {\n\t\t\"zero\": [0, \"never\"],\n\t\t\"one\": [1, \"always\"],\n\t\t\"two\": [2, \"never\"]\n\t}\n}"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/.commitlintrc.yaml",
    "content": "formatter: '@commitlint/format'\nrules:\n  zero: [0, 'never']\n  one: [1, 'always']\n  two: [2, 'never']"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/.commitlintrc.yml",
    "content": "formatter: '@commitlint/format'\nrules:\n  zero: [0, 'never']\n  one: [1, 'always']\n  two: [2, 'never']"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/commitlint.config.cjs",
    "content": "'use strict';\n\nmodule.exports = {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/commitlint.config.cts",
    "content": "'use strict';\n\nmodule.exports = {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/commitlint.config.js",
    "content": "module.exports = {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/esm/.commitlintrc.js",
    "content": "export default {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/esm/.commitlintrc.mjs",
    "content": "export default {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/esm/.commitlintrc.mts",
    "content": "export default {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/esm/commitlint.config.js",
    "content": "export default {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/esm/commitlint.config.mjs",
    "content": "export default {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/basic-config/esm/commitlint.config.mts",
    "content": "export default {\n\tformatter: '@commitlint/format',\n\trules: {\n\t\tzero: [0, 'never'],\n\t\tone: [1, 'always'],\n\t\ttwo: [2, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/basic-template/package.json",
    "content": "{\n  \"name\": \"load-test-js\"\n}"
  },
  {
    "path": "@commitlint/load/fixtures/empty-file/commitlint.config.js",
    "content": ""
  },
  {
    "path": "@commitlint/load/fixtures/empty-object-file/commitlint.config.js",
    "content": "module.exports = {};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/.commitlintrc",
    "content": "extends:\n  - './first-extended'\nrules:\n  zero: [0, 'never']"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/.commitlintrc.cjs",
    "content": "'use strict';\n\nmodule.exports = {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/.commitlintrc.cts",
    "content": "'use strict';\n\nmodule.exports = {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/.commitlintrc.js",
    "content": "module.exports = {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/.commitlintrc.json",
    "content": "{\n  \"extends\": [\"./first-extended\"],\n  \"rules\": {\n    \"zero\": [0, \"never\"]\n  }\n}"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/.commitlintrc.yaml",
    "content": "extends:\n  - './first-extended'\nrules:\n  zero: [0, 'never']"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/.commitlintrc.yml",
    "content": "extends:\n  - './first-extended'\nrules:\n  zero: [0, 'never']"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/commitlint.config.cjs",
    "content": "'use strict';\n\nmodule.exports = {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/commitlint.config.cts",
    "content": "'use strict';\n\nmodule.exports = {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/esm/.commitlintrc.js",
    "content": "export default {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/esm/.commitlintrc.mjs",
    "content": "export default {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/esm/.commitlintrc.mts",
    "content": "export default {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/esm/commitlint.config.js",
    "content": "export default {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/esm/commitlint.config.mjs",
    "content": "export default {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};"
  },
  {
    "path": "@commitlint/load/fixtures/extends-config/esm/commitlint.config.mts",
    "content": "export default {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-empty/commitlint.config.js",
    "content": "module.exports = {\n\textends: []\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-invalid/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['____foooooo']\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-js-template/first-extended/index.js",
    "content": "module.exports = {\n\textends: ['./second-extended'],\n\trules: {\n\t\tone: [1, 'always'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-js-template/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\trules: {\n\t\ttwo: [2, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-js-template/package.json",
    "content": "{\n  \"name\": \"load-test-js\"\n}"
  },
  {
    "path": "@commitlint/load/fixtures/extends-plugins/commitlint.config.js",
    "content": "module.exports = {\n\textends: [],\n\tplugins: ['example', '@scope/example']\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-with-local-plugins/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./config-with-local-plugin'],\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-with-local-plugins/config-with-local-plugin/commitlint.config.js",
    "content": "module.exports = {\n\textends: [],\n\tplugins: [{\n\t\trules: {\n\t\t\t'hello-world-rule': ({ subject }) => {\n\t\t\t\tconst HELLO_WORLD = 'Hello World';\n\t\t\t\treturn [\n\t\t\t\t  subject.includes(HELLO_WORLD),\n\t\t\t\t  `Your subject should contain ${HELLO_WORLD} message`\n\t\t\t\t];\n\t\t\t },\n\t\t\t 'is-positive': ({ subject }) => {\n\t\t\t\tconst POSITIVE_EMOJI = ':)';\n\t\t\t\treturn [\n\t\t\t\t  subject.includes(POSITIVE_EMOJI),\n\t\t\t\t  `Your subject should contain ${POSITIVE_EMOJI} message`\n\t\t\t\t];\n\t\t\t }\n  \t\t}\n\t}]\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-with-local-plugins/config-with-local-plugin/index.js",
    "content": "module.exports = require('./commitlint.config.js');\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-with-plugins/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./config-with-plugins'],\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-with-plugins/config-with-plugins/commitlint.config.js",
    "content": "module.exports = {\n\tplugins: ['example', '@scope/example']\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/extends-with-plugins/config-with-plugins/index.js",
    "content": "module.exports = require('./commitlint.config.js');\n"
  },
  {
    "path": "@commitlint/load/fixtures/formatter/commitlint.config.js",
    "content": "module.exports = {\n\tformatter: 'commitlint-junit'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/formatter-local-module/commitlint.config.js",
    "content": "module.exports = {\n\tformatter: './formatters/custom.js'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/formatter-local-module/formatters/custom.js",
    "content": "module.exports = function(_report) {\n\treturn 'ok';\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/help-url/commitlint.config.js",
    "content": "module.exports = {\n\thelpUrl: 'https://github.com/conventional-changelog/commitlint'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/outer-scope/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\touter: [1, 'never', true],\n\t\tinner: [1, 'never', false],\n\t\tchild: [1, 'never', false],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/outer-scope/inner-scope/child-scope/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\touter: [2, 'always', false],\n\t\tinner: [2, 'always', false],\n\t\tchild: [2, 'always', true],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/overridden-type-enums/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./extended'],\n\trules: {\n\t\t'type-enum': [2, 'always', ['a', 'b', 'c', 'd']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/overridden-type-enums/extended.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [\n\t\t\t2,\n\t\t\t'always',\n\t\t\t[\n\t\t\t\t'build',\n\t\t\t\t'ci',\n\t\t\t\t'docs',\n\t\t\t\t'feat',\n\t\t\t\t'fix',\n\t\t\t\t'perf',\n\t\t\t\t'refactor',\n\t\t\t\t'revert',\n\t\t\t\t'style',\n\t\t\t\t'test'\n\t\t\t]\n\t\t]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/package.json",
    "content": "{\n  \"type\": \"commonjs\"\n}\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset/commitlint.config.js",
    "content": "module.exports = {\n\tparserOpts: {\n\t\tparserPreset: './conventional-changelog-custom'\n\t}\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset/conventional-changelog-custom.js",
    "content": "module.exports = Promise.resolve().then(() => ({\n\tparserOpts: {\n\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/\n\t}\n}));\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-angular/commitlint.config.js",
    "content": "module.exports = {\n\tparserPreset: 'conventional-changelog-angular'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-angular/package.json",
    "content": "{\n  \"name\": \"parser-preset-angular\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"conventional-changelog-angular\": \"^7.0.0\"\n  }\n}\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-conventional-without-factory/commitlint.config.js",
    "content": "module.exports = {\n\tparserPreset: 'conventional-changelog-conventionalcommits'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-conventional-without-factory/package.json",
    "content": "{\n  \"name\": \"parser-preset-conventional-without-factory\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"conventional-changelog-conventionalcommits\": \"^9.2.0\"\n  }\n}\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-conventionalcommits/commitlint.config.js",
    "content": "module.exports = {\n\tparserPreset: 'conventional-changelog-conventionalcommits'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-conventionalcommits/package.json",
    "content": "{\n  \"name\": \"parser-preset-conventionalcommits\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"conventional-changelog-conventionalcommits\": \"^9.2.0\"\n  }\n}\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-override/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./extended'],\n\tparserPreset: './custom'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-override/custom.js",
    "content": "module.exports = {\n\tparserOpts: {\n\t\theaderPattern: /.*/\n\t},\n\tb: 'b'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-override/extended/custom.js",
    "content": "module.exports = Promise.resolve({\n\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/,\n\ta: 'a'\n});\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-override/extended/index.js",
    "content": "module.exports = {\n\tparserPreset: './custom'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-partial-user-override/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./extended'],\n\tparserPreset: {\n\t\tparserOpts: {\n\t\t\tissuePrefixes: ['PROJ-'],\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-partial-user-override/extended/conventional-changelog-custom.js",
    "content": "module.exports = {\n\tparserOpts: {\n\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?!?: (.*)$/,\n\t\theaderCorrespondence: ['type', 'scope', 'subject'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/parser-preset-partial-user-override/extended/index.js",
    "content": "module.exports = {\n\tparserPreset: './conventional-changelog-custom',\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-extends/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: [0, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-extends/first-extended/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./second-extended'],\n\trules: {\n\t\tone: [1, 'always'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-extends/first-extended/index.js",
    "content": "module.exports = require('./commitlint.config.js');\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-extends/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\trules: {\n\t\ttwo: [2, 'never'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-extends-ts/commitlint.config.ts",
    "content": "import type {UserConfig} from './types';\n\nconst Configuration: UserConfig = {\n\textends: ['./first-extended/index.ts'],\n\trules: {\n\t\tzero: [0, 'never', 'zero']\n\t}\n};\nmodule.exports = Configuration;"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-extends-ts/first-extended/index.ts",
    "content": "import type {UserConfig} from '../types';\nmodule.exports = {\n\textends: ['./second-extended/index.ts'],\n\trules: {\n\t\tone: [1, 'never', 'one']\n\t}\n} as UserConfig;\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-extends-ts/first-extended/second-extended/index.ts",
    "content": "import type {UserConfig} from '../../types';\nmodule.exports = {\n\trules: {\n\t\ttwo: [2, 'never', 'two']\n\t}\n} as UserConfig;\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-extends-ts/types.ts",
    "content": "export interface UserConfig {\n\textends?: string[];\n\tformatter?: string;\n\trules?: any;\n\tparserPreset?: any;\n\tignores?: ((commit: string) => boolean)[];\n\tdefaultIgnores?: boolean;\n\tplugins?: (string | Plugin)[];\n\thelpUrl?: string;\n\tprompt?: any;\n}"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-parser-preset/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./first-extended']\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-parser-preset/first-extended/index.js",
    "content": "module.exports = {\n\textends: ['./second-extended']\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-parser-preset/first-extended/second-extended/conventional-changelog-custom.js",
    "content": "module.exports = Promise.resolve().then(() => {\n\treturn {\n\t\tparserOpts: {\n\t\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/\n\t\t}\n\t};\n});\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-parser-preset/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\tparserPreset: './conventional-changelog-custom'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-parser-preset-conventional-atom/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./first-extended']\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-parser-preset-conventional-atom/first-extended/index.js",
    "content": "module.exports = {\n\textends: ['./second-extended']\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-parser-preset-conventional-atom/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\tparserPreset: 'conventional-changelog-atom'\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/recursive-parser-preset-conventional-atom/first-extended/second-extended/package.json",
    "content": "{\n  \"name\": \"@second-extend/recursive-parser-preset-conventional-atom\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"conventional-changelog-atom\": \"^5.0.0\"\n  }\n}\n"
  },
  {
    "path": "@commitlint/load/fixtures/specify-config-file/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\tfoo: [1, 'never', 'hello'],\n\t\tbar: [1, 'never', 'world'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/specify-config-file/config/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\tfoo: [1, 'always', 'bar'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/trash-extend/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./one'],\n\tzero: '0',\n\trules: {\n\t\tzero: [0, 'always', 'zero'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/trash-extend/one.js",
    "content": "module.exports = {\n\tone: 1,\n\trules: {\n\t\tone: [1, 'always', 'one'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/fixtures/trash-file/commitlint.config.js",
    "content": "module.exports = {\n\tfoo: 'bar',\n\tbaz: 'bar',\n\trules: {\n\t\tfoo: [1, 'always', 'bar'],\n\t\tbaz: [1, 'always', 'bar'],\n\t},\n};\n"
  },
  {
    "path": "@commitlint/load/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/load/package.json",
    "content": "{\n  \"name\": \"@commitlint/load\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Load shared commitlint configuration\",\n  \"main\": \"lib/load.js\",\n  \"types\": \"lib/load.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-import\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/load\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@types/lodash.mergewith\": \"^4.6.8\",\n    \"@types/node\": \"^18.19.17\",\n    \"conventional-changelog-atom\": \"^5.0.0\",\n    \"typescript\": \"^5.2.2\"\n  },\n  \"dependencies\": {\n    \"@commitlint/config-validator\": \"^20.5.0\",\n    \"@commitlint/execute-rule\": \"^20.0.0\",\n    \"@commitlint/resolve-extends\": \"^20.5.0\",\n    \"@commitlint/types\": \"^20.5.0\",\n    \"cosmiconfig\": \"^9.0.1\",\n    \"cosmiconfig-typescript-loader\": \"^6.1.0\",\n    \"is-plain-obj\": \"^4.1.0\",\n    \"lodash.mergewith\": \"^4.6.2\",\n    \"picocolors\": \"^1.1.1\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/load/src/load.test.ts",
    "content": "import { describe, test, expect, vi } from \"vitest\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { RuleConfigSeverity } from \"@commitlint/types\";\nimport { fix, git, npm } from \"@commitlint/test\";\n\nimport load, { resolveFrom } from \"./load.js\";\nimport { isDynamicAwaitSupported } from \"./utils/load-config.js\";\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\nconst plugin = vi.fn();\nconst scopedPlugin = vi.fn();\n\nvi.mock(\"commitlint-plugin-example\", () => ({\n\tdefault: plugin,\n}));\nvi.mock(\"@scope/commitlint-plugin-example\", () => ({\n\tdefault: scopedPlugin,\n}));\n\nconst fixBootstrap = (name: string) => fix.bootstrap(name, __dirname);\nconst gitBootstrap = (name: string) => git.bootstrap(name, __dirname);\nconst npmBootstrap = (name: string) => npm.bootstrap(name, __dirname);\n\ntest(\"extends-empty should have no rules\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/extends-empty\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.rules).toMatchObject({});\n\texpect(actual.parserPreset).not.toBeDefined();\n});\n\ntest(\"uses seed as configured\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/extends-empty\");\n\tconst rules = {\n\t\t\"body-case\": [RuleConfigSeverity.Warning, \"never\", \"camel-case\"] as any,\n\t};\n\n\tconst actual = await load({ rules }, { cwd });\n\n\texpect(actual.rules[\"body-case\"]).toStrictEqual([\n\t\tRuleConfigSeverity.Warning,\n\t\t\"never\",\n\t\t\"camel-case\",\n\t]);\n});\n\ntest(\"rules should be loaded from local\", async () => {\n\tconst actual = await load({\n\t\trules: {\n\t\t\tdirect: [RuleConfigSeverity.Warning, \"never\", \"foo\"],\n\t\t\tfunc: () => [RuleConfigSeverity.Warning, \"never\", \"foo\"],\n\t\t\tasync: async () => [RuleConfigSeverity.Warning, \"never\", \"foo\"],\n\t\t\tpromise: () =>\n\t\t\t\tPromise.resolve([RuleConfigSeverity.Warning, \"never\", \"foo\"]),\n\t\t},\n\t});\n\n\texpect(actual.rules[\"direct\"]).toStrictEqual([\n\t\tRuleConfigSeverity.Warning,\n\t\t\"never\",\n\t\t\"foo\",\n\t]);\n\texpect(actual.rules[\"func\"]).toStrictEqual([\n\t\tRuleConfigSeverity.Warning,\n\t\t\"never\",\n\t\t\"foo\",\n\t]);\n\texpect(actual.rules[\"async\"]).toStrictEqual([\n\t\tRuleConfigSeverity.Warning,\n\t\t\"never\",\n\t\t\"foo\",\n\t]);\n\texpect(actual.rules[\"promise\"]).toStrictEqual([\n\t\tRuleConfigSeverity.Warning,\n\t\t\"never\",\n\t\t\"foo\",\n\t]);\n});\n\ntest(\"rules should be loaded from relative config file\", async () => {\n\tconst file = \"config/commitlint.config.js\";\n\tconst cwd = await gitBootstrap(\"fixtures/specify-config-file\");\n\tconst rules = {\n\t\t\"body-case\": [RuleConfigSeverity.Warning, \"never\", \"camel-case\"] as any,\n\t};\n\n\tconst actual = await load({ rules }, { cwd, file });\n\n\texpect(actual.rules[\"body-case\"]).toStrictEqual([\n\t\tRuleConfigSeverity.Warning,\n\t\t\"never\",\n\t\t\"camel-case\",\n\t]);\n});\n\ntest(\"rules should be loaded from absolute config file\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/specify-config-file\");\n\tconst file = path.resolve(cwd, \"config/commitlint.config.js\");\n\tconst rules = {\n\t\t\"body-case\": [RuleConfigSeverity.Warning, \"never\", \"camel-case\"] as any,\n\t};\n\n\tconst actual = await load({ rules }, { cwd: process.cwd(), file });\n\n\texpect(actual.rules[\"body-case\"]).toStrictEqual([\n\t\tRuleConfigSeverity.Warning,\n\t\t\"never\",\n\t\t\"camel-case\",\n\t]);\n});\n\ntest(\"plugins should be loaded from seed\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/extends-empty\");\n\tconst actual = await load(\n\t\t{ plugins: [\"example\", \"@scope/example\"] },\n\t\t{ cwd },\n\t);\n\n\texpect(actual.plugins).toMatchObject({\n\t\texample: plugin,\n\t\t\"@scope/example\": scopedPlugin,\n\t});\n});\n\ntest(\"plugins should be loaded from local\", async () => {\n\tconst actual = await load({\n\t\tplugins: [\n\t\t\t{\n\t\t\t\trules: {\n\t\t\t\t\ttest: () => [true, \"asd\"],\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t});\n\n\texpect(actual.plugins).toEqual(\n\t\texpect.objectContaining({\n\t\t\tlocal: {\n\t\t\t\trules: {\n\t\t\t\t\ttest: expect.any(Function),\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t);\n});\n\ntest(\"plugins should be loaded from config\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/extends-plugins\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.plugins).toMatchObject({\n\t\texample: plugin,\n\t\t\"@scope/example\": scopedPlugin,\n\t});\n});\n\ntest(\"plugins should be loaded from shareable config\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/extends-with-plugins\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.plugins).toMatchObject({\n\t\texample: plugin,\n\t\t\"@scope/example\": scopedPlugin,\n\t});\n});\n\ntest(\"local plugins should be loaded from shareable configs\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/extends-with-local-plugins\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.plugins).toEqual(\n\t\texpect.objectContaining({\n\t\t\tlocal: {\n\t\t\t\trules: {\n\t\t\t\t\t\"hello-world-rule\": expect.any(Function),\n\t\t\t\t\t\"is-positive\": expect.any(Function),\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t);\n});\n\ntest(\"uses seed with parserPreset\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/parser-preset\");\n\tconst { parserPreset: actual } = await load(\n\t\t{ parserPreset: \"./conventional-changelog-custom\" },\n\t\t{ cwd },\n\t);\n\n\texpect(actual).toBeDefined();\n\texpect(actual!.name).toBe(\"./conventional-changelog-custom\");\n\texpect(actual!.parserOpts).toMatchObject({\n\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/,\n\t});\n});\n\ntest(\"invalid extend should throw\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/extends-invalid\");\n\n\tawait expect(load({}, { cwd })).rejects.toThrow();\n});\n\ntest(\"empty file should have no rules\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/empty-object-file\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.rules).toMatchObject({});\n});\n\ntest(\"empty file should extend nothing\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/empty-file\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.extends).toHaveLength(0);\n});\n\ntest(\"respects cwd option\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/recursive-extends/first-extended\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual).toMatchObject({\n\t\tformatter: \"@commitlint/format\",\n\t\textends: [\"./second-extended\"],\n\t\tplugins: {},\n\t\trules: {\n\t\t\tone: [RuleConfigSeverity.Warning, \"always\"],\n\t\t\ttwo: [RuleConfigSeverity.Error, \"never\"],\n\t\t},\n\t});\n});\n\ndescribe.each([[\"basic\"], [\"extends\"]])(\"%s config\", (template) => {\n\tconst isExtendsTemplate = template === \"extends\";\n\n\tconst configFiles = [\n\t\t\"commitlint.config.cjs\",\n\t\t\"commitlint.config.js\",\n\t\t\"commitlint.config.mjs\",\n\t\t\"commitlint.config.mts\",\n\t\t\"commitlint.config.cts\",\n\t\t\"package.json\",\n\t\t\"package.yaml\",\n\t\t\".commitlintrc\",\n\t\t\".commitlintrc.cjs\",\n\t\t\".commitlintrc.js\",\n\t\t\".commitlintrc.json\",\n\t\t\".commitlintrc.mjs\",\n\t\t\".commitlintrc.mts\",\n\t\t\".commitlintrc.cts\",\n\t\t\".commitlintrc.yml\",\n\t\t\".commitlintrc.yaml\",\n\t];\n\n\tconst configTestCases = [\n\t\t...configFiles\n\t\t\t.filter(\n\t\t\t\t(filename) => !filename.endsWith(\".mjs\") && !filename.endsWith(\".mts\"),\n\t\t\t)\n\t\t\t.map((filename) => ({ filename, isEsm: false })),\n\t\t...configFiles\n\t\t\t.filter((filename) =>\n\t\t\t\t[\".mjs\", \".js\", \".mts\"].some((ext) => filename.endsWith(ext)),\n\t\t\t)\n\t\t\t.map((filename) => ({ filename, isEsm: true })),\n\t];\n\n\tconst getConfigContents = ({\n\t\tfilename,\n\t\tisEsm,\n\t}: {\n\t\tfilename: string;\n\t\tisEsm: boolean;\n\t}): string | NodeJS.ArrayBufferView => {\n\t\tif (filename === \"package.json\") {\n\t\t\tconst configPath = path.join(\n\t\t\t\t__dirname,\n\t\t\t\t`../fixtures/${template}-config/.commitlintrc.json`,\n\t\t\t);\n\t\t\tconst commitlint = JSON.parse(\n\t\t\t\treadFileSync(configPath, { encoding: \"utf-8\" }),\n\t\t\t);\n\t\t\treturn JSON.stringify({ commitlint });\n\t\t} else if (filename === \"package.yaml\") {\n\t\t\tconst configPath = path.join(\n\t\t\t\t__dirname,\n\t\t\t\t`../fixtures/${template}-config/.commitlintrc.yaml`,\n\t\t\t);\n\t\t\tconst yaml = readFileSync(configPath, { encoding: \"utf-8\" });\n\t\t\treturn `commitlint:\\n${yaml.replace(/^/gm, \"  \")}`;\n\t\t} else {\n\t\t\tconst filePath = [\"..\", \"fixtures\", `${template}-config`, filename];\n\n\t\t\tif (isEsm) {\n\t\t\t\tfilePath.splice(3, 0, \"esm\");\n\t\t\t}\n\n\t\t\tconst configPath = path.join(__dirname, filePath.join(\"/\"));\n\t\t\treturn readFileSync(configPath);\n\t\t}\n\t};\n\n\tconst esmBootstrap = (cwd: string) => {\n\t\tconst packageJsonPath = path.join(cwd, \"package.json\");\n\t\tconst packageJSON = JSON.parse(\n\t\t\treadFileSync(packageJsonPath, { encoding: \"utf-8\" }),\n\t\t);\n\n\t\twriteFileSync(\n\t\t\tpackageJsonPath,\n\t\t\tJSON.stringify({\n\t\t\t\t...packageJSON,\n\t\t\t\ttype: \"module\",\n\t\t\t}),\n\t\t);\n\t};\n\n\tconst templateFolder = [template, isExtendsTemplate ? \"js\" : \"\", \"template\"]\n\t\t.filter((elem) => elem)\n\t\t.join(\"-\");\n\n\ttest.each(\n\t\tconfigTestCases\n\t\t\t// Skip ESM tests for the extends suite until resolve-extends supports ESM\n\t\t\t.filter(({ isEsm }) => template !== \"extends\" || !isEsm)\n\t\t\t// Skip ESM tests if dynamic await is not supported; Jest will crash with a seg fault error\n\t\t\t.filter(({ isEsm }) => isDynamicAwaitSupported() || !isEsm),\n\t)(\"$filename, ESM: $isEsm\", async ({ filename, isEsm }) => {\n\t\tconst cwd = await gitBootstrap(`fixtures/${templateFolder}`);\n\n\t\tif (isEsm) {\n\t\t\tesmBootstrap(cwd);\n\t\t}\n\n\t\twriteFileSync(\n\t\t\tpath.join(cwd, filename),\n\t\t\tgetConfigContents({ filename, isEsm }),\n\t\t);\n\n\t\tconst actual = await load({}, { cwd });\n\n\t\texpect(actual).toMatchObject({\n\t\t\tformatter: \"@commitlint/format\",\n\t\t\textends: isExtendsTemplate ? [\"./first-extended\"] : [],\n\t\t\tplugins: {},\n\t\t\trules: {\n\t\t\t\tzero: [RuleConfigSeverity.Disabled, \"never\"],\n\t\t\t\tone: [RuleConfigSeverity.Warning, \"always\"],\n\t\t\t\ttwo: [RuleConfigSeverity.Error, \"never\"],\n\t\t\t},\n\t\t});\n\t});\n});\n\ntest(\"recursive extends with ts file\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/recursive-extends-ts\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual).toMatchObject({\n\t\tformatter: \"@commitlint/format\",\n\t\textends: [\"./first-extended/index.ts\"],\n\t\tplugins: {},\n\t\trules: {\n\t\t\tzero: [RuleConfigSeverity.Disabled, \"never\", \"zero\"],\n\t\t\tone: [RuleConfigSeverity.Warning, \"never\", \"one\"],\n\t\t\ttwo: [RuleConfigSeverity.Error, \"never\", \"two\"],\n\t\t},\n\t});\n});\n\ntest(\"parser preset overwrites completely instead of merging\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/parser-preset-override\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.parserPreset).toBeDefined();\n\texpect(actual.parserPreset!.name).toBe(\"./custom\");\n\texpect(actual.parserPreset!.parserOpts).toMatchObject({\n\t\theaderPattern: /.*/,\n\t});\n});\n\n// https://github.com/conventional-changelog/commitlint/issues/4640\ntest(\"partial user parserPreset merges with extended string parserPreset\", async () => {\n\tconst cwd = await gitBootstrap(\n\t\t\"fixtures/parser-preset-partial-user-override\",\n\t);\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.parserPreset).toBeDefined();\n\texpect(actual.parserPreset!.parserOpts).toMatchObject({\n\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?!?: (.*)$/,\n\t\theaderCorrespondence: [\"type\", \"scope\", \"subject\"],\n\t\tissuePrefixes: [\"PROJ-\"],\n\t});\n});\n\ntest(\"recursive extends with parserPreset\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/recursive-parser-preset\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.parserPreset).toBeDefined();\n\texpect(actual.parserPreset!.name).toBe(\"./conventional-changelog-custom\");\n\texpect(actual.parserPreset!.parserOpts).toMatchObject({\n\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/,\n\t});\n});\n\ntest(\"ignores unknown keys\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/trash-file\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual).toMatchObject({\n\t\tformatter: \"@commitlint/format\",\n\t\textends: [],\n\t\tplugins: {},\n\t\trules: {\n\t\t\tfoo: [RuleConfigSeverity.Warning, \"always\", \"bar\"],\n\t\t\tbaz: [RuleConfigSeverity.Warning, \"always\", \"bar\"],\n\t\t},\n\t});\n});\n\ntest(\"ignores unknown keys recursively\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/trash-extend\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual).toMatchObject({\n\t\tformatter: \"@commitlint/format\",\n\t\textends: [\"./one\"],\n\t\tplugins: {},\n\t\trules: {\n\t\t\tzero: [RuleConfigSeverity.Disabled, \"always\", \"zero\"],\n\t\t\tone: [RuleConfigSeverity.Warning, \"always\", \"one\"],\n\t\t},\n\t});\n});\n\ntest(\"find up from given cwd\", async () => {\n\tconst outer = await fixBootstrap(\"fixtures/outer-scope\");\n\tawait git.init(path.join(outer, \"inner-scope\"));\n\tconst cwd = path.join(outer, \"inner-scope\", \"child-scope\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual).toMatchObject({\n\t\tformatter: \"@commitlint/format\",\n\t\textends: [],\n\t\tplugins: {},\n\t\trules: {\n\t\t\tchild: [RuleConfigSeverity.Error, \"always\", true],\n\t\t\tinner: [RuleConfigSeverity.Error, \"always\", false],\n\t\t\touter: [RuleConfigSeverity.Error, \"always\", false],\n\t\t},\n\t});\n});\n\ntest(\"find up config from outside current git repo\", async () => {\n\tconst outer = await fixBootstrap(\"fixtures/outer-scope\");\n\tconst cwd = await git.init(path.join(outer, \"inner-scope\"));\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual).toMatchObject({\n\t\tformatter: \"@commitlint/format\",\n\t\textends: [],\n\t\tplugins: {},\n\t\trules: {\n\t\t\tchild: [RuleConfigSeverity.Warning, \"never\", false],\n\t\t\tinner: [RuleConfigSeverity.Warning, \"never\", false],\n\t\t\touter: [RuleConfigSeverity.Warning, \"never\", true],\n\t\t},\n\t});\n});\n\ntest(\"respects formatter option\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/formatter\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual).toMatchObject({\n\t\tformatter: \"commitlint-junit\",\n\t\textends: [],\n\t\tplugins: {},\n\t\trules: {},\n\t});\n});\n\ntest(\"resolves formatter relative from config directory\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/formatter-local-module\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual).toMatchObject({\n\t\tformatter: resolveFrom(\"./formatters/custom.js\", cwd),\n\t\textends: [],\n\t\tplugins: {},\n\t\trules: {},\n\t});\n});\n\ntest(\"returns formatter name when unable to resolve from config directory\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/formatter-local-module\");\n\tconst actual = await load({ formatter: \"./doesnt/exists.js\" }, { cwd });\n\n\texpect(actual).toMatchObject({\n\t\tformatter: \"./doesnt/exists.js\",\n\t\textends: [],\n\t\tplugins: {},\n\t\trules: {},\n\t});\n});\n\ntest(\"does not mutate config module reference\", async () => {\n\tconst file = \"config/commitlint.config.js\";\n\tconst cwd = await gitBootstrap(\"fixtures/specify-config-file\");\n\tconst rules = {\n\t\t\"body-case\": [RuleConfigSeverity.Warning, \"never\", \"camel-case\"] as any,\n\t};\n\n\tconst configPath = path.join(cwd, file);\n\n\tconst before = readFileSync(configPath, { encoding: \"utf-8\" });\n\tawait load({ rules }, { cwd, file });\n\tconst after = readFileSync(configPath, { encoding: \"utf-8\" });\n\n\texpect(after).toBe(before);\n});\n\ntest(\"resolves parser preset from conventional commits\", async () => {\n\tconst cwd = await npmBootstrap(\"fixtures/parser-preset-conventionalcommits\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.parserPreset).toBeDefined();\n\texpect(actual.parserPreset!.name).toBe(\n\t\t\"conventional-changelog-conventionalcommits\",\n\t);\n\texpect(typeof actual.parserPreset!.parserOpts).toBe(\"object\");\n\texpect((actual.parserPreset!.parserOpts as any).headerPattern).toEqual(\n\t\t/^(\\w*)(?:\\((.*)\\))?!?: (.*)$/,\n\t);\n});\n\ntest(\"resolves parser preset from conventional angular\", async () => {\n\tconst cwd = await npmBootstrap(\"fixtures/parser-preset-angular\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.parserPreset).toBeDefined();\n\texpect(actual.parserPreset!.name).toBe(\"conventional-changelog-angular\");\n\texpect(typeof actual.parserPreset!.parserOpts).toBe(\"object\");\n\texpect((actual.parserPreset!.parserOpts as any).headerPattern).toEqual(\n\t\t/^(\\w*)(?:\\((.*)\\))?: (.*)$/,\n\t);\n});\n\ntest(\"recursive resolves parser preset from conventional atom\", async () => {\n\tconst cwd = await gitBootstrap(\n\t\t\"fixtures/recursive-parser-preset-conventional-atom\",\n\t);\n\tawait npm.installModules(\n\t\tpath.resolve(cwd, \"first-extended\", \"second-extended\"),\n\t);\n\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.parserPreset).toBeDefined();\n\texpect(actual.parserPreset!.name).toBe(\"conventional-changelog-atom\");\n\texpect(typeof actual.parserPreset!.parserOpts).toBe(\"object\");\n\texpect((actual.parserPreset!.parserOpts as any).headerPattern).toEqual(\n\t\t/^(:.*?:) (.*)$/,\n\t);\n});\n\ntest(\"resolves parser preset from conventional commits without factory support\", async () => {\n\tconst cwd = await npmBootstrap(\n\t\t\"fixtures/parser-preset-conventional-without-factory\",\n\t);\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.parserPreset).toBeDefined();\n\texpect(actual.parserPreset!.name).toBe(\n\t\t\"conventional-changelog-conventionalcommits\",\n\t);\n\texpect(typeof actual.parserPreset!.parserOpts).toBe(\"object\");\n\texpect((actual.parserPreset!.parserOpts as any).headerPattern).toEqual(\n\t\t/^(\\w*)(?:\\((.*)\\))?!?: (.*)$/,\n\t);\n});\n\ntest(\"helpUrl should be loaded from the shareable config\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/help-url\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.helpUrl).toStrictEqual(\n\t\t\"https://github.com/conventional-changelog/commitlint\",\n\t);\n});\n\ntest(\"default helpUrl should be loaded if not provided in shareable configs\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/basic\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.helpUrl).toStrictEqual(\n\t\t\"https://github.com/conventional-changelog/commitlint/#what-is-commitlint\",\n\t);\n});\n\ntest(\"should resolve config exported as a Promise\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/async-config-promise\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.rules[\"body-case\"]).toStrictEqual([\n\t\tRuleConfigSeverity.Error,\n\t\t\"never\",\n\t\t\"upper-case\",\n\t]);\n});\n\ntest(\"should resolve config exported as an async function\", async () => {\n\tconst cwd = await gitBootstrap(\"fixtures/async-config-function\");\n\tconst actual = await load({}, { cwd });\n\n\texpect(actual.rules[\"body-case\"]).toStrictEqual([\n\t\tRuleConfigSeverity.Error,\n\t\t\"never\",\n\t\t\"upper-case\",\n\t]);\n});\n"
  },
  {
    "path": "@commitlint/load/src/load.ts",
    "content": "import path from \"node:path\";\n\nimport { validateConfig } from \"@commitlint/config-validator\";\nimport executeRule from \"@commitlint/execute-rule\";\nimport resolveExtends, {\n\tresolveFrom,\n\tresolveFromSilent,\n\tresolveGlobalSilent,\n\tloadParserPreset,\n} from \"@commitlint/resolve-extends\";\nimport {\n\tLoadOptions,\n\tPluginRecords,\n\tQualifiedConfig,\n\tQualifiedRules,\n\tUserConfig,\n} from \"@commitlint/types\";\nimport isPlainObject from \"is-plain-obj\";\nimport mergeWith from \"lodash.mergewith\";\n\nimport { loadConfig } from \"./utils/load-config.js\";\nimport { loadParserOpts } from \"./utils/load-parser-opts.js\";\nimport loadPlugin from \"./utils/load-plugin.js\";\n\n/**\n * formatter should be kept as is when unable to resolve it from config directory\n */\nconst resolveFormatter = (formatter: string, parent?: string): string => {\n\ttry {\n\t\treturn resolveFrom(formatter, parent);\n\t} catch (error) {\n\t\treturn formatter;\n\t}\n};\n\nexport default async function load(\n\tseed: UserConfig = {},\n\toptions: LoadOptions = {},\n): Promise<QualifiedConfig> {\n\tconst cwd = typeof options.cwd === \"undefined\" ? process.cwd() : options.cwd;\n\tconst loaded = await loadConfig(cwd, options.file);\n\tconst baseDirectory = loaded?.filepath ? path.dirname(loaded.filepath) : cwd;\n\tconst configFilePath = loaded?.filepath;\n\tlet config: UserConfig = {};\n\tif (loaded) {\n\t\tconst resolvedConfig =\n\t\t\ttypeof loaded.config === \"function\"\n\t\t\t\t? await loaded.config()\n\t\t\t\t: await loaded.config;\n\t\tvalidateConfig(loaded.filepath || \"\", resolvedConfig);\n\t\tconfig = resolvedConfig;\n\t}\n\n\t// Merge passed config with file based options\n\tconfig = mergeWith(\n\t\t{\n\t\t\textends: [],\n\t\t\tplugins: [],\n\t\t\trules: {},\n\t\t},\n\t\tconfig,\n\t\tseed,\n\t);\n\n\t// Resolve parserPreset key\n\tif (typeof config.parserPreset === \"string\") {\n\t\tconst resolvedParserPreset = resolveFrom(\n\t\t\tconfig.parserPreset,\n\t\t\tconfigFilePath,\n\t\t);\n\n\t\tconfig.parserPreset = {\n\t\t\tname: config.parserPreset,\n\t\t\t...(await loadParserPreset(resolvedParserPreset)),\n\t\t};\n\t}\n\n\t// Resolve extends key\n\tconst extended = await resolveExtends(config, {\n\t\tprefix: \"commitlint-config\",\n\t\tcwd: baseDirectory,\n\t\tparserPreset: await config.parserPreset,\n\t});\n\n\tif (!extended.formatter || typeof extended.formatter !== \"string\") {\n\t\textended.formatter = \"@commitlint/format\";\n\t}\n\n\tlet plugins: PluginRecords = {};\n\tif (Array.isArray(extended.plugins)) {\n\t\tconst deduplicatedPlugins = [...new Set(extended.plugins)];\n\t\tfor (const plugin of deduplicatedPlugins) {\n\t\t\tif (typeof plugin === \"string\") {\n\t\t\t\tplugins = await loadPlugin(plugins, plugin, {\n\t\t\t\t\tdebug: process.env.DEBUG === \"true\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tplugins.local = plugin;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst rules = (\n\t\tawait Promise.all(\n\t\t\tObject.entries(extended.rules || {}).map((entry) => executeRule(entry)),\n\t\t)\n\t).reduce<QualifiedRules>((registry, item) => {\n\t\t// type of `item` can be null, but Object.entries always returns key pair\n\t\tconst [key, value] = item!;\n\t\tregistry[key] = value;\n\t\treturn registry;\n\t}, {});\n\n\tconst helpUrl =\n\t\ttypeof extended.helpUrl === \"string\"\n\t\t\t? extended.helpUrl\n\t\t\t: typeof config.helpUrl === \"string\"\n\t\t\t\t? config.helpUrl\n\t\t\t\t: \"https://github.com/conventional-changelog/commitlint/#what-is-commitlint\";\n\n\tconst prompt =\n\t\textended.prompt && isPlainObject(extended.prompt) ? extended.prompt : {};\n\n\treturn {\n\t\textends: Array.isArray(extended.extends)\n\t\t\t? extended.extends\n\t\t\t: typeof extended.extends === \"string\"\n\t\t\t\t? [extended.extends]\n\t\t\t\t: [],\n\t\t// Resolve config-relative formatter module\n\t\tformatter: resolveFormatter(extended.formatter, configFilePath),\n\t\t// Resolve parser-opts from preset\n\t\tparserPreset: await loadParserOpts(extended.parserPreset),\n\t\tignores: extended.ignores,\n\t\tdefaultIgnores: extended.defaultIgnores,\n\t\tplugins: plugins,\n\t\trules: rules,\n\t\thelpUrl: helpUrl,\n\t\tprompt,\n\t};\n}\n\nexport { resolveFrom, resolveFromSilent, resolveGlobalSilent };\n"
  },
  {
    "path": "@commitlint/load/src/utils/load-config.ts",
    "content": "import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport {\n\tcosmiconfig,\n\tdefaultLoadersSync,\n\ttype Loader,\n\tdefaultLoaders,\n} from \"cosmiconfig\";\nimport { TypeScriptLoader } from \"cosmiconfig-typescript-loader\";\n\nexport interface LoadConfigResult {\n\tconfig: unknown;\n\tfilepath: string;\n\tisEmpty?: boolean;\n}\n\nconst moduleName = \"commitlint\";\nconst searchStrategy = \"global\";\n\nexport async function loadConfig(\n\tcwd: string,\n\tconfigPath?: string,\n): Promise<LoadConfigResult | null> {\n\tlet tsLoaderInstance: Loader | undefined;\n\tconst tsLoader: Loader = (...args) => {\n\t\tif (!tsLoaderInstance) {\n\t\t\ttsLoaderInstance = TypeScriptLoader();\n\t\t}\n\t\treturn tsLoaderInstance(...args);\n\t};\n\n\t// If dynamic await is supported (Node >= v20.8.0) or directory uses ESM, support\n\t// async js/cjs loaders (dynamic import). Otherwise, use synchronous js/cjs loaders.\n\tconst loaders =\n\t\tisDynamicAwaitSupported() || isEsmModule(cwd)\n\t\t\t? defaultLoaders\n\t\t\t: defaultLoadersSync;\n\n\tconst explorer = cosmiconfig(moduleName, {\n\t\tsearchStrategy,\n\t\tsearchPlaces: [\n\t\t\t// cosmiconfig overrides default searchPlaces if any new search place is added (For e.g. `*.ts` files),\n\t\t\t// we need to manually merge default searchPlaces from https://github.com/davidtheclark/cosmiconfig#searchplaces\n\t\t\t\"package.json\",\n\t\t\t\"package.yaml\",\n\t\t\t`.${moduleName}rc`,\n\t\t\t`.${moduleName}rc.json`,\n\t\t\t`.${moduleName}rc.yaml`,\n\t\t\t`.${moduleName}rc.yml`,\n\t\t\t`.${moduleName}rc.js`,\n\t\t\t`.${moduleName}rc.cjs`,\n\t\t\t`.${moduleName}rc.mjs`,\n\t\t\t`${moduleName}.config.js`,\n\t\t\t`${moduleName}.config.cjs`,\n\t\t\t`${moduleName}.config.mjs`,\n\n\t\t\t// files supported by TypescriptLoader\n\t\t\t`.${moduleName}rc.ts`,\n\t\t\t`.${moduleName}rc.cts`,\n\t\t\t`.${moduleName}rc.mts`,\n\t\t\t`${moduleName}.config.ts`,\n\t\t\t`${moduleName}.config.cts`,\n\t\t\t`${moduleName}.config.mts`,\n\t\t],\n\t\tloaders: {\n\t\t\t\".ts\": tsLoader,\n\t\t\t\".cts\": tsLoader,\n\t\t\t\".mts\": tsLoader,\n\t\t\t\".cjs\": loaders[\".cjs\"],\n\t\t\t\".js\": loaders[\".js\"],\n\t\t},\n\t});\n\n\tconst explicitPath = configPath ? path.resolve(cwd, configPath) : undefined;\n\tconst explore = explicitPath ? explorer.load : explorer.search;\n\tconst searchPath = explicitPath ? explicitPath : cwd;\n\tconst local = await explore(searchPath);\n\n\tif (local) {\n\t\treturn local;\n\t}\n\n\treturn null;\n}\n\n// See the following issues for more context, contributing to failing Jest tests:\n//  - Issue: https://github.com/nodejs/node/issues/40058\n//  - Resolution: https://github.com/nodejs/node/pull/48510 (Node v20.8.0)\nexport const isDynamicAwaitSupported = () => {\n\tconst [major, minor] = process.version\n\t\t.replace(\"v\", \"\")\n\t\t.split(\".\")\n\t\t.map((val) => parseInt(val));\n\n\treturn major >= 20 && minor >= 8;\n};\n\n// Is the given directory set up to use ESM (ECMAScript Modules)?\nexport const isEsmModule = (cwd: string) => {\n\tconst packagePath = path.join(cwd, \"package.json\");\n\n\tif (!existsSync(packagePath)) {\n\t\treturn false;\n\t}\n\n\tconst packageJSON = readFileSync(packagePath, { encoding: \"utf-8\" });\n\treturn JSON.parse(packageJSON)?.type === \"module\";\n};\n"
  },
  {
    "path": "@commitlint/load/src/utils/load-parser-opts.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport { loadParserOpts } from \"./load-parser-opts.js\";\n\ntest(\"handles a plain preset\", async () => {\n\tconst preset = {\n\t\tparserOpts: {},\n\t};\n\n\texpect(await loadParserOpts(preset)).toEqual(preset);\n});\n\ntest(\"handles primitive values\", async () => {\n\texpect(await loadParserOpts(\"\")).toEqual(undefined);\n\texpect(await loadParserOpts(undefined)).toEqual(undefined);\n});\n\ntest(\"handles an object without any parserOpts\", async () => {\n\tconst preset = {};\n\texpect(await loadParserOpts(preset)).toEqual(preset);\n});\n\ntest(\"handles nested parserOpts\", async () => {\n\tconst opts = { a: 4 };\n\n\t// plain nested parserOpts\n\tlet loaded = await loadParserOpts({\n\t\tparserOpts: {\n\t\t\tparserOpts: opts,\n\t\t},\n\t});\n\texpect(loaded).toHaveProperty(\"parserOpts\", opts);\n\n\t// async nested parserOpts\n\tloaded = await loadParserOpts({\n\t\tparserOpts: Promise.resolve({\n\t\t\tparserOpts: opts,\n\t\t}),\n\t});\n\texpect(loaded).toHaveProperty(\"parserOpts\", opts);\n});\n\ntest(\"runs a sync function which returns the preset\", async () => {\n\tconst preset = {};\n\tconst fn = () => preset;\n\tconst opts = await loadParserOpts(fn);\n\n\texpect(opts).toEqual(preset);\n});\n\ntest(\"runs an async function which returns the preset\", async () => {\n\tconst preset = {};\n\tconst fn = async () => preset;\n\tconst opts = await loadParserOpts(fn);\n\n\texpect(opts).toEqual(preset);\n});\n"
  },
  {
    "path": "@commitlint/load/src/utils/load-parser-opts.ts",
    "content": "import { ParserPreset } from \"@commitlint/types\";\n\ntype Awaitable<T> = T | PromiseLike<T>;\n\nfunction isObjectLike(obj: unknown): obj is Record<string, unknown> {\n\treturn Boolean(obj) && typeof obj === \"object\"; // typeof null === 'object'\n}\n\nfunction isParserOptsFunction<T extends ParserPreset>(\n\tobj: T,\n): obj is T & {\n\tparserOpts: (\n\t\tcb: (_: never, parserOpts: Record<string, unknown>) => unknown,\n\t) => Record<string, unknown> | undefined;\n} {\n\treturn typeof obj.parserOpts === \"function\";\n}\n\nexport async function loadParserOpts(\n\tpendingParser:\n\t\t| string\n\t\t| Awaitable<ParserPreset>\n\t\t| (() => Awaitable<ParserPreset>)\n\t\t| undefined,\n): Promise<ParserPreset | undefined> {\n\tif (typeof pendingParser === \"function\") {\n\t\treturn loadParserOpts(pendingParser());\n\t}\n\n\tif (!pendingParser || typeof pendingParser !== \"object\") {\n\t\treturn undefined;\n\t}\n\t// Await for the module, loaded with require\n\tconst parser = await pendingParser;\n\n\t// exit early, no opts to resolve\n\tif (!parser.parserOpts) {\n\t\treturn parser;\n\t}\n\n\t// Pull nested parserOpts, might happen if overwritten with a module in main config\n\tif (typeof parser.parserOpts === \"object\") {\n\t\t// Await parser opts if applicable\n\t\tparser.parserOpts = await parser.parserOpts;\n\t\tif (\n\t\t\tisObjectLike(parser.parserOpts) &&\n\t\t\tisObjectLike(parser.parserOpts.parserOpts)\n\t\t) {\n\t\t\t// Preserve any user-provided properties (e.g. issuePrefixes) that\n\t\t\t// were merged at the outer parserOpts level during config resolution,\n\t\t\t// while unwrapping the inner module-provided parserOpts (#4640).\n\t\t\tconst { parserOpts: inner, ...rest } = parser.parserOpts as Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t> & { parserOpts: Record<string, unknown> };\n\t\t\tparser.parserOpts = { ...inner, ...rest };\n\t\t}\n\t\treturn parser;\n\t}\n\n\t// Create parser opts from factory\n\tif (\n\t\tisParserOptsFunction(parser) &&\n\t\ttypeof parser.name === \"string\" &&\n\t\tparser.name.startsWith(\"conventional-changelog-\")\n\t) {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst result = parser.parserOpts((_: never, opts) => {\n\t\t\t\tresolve({\n\t\t\t\t\t...parser,\n\t\t\t\t\tparserOpts: opts?.parserOpts,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// If result has data or a promise, the parser doesn't support factory-init\n\t\t\t// due to https://github.com/nodejs/promises-debugging/issues/16 it just quits, so let's use this fallback\n\t\t\tif (result) {\n\t\t\t\tPromise.resolve(result).then((opts) => {\n\t\t\t\t\tresolve({\n\t\t\t\t\t\t...parser,\n\t\t\t\t\t\tparserOpts: opts?.parserOpts || opts?.parser,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t});\n\t}\n\n\treturn parser;\n}\n"
  },
  {
    "path": "@commitlint/load/src/utils/load-plugin.test.ts",
    "content": "import { test, expect, vi } from \"vitest\";\nimport { AsyncRule, Plugin, Rule, SyncRule } from \"@commitlint/types\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nimport loadPlugin from \"./load-plugin.js\";\nimport { resolveFromNpxCache } from \"@commitlint/resolve-extends\";\n\nvi.mock(\"@commitlint/resolve-extends\", () => ({\n\tresolveFromNpxCache: vi.fn(() => undefined),\n}));\n\nvi.mock(\"commitlint-plugin-example\", () => ({ example: true }));\n\nvi.mock(\"@scope/commitlint-plugin-example\", () => ({ scope: true }));\n\nvi.mock(\"commitlint-plugin-rule\", (): Plugin => {\n\tconst rule: Rule<number> = (_parsed, when, _value) => {\n\t\treturn [when === \"never\"];\n\t};\n\treturn { rules: { rule } };\n});\n\nvi.mock(\"commitlint-plugin-sync-rule\", (): Plugin => {\n\tconst syncRule: SyncRule<number> = (_parsed, when, _value) => {\n\t\treturn [when === \"never\"];\n\t};\n\treturn { rules: { syncRule } };\n});\n\nvi.mock(\"commitlint-plugin-async-rule\", (): Plugin => {\n\tconst asyncRule: AsyncRule<number> = (_parsed, when, _value) => {\n\t\treturn new Promise(() => [when === \"never\"]);\n\t};\n\treturn { rules: { asyncRule } };\n});\n\ntest(\"should load a plugin when referenced by short name\", async () => {\n\tconst plugins = await loadPlugin({}, \"example\");\n\texpect(plugins[\"example\"]).toBe(\n\t\t// @ts-expect-error -- mocked module\n\t\tawait import(\"commitlint-plugin-example\"),\n\t);\n});\n\ntest(\"should load a plugin when referenced by long name\", async () => {\n\tconst plugins = await loadPlugin({}, \"commitlint-plugin-example\");\n\texpect(plugins[\"example\"]).toBe(\n\t\t// @ts-expect-error -- mocked module\n\t\tawait import(\"commitlint-plugin-example\"),\n\t);\n});\n\ntest(\"should load a plugin with a rule\", async () => {\n\tconst plugins = await loadPlugin({}, \"commitlint-plugin-rule\");\n\texpect(plugins[\"rule\"]).toBe(\n\t\t// @ts-expect-error -- mocked module\n\t\tawait import(\"commitlint-plugin-rule\"),\n\t);\n});\n\ntest(\"should load a plugin with a sync rule\", async () => {\n\tconst plugins = await loadPlugin({}, \"commitlint-plugin-sync-rule\");\n\texpect(plugins[\"sync-rule\"]).toBe(\n\t\t// @ts-expect-error -- mocked module\n\t\tawait import(\"commitlint-plugin-sync-rule\"),\n\t);\n});\n\ntest(\"should load a plugin with an async rule\", async () => {\n\tconst plugins = await loadPlugin({}, \"commitlint-plugin-async-rule\");\n\texpect(plugins[\"async-rule\"]).toBe(\n\t\t// @ts-expect-error -- mocked module\n\t\tawait import(\"commitlint-plugin-async-rule\"),\n\t);\n});\n\ntest(\"should throw an error when a plugin has whitespace\", async () => {\n\tawait expect(() => loadPlugin({}, \"whitespace \")).rejects.toThrow(\n\t\t\"Whitespace found in plugin name 'whitespace '\",\n\t);\n\tawait expect(() => loadPlugin({}, \"whitespace\\t\")).rejects.toThrow(\n\t\t\"Whitespace found in plugin name\",\n\t);\n\tawait expect(() => loadPlugin({}, \"whitespace\\n\")).rejects.toThrow(\n\t\t\"Whitespace found in plugin name\",\n\t);\n\tawait expect(() => loadPlugin({}, \"whitespace\\r\")).rejects.toThrow(\n\t\t\"Whitespace found in plugin name\",\n\t);\n});\n\ntest(\"should throw an error when a plugin doesn't exist\", () =>\n\texpect(() => loadPlugin({}, \"nonexistentplugin\")).rejects.toThrow(\n\t\t\"Failed to load plugin\",\n\t));\n\ntest(\"should load a scoped plugin when referenced by short name\", async () => {\n\tconst plugins = await loadPlugin({}, \"@scope/example\");\n\texpect(plugins[\"@scope/example\"]).toBe(\n\t\t// @ts-expect-error -- mocked module\n\t\tawait import(\"@scope/commitlint-plugin-example\"),\n\t);\n});\n\ntest(\"should load a scoped plugin when referenced by long name\", async () => {\n\tconst plugins = await loadPlugin({}, \"@scope/commitlint-plugin-example\");\n\texpect(plugins[\"@scope/example\"]).toBe(\n\t\t// @ts-expect-error -- mocked module\n\t\tawait import(\"@scope/commitlint-plugin-example\"),\n\t);\n});\n\n/* when referencing a scope plugin and omitting @scope/ */\ntest(\"should load a scoped plugin when referenced by short name, but should not get the plugin if '@scope/' is omitted\", async () => {\n\tconst plugins = await loadPlugin({}, \"@scope/example\");\n\texpect(plugins[\"example\"]).toBeUndefined();\n});\n\ntest(\"should load a scoped plugin when referenced by long name, but should not get the plugin if '@scope/' is omitted\", async () => {\n\tconst plugins = await loadPlugin({}, \"@scope/commitlint-plugin-example\");\n\texpect(plugins[\"example\"]).toBeUndefined();\n});\n\ntest(\"should load plugin from npx cache when available\", async () => {\n\tvi.mocked(resolveFromNpxCache).mockReturnValueOnce(\n\t\tpath.join(\n\t\t\tos.tmpdir(),\n\t\t\t\"npx-cache\",\n\t\t\t\"node_modules\",\n\t\t\t\"commitlint-plugin-example\",\n\t\t),\n\t);\n\n\tvi.mock(\"commitlint-plugin-example\", () => ({ example: true }));\n\n\tconst plugins = await loadPlugin({}, \"example\");\n\texpect(vi.mocked(resolveFromNpxCache)).toHaveBeenCalledWith(\n\t\t\"commitlint-plugin-example\",\n\t);\n\texpect(plugins[\"example\"]).toBeDefined();\n});\n\ntest(\"should accept boolean as third parameter for backward compatibility\", async () => {\n\tconst plugins = await loadPlugin({}, \"example\", true);\n\texpect(plugins[\"example\"]).toBeDefined();\n});\n\ntest(\"should throw when searchPath is not a string\", async () => {\n\tawait expect(\n\t\tloadPlugin({}, \"example\", { searchPaths: [123 as any] }),\n\t).rejects.toThrow('Invalid searchPath \"123\": must be an absolute path');\n});\n\ntest(\"should throw when searchPath is not absolute\", async () => {\n\tawait expect(\n\t\tloadPlugin({}, \"example\", { searchPaths: [\"./relative/path\"] }),\n\t).rejects.toThrow(\n\t\t'Invalid searchPath \"./relative/path\": must be an absolute path',\n\t);\n});\n\ntest(\"should throw when searchPath does not exist\", async () => {\n\tawait expect(\n\t\tloadPlugin({}, \"example\", { searchPaths: [\"/nonexistent/path\"] }),\n\t).rejects.toThrow(\n\t\t'Invalid searchPath \"/nonexistent/path\": directory does not exist',\n\t);\n});\n\ntest(\"should throw when searchPath is a file not a directory\", async () => {\n\tconst tempFile = path.join(os.tmpdir(), \"test-file.txt\");\n\tawait import(\"node:fs/promises\").then((fs) => fs.writeFile(tempFile, \"test\"));\n\n\ttry {\n\t\tawait expect(\n\t\t\tloadPlugin({}, \"example\", { searchPaths: [tempFile] }),\n\t\t).rejects.toThrow(\n\t\t\t`Invalid searchPath \"${tempFile}\": must be a directory, not a file`,\n\t\t);\n\t} finally {\n\t\tawait import(\"node:fs/promises\").then((fs) => fs.unlink(tempFile));\n\t}\n});\n"
  },
  {
    "path": "@commitlint/load/src/utils/load-plugin.ts",
    "content": "import { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport { Plugin, PluginRecords } from \"@commitlint/types\";\nimport pc from \"picocolors\";\n\nimport { normalizePackageName, getShorthandName } from \"./plugin-naming.js\";\nimport { WhitespacePluginError, MissingPluginError } from \"./plugin-errors.js\";\nimport { resolveFromNpxCache } from \"@commitlint/resolve-extends\";\n\nconst require = createRequire(import.meta.url);\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\nconst dynamicImport = async <T>(id: string): Promise<T> => {\n\tconst imported = await import(\n\t\tpath.isAbsolute(id) ? pathToFileURL(id).toString() : id\n\t);\n\treturn (\"default\" in imported && imported.default) || imported;\n};\n\nfunction sanitizeErrorMessage(message: string): string {\n\treturn message\n\t\t.replace(/\\/[^/]+\\/node_modules/g, \"...\")\n\t\t.replace(/\\\\[^\\\\]+\\\\node_modules/g, \"...\");\n}\n\nfunction findPackageJson(dir: string): string | null {\n\tlet current = dir;\n\tconst root = path.parse(dir).root;\n\twhile (current !== root) {\n\t\tconst pkgPath = path.join(current, \"package.json\");\n\t\tif (fs.existsSync(pkgPath)) {\n\t\t\treturn pkgPath;\n\t\t}\n\t\tcurrent = path.dirname(current);\n\t}\n\treturn null;\n}\n\nexport interface LoadPluginOptions {\n\tdebug?: boolean;\n\tsearchPaths?: string[];\n}\n\nfunction normalizeOptions(\n\toptions: LoadPluginOptions | boolean,\n): LoadPluginOptions {\n\tif (typeof options === \"boolean\") {\n\t\treturn { debug: options };\n\t}\n\treturn options;\n}\n\nexport default async function loadPlugin(\n\tplugins: PluginRecords,\n\tpluginName: string,\n\toptions: LoadPluginOptions | boolean = {},\n): Promise<PluginRecords> {\n\tconst normalized = normalizeOptions(options);\n\tconst { debug = false, searchPaths = [] } = normalized;\n\n\tfor (const searchPath of searchPaths) {\n\t\tif (typeof searchPath !== \"string\" || !path.isAbsolute(searchPath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid searchPath \"${searchPath}\": must be an absolute path`,\n\t\t\t);\n\t\t}\n\t\tif (!fs.existsSync(searchPath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid searchPath \"${searchPath}\": directory does not exist`,\n\t\t\t);\n\t\t}\n\t\tif (!fs.statSync(searchPath).isDirectory()) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid searchPath \"${searchPath}\": must be a directory, not a file`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst longName = normalizePackageName(pluginName);\n\tconst shortName = getShorthandName(longName);\n\n\tif (pluginName.match(/\\s+/u)) {\n\t\tthrow new WhitespacePluginError(pluginName, {\n\t\t\tpluginName: longName,\n\t\t});\n\t}\n\n\tconst pluginKey = longName === pluginName ? shortName : pluginName;\n\n\tif (!plugins[pluginKey]) {\n\t\tlet plugin: Plugin | undefined;\n\t\tlet resolvedPath: string | undefined;\n\n\t\t// Try to load from npx cache directories using require.resolve\n\t\tconst npxResolvedPath = resolveFromNpxCache(longName);\n\t\tif (npxResolvedPath) {\n\t\t\ttry {\n\t\t\t\tplugin = await dynamicImport<Plugin>(npxResolvedPath);\n\t\t\t\tresolvedPath = npxResolvedPath;\n\t\t\t} catch (err) {\n\t\t\t\tif (debug) {\n\t\t\t\t\tconsole.debug(\n\t\t\t\t\t\t`Failed to load plugin ${longName} from npx cache: ${(err as Error).message}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Try to load from additional search paths (extended config's node_modules)\n\t\tif (!plugin) {\n\t\t\tfor (const searchPath of searchPaths) {\n\t\t\t\ttry {\n\t\t\t\t\tresolvedPath = require.resolve(longName, { paths: [searchPath] });\n\t\t\t\t\tplugin = await dynamicImport<Plugin>(resolvedPath);\n\t\t\t\t\tbreak;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (debug) {\n\t\t\t\t\t\tconsole.debug(\n\t\t\t\t\t\t\t`Failed to load plugin ${longName} from ${searchPath}: ${(err as Error).message}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Try default resolution as last resort\n\t\tif (!plugin) {\n\t\t\ttry {\n\t\t\t\tplugin = await dynamicImport<Plugin>(longName);\n\t\t\t\t// Try to resolve path for debug logging\n\t\t\t\ttry {\n\t\t\t\t\tresolvedPath = require.resolve(longName);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore - path not critical\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tlet resolutionError: Error | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tresolvedPath = require.resolve(longName);\n\t\t\t\t} catch (resolveErr) {\n\t\t\t\t\tresolutionError = resolveErr as Error;\n\t\t\t\t}\n\n\t\t\t\tif (resolutionError) {\n\t\t\t\t\t// Resolution failed - throw MissingPluginError\n\t\t\t\t\tif (debug) {\n\t\t\t\t\t\tconsole.debug(\n\t\t\t\t\t\t\t`Failed to resolve plugin ${longName}: ${resolutionError.message}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new MissingPluginError(\n\t\t\t\t\t\tpluginName,\n\t\t\t\t\t\tsanitizeErrorMessage(resolutionError.message),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpluginName: longName,\n\t\t\t\t\t\t\tcommitlintPath: path.resolve(__dirname, \"../..\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Resolution succeeded but import failed - rethrow original error\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\t// This step is costly, so skip if debug is disabled\n\t\tif (debug) {\n\t\t\tlet version: string | null = null;\n\n\t\t\tif (resolvedPath) {\n\t\t\t\ttry {\n\t\t\t\t\tconst pkgPath = findPackageJson(path.dirname(resolvedPath));\n\t\t\t\t\tif (pkgPath) {\n\t\t\t\t\t\tversion = require(pkgPath).version;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Do nothing\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst loadedPluginAndVersion = version\n\t\t\t\t? `${longName}@${version}`\n\t\t\t\t: `${longName}, version unknown`;\n\n\t\t\tconst fromPath = resolvedPath ? ` (from ${resolvedPath})` : \"\";\n\t\t\tconsole.log(\n\t\t\t\tpc.blue(\n\t\t\t\t\t`Loaded plugin ${pluginName} (${loadedPluginAndVersion})${fromPath}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (plugin) {\n\t\t\tplugins[pluginKey] = plugin;\n\t\t} else {\n\t\t\tthrow new MissingPluginError(\n\t\t\t\tpluginName,\n\t\t\t\t\"Plugin loaded but is undefined\",\n\t\t\t\t{\n\t\t\t\t\tpluginName: longName,\n\t\t\t\t\tcommitlintPath: path.resolve(__dirname, \"../..\"),\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\treturn plugins;\n}\n"
  },
  {
    "path": "@commitlint/load/src/utils/plugin-errors.ts",
    "content": "export class WhitespacePluginError extends Error {\n\t__proto__ = Error;\n\n\tpublic messageTemplate: string = \"whitespace-found\";\n\tpublic messageData: any = {};\n\n\tconstructor(pluginName?: string, data: any = {}) {\n\t\tsuper(`Whitespace found in plugin name '${pluginName}'`);\n\n\t\tthis.messageData = data;\n\n\t\tObject.setPrototypeOf(this, WhitespacePluginError.prototype);\n\t}\n}\n\nexport class MissingPluginError extends Error {\n\t__proto__ = Error;\n\n\tpublic messageTemplate: string = \"plugin-missing\";\n\tpublic messageData: any;\n\n\tconstructor(pluginName?: string, errorMessage: string = \"\", data: any = {}) {\n\t\tsuper(`Failed to load plugin ${pluginName}: ${errorMessage}`);\n\n\t\tthis.messageData = data;\n\n\t\tObject.setPrototypeOf(this, MissingPluginError.prototype);\n\t}\n}\n"
  },
  {
    "path": "@commitlint/load/src/utils/plugin-naming.ts",
    "content": "import path from \"node:path\";\n\n// largely adapted from eslint's plugin system\nconst NAMESPACE_REGEX = /^@.*\\//u;\n// In eslint this is a parameter - we don't need to support the extra options\nconst prefix = \"commitlint-plugin\";\n\n// Replace Windows with posix style paths\nfunction convertPathToPosix(filepath: string) {\n\tconst normalizedFilepath = path.normalize(filepath);\n\tconst posixFilepath = normalizedFilepath.replace(/\\\\/gu, \"/\");\n\n\treturn posixFilepath;\n}\n\n/**\n * Brings package name to correct format based on prefix\n * @param {string} name The name of the package.\n * @returns {string} Normalized name of the package\n * @private\n */\nexport function normalizePackageName(name: string) {\n\tlet normalizedName = name;\n\n\t/**\n\t * On Windows, name can come in with Windows slashes instead of Unix slashes.\n\t * Normalize to Unix first to avoid errors later on.\n\t * https://github.com/eslint/eslint/issues/5644\n\t */\n\tif (normalizedName.indexOf(\"\\\\\") > -1) {\n\t\tnormalizedName = convertPathToPosix(normalizedName);\n\t}\n\n\tif (normalizedName.charAt(0) === \"@\") {\n\t\t/**\n\t\t * it's a scoped package\n\t\t * package name is the prefix, or just a username\n\t\t */\n\t\tconst scopedPackageShortcutRegex = new RegExp(\n\t\t\t\t`^(@[^/]+)(?:/(?:${prefix})?)?$`,\n\t\t\t\t\"u\",\n\t\t\t),\n\t\t\tscopedPackageNameRegex = new RegExp(`^${prefix}(?:-|$)`, \"u\");\n\n\t\tif (scopedPackageShortcutRegex.test(normalizedName)) {\n\t\t\tnormalizedName = normalizedName.replace(\n\t\t\t\tscopedPackageShortcutRegex,\n\t\t\t\t`$1/${prefix}`,\n\t\t\t);\n\t\t} else if (!scopedPackageNameRegex.test(normalizedName.split(\"/\")[1])) {\n\t\t\t/**\n\t\t\t * for scoped packages, insert the prefix after the first / unless\n\t\t\t * the path is already @scope/eslint or @scope/eslint-xxx-yyy\n\t\t\t */\n\t\t\tnormalizedName = normalizedName.replace(\n\t\t\t\t/^@([^/]+)\\/(.*)$/u,\n\t\t\t\t`@$1/${prefix}-$2`,\n\t\t\t);\n\t\t}\n\t} else if (normalizedName.indexOf(`${prefix}-`) !== 0) {\n\t\tnormalizedName = `${prefix}-${normalizedName}`;\n\t}\n\n\treturn normalizedName;\n}\n\n/**\n * Removes the prefix from a fullname.\n * @param {string} fullname The term which may have the prefix.\n * @returns {string} The term without prefix.\n */\nexport function getShorthandName(fullname: string) {\n\tif (fullname[0] === \"@\") {\n\t\tlet matchResult = new RegExp(`^(@[^/]+)/${prefix}$`, \"u\").exec(fullname);\n\n\t\tif (matchResult) {\n\t\t\treturn matchResult[1];\n\t\t}\n\n\t\tmatchResult = new RegExp(`^(@[^/]+)/${prefix}-(.+)$`, \"u\").exec(fullname);\n\t\tif (matchResult) {\n\t\t\treturn `${matchResult[1]}/${matchResult[2]}`;\n\t\t}\n\t} else if (fullname.startsWith(`${prefix}-`)) {\n\t\treturn fullname.slice(prefix.length + 1);\n\t}\n\n\treturn fullname;\n}\n\n/**\n * Gets the scope (namespace) of a term.\n * @param {string} term The term which may have the namespace.\n * @returns {string} The namepace of the term if it has one.\n */\nexport function getNamespaceFromTerm(term: string) {\n\tconst match = NAMESPACE_REGEX.exec(term);\n\n\treturn match ? match[0] : \"\";\n}\n"
  },
  {
    "path": "@commitlint/load/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [\n    { \"path\": \"../execute-rule\" },\n    { \"path\": \"../resolve-extends\" },\n    { \"path\": \"../config-validator\" },\n    { \"path\": \"../types\" }\n  ]\n}\n"
  },
  {
    "path": "@commitlint/message/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/message\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/message\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/message\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/message\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/message\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/message\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/message\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/message\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/message\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/message\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/message\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/message\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/message\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/message\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/message\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/message\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/message\n"
  },
  {
    "path": "@commitlint/message/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/message/package.json",
    "content": "{\n  \"name\": \"@commitlint/message\",\n  \"type\": \"module\",\n  \"version\": \"20.4.3\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/message\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/message/src/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport message from \"./index.js\";\n\ntest(\"should return an empty string for empty input\", () => {\n\texpect(message()).toBe(\"\");\n});\n\ntest(\"should return an empty string for empty input array\", () => {\n\texpect(message([])).toBe(\"\");\n});\n\ntest(\"should filter falsy values\", () => {\n\texpect(message([null, \"some\", undefined, \"message\", null])).toBe(\n\t\t\"some message\",\n\t);\n});\n"
  },
  {
    "path": "@commitlint/message/src/index.ts",
    "content": "export default function message(input: (string | null | undefined)[] = []) {\n\treturn input.filter(Boolean).join(\" \");\n}\n"
  },
  {
    "path": "@commitlint/message/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@commitlint/parse/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n\n### Bug Fixes\n\n* footer parser does not escape special chars for regex [#4560](https://github.com/conventional-changelog/commitlint/issues/4560) ([#4634](https://github.com/conventional-changelog/commitlint/issues/4634)) ([8ff7c7f](https://github.com/conventional-changelog/commitlint/commit/8ff7c7fcbc2db2b45910ecb5c01e9f1763060770))\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n\n### Features\n\n* upgrade conventional commit packages [#4082](https://github.com/conventional-changelog/commitlint/issues/4082) ([#4597](https://github.com/conventional-changelog/commitlint/issues/4597)) ([3aaf0a6](https://github.com/conventional-changelog/commitlint/commit/3aaf0a603c4047d268d85207957c919f45b60e1f))\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n\n### Bug Fixes\n\n* mark `@types/conventional-commits-parser` as dep for `@commitlint/types` ([#3944](https://github.com/conventional-changelog/commitlint/issues/3944)) ([5a01f59](https://github.com/conventional-changelog/commitlint/commit/5a01f59661f0b908802728389631965eb8b49d47)), closes [#3929](https://github.com/conventional-changelog/commitlint/issues/3929) [#3942](https://github.com/conventional-changelog/commitlint/issues/3942)\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n\n### Bug Fixes\n\n* add named export to @commitlint/parse ([#3614](https://github.com/conventional-changelog/commitlint/issues/3614)) ([2cd236b](https://github.com/conventional-changelog/commitlint/commit/2cd236b3065c69303c56833d120eb04c6fefc2c3))\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n\n### Bug Fixes\n\n* **parse:** allow setting fieldPattern in parserOpts ([#3538](https://github.com/conventional-changelog/commitlint/issues/3538)) ([ea23c65](https://github.com/conventional-changelog/commitlint/commit/ea23c65702d619b92e338e9f589a147d62e48ffc))\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/parse\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n### Bug Fixes\n\n- stop truncating the body in presence of dashes ([#3476](https://github.com/conventional-changelog/commitlint/issues/3476)) ([02a61be](https://github.com/conventional-changelog/commitlint/commit/02a61befad13a348866fce30b15caa67a8360d9c))\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n### Bug Fixes\n\n- **parse:** enforce secure version of `conventional-commits-parser` ([#2776](https://github.com/conventional-changelog/commitlint/issues/2776)) ([a351801](https://github.com/conventional-changelog/commitlint/commit/a3518012ae11bc00a43a12b8ce935f3ffd2d04ef))\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/parse\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/parse\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/parse\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/parse\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/parse\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/parse\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n### Bug Fixes\n\n- don't merge array properties with custom opts ([#616](https://github.com/conventional-changelog/commitlint/issues/616)) ([f321647](https://github.com/conventional-changelog/commitlint/commit/f321647)), closes [#594](https://github.com/conventional-changelog/commitlint/issues/594)\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- mark optional parameter with undefined ([#553](https://github.com/conventional-changelog/commitlint/issues/553)) ([6720284](https://github.com/conventional-changelog/commitlint/commit/6720284))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/parse\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- fall back to conventional commit-parser settings for missing keys ([#496](https://github.com/conventional-changelog/commitlint/issues/496)) ([831a141](https://github.com/conventional-changelog/commitlint/commit/831a141)), closes [#399](https://github.com/conventional-changelog/commitlint/issues/399)\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/parse\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/parse\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n### Bug Fixes\n\n- **parse:** default to angular preset for empty parserOpts ([#265](https://github.com/conventional-changelog/commitlint/issues/265)) ([ccb03b4](https://github.com/conventional-changelog/commitlint/commit/ccb03b4)), closes [#262](https://github.com/conventional-changelog/commitlint/issues/262)\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/parse\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/parse\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/parse\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/parse\n"
  },
  {
    "path": "@commitlint/parse/README.md",
    "content": "> Parse commit messages to structured data\n\n# @commitlint/parse\n\n## Install\n\n```\nnpm install --save @commitlint/parse\n```\n\n## Use\n\n```js\nconst parse = require(\"@commitlint/parse\");\n```\n\n## API\n\n### parse(message: string, parser: Function, parserOpts: Object)\n\n- **message**: Commit message to parser\n- **parser**: Sync parser function to use. Defaults to `sync` of `conventional-commits-parser`\n- **parserOpts**: Options to pass to `parser`\n  ```\n  {\n    commentChar: null, // character indicating comment lines\n    issuePrefixes: ['#'] // prefix characters for issue references\n  }\n  ```\n"
  },
  {
    "path": "@commitlint/parse/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/parse/package.json",
    "content": "{\n  \"name\": \"@commitlint/parse\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/parse\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/conventional-commits-parser\": \"^5.0.2\"\n  },\n  \"dependencies\": {\n    \"@commitlint/types\": \"^20.5.0\",\n    \"conventional-changelog-angular\": \"^8.2.0\",\n    \"conventional-commits-parser\": \"^6.3.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/parse/src/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"./index.js\";\n\ntest(\"throws when called without params\", async () => {\n\tawait expect((parse as any)()).rejects.toThrow(\"Expected a raw commit\");\n});\n\ntest(\"throws when called with empty message\", async () => {\n\tawait expect(parse(\"\")).rejects.toThrow(\"Expected a raw commit\");\n});\n\ntest(\"returns object with raw message\", async () => {\n\tconst message = \"type(scope): subject\";\n\tconst actual = await parse(message);\n\n\texpect(actual).toHaveProperty(\"raw\", message);\n});\n\ntest(\"calls parser with message and passed options\", async () => {\n\tconst message = \"message\";\n\n\texpect.assertions(1);\n\tawait parse(message, (m: string): any => {\n\t\texpect(m).toBe(message);\n\t\treturn {};\n\t});\n});\n\ntest(\"passes object up from parser function\", async () => {\n\tconst message = \"message\";\n\tconst result: any = {};\n\tconst actual = await parse(message, () => result);\n\n\texpect(actual).toBe(result);\n});\n\ntest(\"returns object with expected keys\", async () => {\n\tconst message = \"message\";\n\tconst actual = await parse(message);\n\tconst expected = {\n\t\tbody: null,\n\t\tfooter: null,\n\t\theader: \"message\",\n\t\tmentions: [],\n\t\tmerge: null,\n\t\tnotes: [],\n\t\traw: \"message\",\n\t\treferences: [],\n\t\trevert: null,\n\t\tscope: null,\n\t\tsubject: null,\n\t\ttype: null,\n\t};\n\n\texpect(actual).toMatchObject(expected);\n});\n\ntest(\"uses angular grammar\", async () => {\n\tconst message = \"type(scope): subject\";\n\tconst actual = await parse(message);\n\tconst expected = {\n\t\tbody: null,\n\t\tfooter: null,\n\t\theader: \"type(scope): subject\",\n\t\tmentions: [],\n\t\tmerge: null,\n\t\tnotes: [],\n\t\traw: \"type(scope): subject\",\n\t\treferences: [],\n\t\trevert: null,\n\t\tscope: \"scope\",\n\t\tsubject: \"subject\",\n\t\ttype: \"type\",\n\t};\n\n\texpect(actual).toMatchObject(expected);\n});\n\ntest(\"uses custom opts parser\", async () => {\n\tconst message = \"type(scope)-subject\";\n\tconst changelogOpts = {\n\t\tparserOpts: {\n\t\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/,\n\t\t},\n\t};\n\tconst actual = await parse(message, undefined, changelogOpts.parserOpts);\n\tconst expected = {\n\t\tbody: null,\n\t\tfooter: null,\n\t\theader: \"type(scope)-subject\",\n\t\tmentions: [],\n\t\tmerge: null,\n\t\tnotes: [],\n\t\traw: \"type(scope)-subject\",\n\t\treferences: [],\n\t\trevert: null,\n\t\tscope: \"scope\",\n\t\tsubject: \"subject\",\n\t\ttype: \"type\",\n\t};\n\n\texpect(actual).toMatchObject(expected);\n});\n\ntest(\"does not merge array properties with custom opts\", async () => {\n\tconst message = \"type: subject\";\n\tconst actual = await parse(message, undefined, {\n\t\theaderPattern: /^(.*):\\s(.*)$/,\n\t\theaderCorrespondence: [\"type\", \"subject\"],\n\t});\n\tconst expected = {\n\t\tbody: null,\n\t\tfooter: null,\n\t\theader: \"type: subject\",\n\t\tmentions: [],\n\t\tmerge: null,\n\t\tnotes: [],\n\t\traw: \"type: subject\",\n\t\treferences: [],\n\t\trevert: null,\n\t\tsubject: \"subject\",\n\t\ttype: \"type\",\n\t};\n\n\texpect(actual).toMatchObject(expected);\n});\n\ntest(\"supports scopes with /\", async () => {\n\tconst message = \"type(some/scope): subject\";\n\tconst actual = await parse(message);\n\n\texpect(actual.scope).toBe(\"some/scope\");\n\texpect(actual.subject).toBe(\"subject\");\n});\n\ntest(\"supports scopes with / and empty parserOpts\", async () => {\n\tconst message = \"type(some/scope): subject\";\n\tconst actual = await parse(message, undefined, {});\n\n\texpect(actual.scope).toBe(\"some/scope\");\n\texpect(actual.subject).toBe(\"subject\");\n});\n\ntest(\"ignores comments\", async () => {\n\tconst message = \"type(some/scope): subject\\n# some comment\";\n\t// @ts-expect-error -- no typings\n\tconst changelogOpts = await import(\"conventional-changelog-angular\");\n\tconst opts = {\n\t\t...changelogOpts.parser,\n\t\tcommentChar: \"#\",\n\t};\n\tconst actual = await parse(message, undefined, opts);\n\n\texpect(actual.body).toBe(null);\n\texpect(actual.footer).toBe(null);\n\texpect(actual.subject).toBe(\"subject\");\n});\n\ntest(\"parses inline references in subject and body\", async () => {\n\tconst message = \"type(some/scope): subject #reference\\n\\nthings #reference\";\n\t// @ts-expect-error -- no typings\n\tconst changelogOpts = await import(\"conventional-changelog-angular\");\n\tconst actual = await parse(message, undefined, changelogOpts.parser);\n\n\texpect(actual.subject).toBe(\"subject #reference\");\n\texpect(actual.body).toBe(\"\");\n\t// v6 behavior: body content with references moves to footer\n\texpect(actual.footer).toBe(\"things #reference\");\n\t// v6 behavior: both reference instances are captured\n\texpect(actual.references).toHaveLength(2);\n\texpect(actual.references).toEqual(\n\t\texpect.arrayContaining([\n\t\t\texpect.objectContaining({\n\t\t\t\traw: \"type(some/scope): subject #reference\",\n\t\t\t\tissue: \"reference\",\n\t\t\t\tprefix: \"#\",\n\t\t\t}),\n\t\t\texpect.objectContaining({\n\t\t\t\traw: \"things #reference\",\n\t\t\t\tissue: \"reference\",\n\t\t\t\tprefix: \"#\",\n\t\t\t}),\n\t\t]),\n\t);\n});\n\ntest(\"filters comment lines when commentChar is set\", async () => {\n\tconst message = \"type(scope): subject\\n# this is a comment\\nbody content\";\n\t// @ts-expect-error -- no typings\n\tconst changelogOpts = await import(\"conventional-changelog-angular\");\n\tconst opts = {\n\t\t...changelogOpts.parser,\n\t\tcommentChar: \"#\",\n\t};\n\tconst actual = await parse(message, undefined, opts);\n\n\texpect(actual.subject).toBe(\"subject\");\n\texpect(actual.body).toBe(\"body content\");\n\t// Lines starting with commentChar are completely filtered out (not in body/footer)\n\texpect(actual.body).not.toContain(\"# this is a comment\");\n\texpect(actual.footer).toBe(null);\n});\n\ntest(\"keep -side notes- in the body section\", async () => {\n\tconst header = \"type(some/scope): subject\";\n\tconst body =\n\t\t\"CI on master branch caught this:\\n\\n\" +\n\t\t\"```\\n\" +\n\t\t\"Unhandled Exception:\\n\" +\n\t\t\"System.AggregateException: One or more errors occurred. (Some problem when connecting to 'api.mycryptoapi.com/eth')\\n\\n\" +\n\t\t\"--- End of stack trace from previous location where exception was thrown ---\\n\\n\" +\n\t\t\"at GWallet.Backend.FSharpUtil.ReRaise (System.Exception ex) [0x00000] in /Users/runner/work/geewallet/geewallet/src/GWallet.Backend/FSharpUtil.fs:206\\n\" +\n\t\t\"...\\n\" +\n\t\t\"```\";\n\n\tconst message = header + \"\\n\\n\" + body;\n\n\tconst actual = await parse(message);\n\n\texpect(actual.body).toBe(body);\n});\n\ntest(\"allows separating -side nodes- by setting parserOpts.fieldPattern\", async () => {\n\tconst message =\n\t\t\"type(scope): subject\\n\\nbody text\\n-authorName-\\nrenovate[bot]\";\n\tconst changelogOpts = {\n\t\tparserOpts: {\n\t\t\tfieldPattern: /^-(.*)-$/,\n\t\t},\n\t};\n\tconst actual = await parse(message, undefined, changelogOpts.parserOpts);\n\n\texpect(actual.body).toBe(\"body text\");\n\texpect(actual).toHaveProperty(\"authorName\", \"renovate[bot]\");\n});\n\ntest(\"parses references leading subject\", async () => {\n\tconst message = \"#1 some subject\";\n\t// @ts-expect-error -- no typings\n\tconst opts = await import(\"conventional-changelog-angular\");\n\tconst {\n\t\treferences: [actual],\n\t} = await parse(message, undefined, opts);\n\n\texpect(actual.issue).toBe(\"1\");\n});\n\ntest(\"parses custom references\", async () => {\n\tconst message = \"#1 some subject PREFIX-2\";\n\tconst { references } = await parse(message, undefined, {\n\t\tissuePrefixes: [\"PREFIX-\"],\n\t});\n\n\texpect(references.find((ref) => ref.issue === \"1\")).toBeFalsy();\n\texpect(references.find((ref) => ref.issue === \"2\")).toMatchObject({\n\t\taction: null,\n\t\tissue: \"2\",\n\t\towner: null,\n\t\tprefix: \"PREFIX-\",\n\t\traw: \"#1 some subject PREFIX-2\",\n\t\trepository: null,\n\t});\n});\n\ntest(\"uses permissive default regex without parser opts\", async () => {\n\tconst message = \"chore(component,demo): bump\";\n\tconst actual = await parse(message);\n\n\texpect(actual.scope).toBe(\"component,demo\");\n});\n\ntest(\"uses permissive default regex with other parser opts\", async () => {\n\tconst message = \"chore(component,demo): bump\";\n\tconst actual = await parse(message, undefined, { commentChar: \"#\" });\n\n\texpect(actual.scope).toBe(\"component,demo\");\n});\n\ntest(\"uses restrictive default regex in passed parser opts\", async () => {\n\tconst message = \"chore(component,demo): bump\";\n\tconst actual = await parse(message, undefined, {\n\t\theaderPattern: /^(\\w*)(?:\\(([a-z]*)\\))?: (.*)$/,\n\t});\n\n\texpect(actual.subject).toBe(null);\n\texpect(actual.scope).toBe(null);\n});\n\ntest(\"works with chinese scope by default\", async () => {\n\tconst message = \"fix(面试评价): 测试\";\n\tconst actual = await parse(message, undefined, { commentChar: \"#\" });\n\n\texpect(actual.subject).not.toBe(null);\n\texpect(actual.scope).not.toBe(null);\n});\n\ntest(\"does not work with chinese scopes with incompatible pattern\", async () => {\n\tconst message = \"fix(面试评价): 测试\";\n\tconst actual = await parse(message, undefined, {\n\t\theaderPattern: /^(\\w*)(?:\\(([a-z]*)\\))?: (.*)$/,\n\t});\n\n\texpect(actual.subject).toBe(null);\n\texpect(actual.scope).toBe(null);\n});\n\ntest(\"parses footer with noteKeywords containing regex-special characters\", async () => {\n\tconst message = \"feat: add feature\\n\\nBody text\\n[1] Custom note footer\";\n\n\tconst actual = await parse(message, undefined, {\n\t\tnoteKeywords: [\"[1]\", \"Notes:\"],\n\t});\n\n\t// [1] should be recognized as a note keyword (not regex)\n\texpect(actual.notes).toHaveLength(1);\n\texpect(actual.notes[0].title).toBe(\"[1]\");\n});\n"
  },
  {
    "path": "@commitlint/parse/src/index.ts",
    "content": "import type { Parser } from \"@commitlint/types\";\n\nimport {\n\ttype Commit,\n\ttype ParserOptions,\n\tCommitParser,\n} from \"conventional-commits-parser\";\n// @ts-expect-error -- no typings\nimport defaultChangelogOpts from \"conventional-changelog-angular\";\n\nconst defaultParser: Parser = (message, options) => {\n\tif (message === undefined || message === null) {\n\t\tthrow new TypeError(\"Expected a raw commit\");\n\t}\n\tconst parser = new CommitParser(options);\n\tconst result = parser.parse(message);\n\tresult.scope = result.scope ?? null;\n\tresult.subject = result.subject ?? null;\n\tresult.type = result.type ?? null;\n\treturn result;\n};\n\nexport async function parse(\n\tmessage: string,\n\tparser: Parser = defaultParser,\n\tparserOpts?: ParserOptions,\n): Promise<Commit> {\n\tconst preset = await defaultChangelogOpts();\n\tconst defaultOpts = preset.parser || preset.parserOpts;\n\t// Support user-provided parser options passed either flat or nested under a 'parser' key\n\tconst userOpts = (parserOpts as any)?.parser || parserOpts || {};\n\tconst opts = {\n\t\t...defaultOpts,\n\t\tfieldPattern: null,\n\t\t...userOpts,\n\t};\n\tconst parsed = parser(message, opts) as Commit;\n\tparsed.raw = message;\n\treturn parsed;\n}\n\nexport default parse;\n"
  },
  {
    "path": "@commitlint/parse/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../types\" }]\n}\n"
  },
  {
    "path": "@commitlint/prompt/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [19.3.1](https://github.com/conventional-changelog/commitlint/compare/v19.3.0...v19.3.1) (2024-05-13)\n\n\n### Bug Fixes\n\n* **prompt:** prompt does not respect [body-leading-blank] setting ([#4066](https://github.com/conventional-changelog/commitlint/issues/4066)) ([3f1f44d](https://github.com/conventional-changelog/commitlint/commit/3f1f44d9cbb93438d01cfd79f9b71659411e126d))\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [18.4.1](https://github.com/conventional-changelog/commitlint/compare/v18.4.0...v18.4.1) (2023-11-12)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [18.2.0](https://github.com/conventional-changelog/commitlint/compare/v18.1.0...v18.2.0) (2023-10-26)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.7.2](https://github.com/conventional-changelog/commitlint/compare/v17.7.1...v17.7.2) (2023-09-28)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.7.1](https://github.com/conventional-changelog/commitlint/compare/v17.7.0...v17.7.1) (2023-08-10)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n## [17.4.1](https://github.com/conventional-changelog/commitlint/compare/v17.4.0...v17.4.1) (2023-01-09)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [17.1.2](https://github.com/conventional-changelog/commitlint/compare/v17.1.1...v17.1.2) (2022-08-29)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [17.1.1](https://github.com/conventional-changelog/commitlint/compare/v17.1.0...v17.1.1) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n### Bug Fixes\n\n- **prompt:** correct import kind in prompt package ([#2852](https://github.com/conventional-changelog/commitlint/issues/2852)) ([45bf394](https://github.com/conventional-changelog/commitlint/commit/45bf394b34cef78011c2e0a1a7d0cc0d2bab41ae))\n- **prompt:** correct version of internal dependencies in prompt package [#2697](https://github.com/conventional-changelog/commitlint/issues/2697) ([#2851](https://github.com/conventional-changelog/commitlint/issues/2851)) ([b1155ca](https://github.com/conventional-changelog/commitlint/commit/b1155cae766aba7e93bc42c69c9ea7f47c1c16d4))\n\n# [14.2.0](https://github.com/conventional-changelog/commitlint/compare/v14.1.0...v14.2.0) (2021-11-06)\n\n### Features\n\n- **prompt:** rewrite codebase to use inquirer - UPDATED with current master ([#2697](https://github.com/conventional-changelog/commitlint/issues/2697)) ([5105f43](https://github.com/conventional-changelog/commitlint/commit/5105f43ea8093bce82fe4703c4c14a8210721924))\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [13.2.1](https://github.com/conventional-changelog/commitlint/compare/v13.2.0...v13.2.1) (2021-10-09)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n### Bug Fixes\n\n- **prompt:** modify the entry point to pass commitizen's function check ([#2501](https://github.com/conventional-changelog/commitlint/issues/2501)) ([0173fb7](https://github.com/conventional-changelog/commitlint/commit/0173fb7cc01dc8442ed88a0ab8feec20c955deee)), closes [/github.com/conventional-changelog/commitlint/issues/2486#issuecomment-791682272](https://github.com//github.com/conventional-changelog/commitlint/issues/2486/issues/issuecomment-791682272) [/github.com/conventional-changelog/commitlint/issues/2486#issuecomment-791682272](https://github.com//github.com/conventional-changelog/commitlint/issues/2486/issues/issuecomment-791682272)\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n### Bug Fixes\n\n- update dependency throat to v6 ([#2417](https://github.com/conventional-changelog/commitlint/issues/2417)) ([6f7db1b](https://github.com/conventional-changelog/commitlint/commit/6f7db1b39c48561b84a4fce9623fb045c5467fe8))\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency chalk to v4 ([#1275](https://github.com/conventional-changelog/commitlint/issues/1275)) ([a5d8fa1](https://github.com/conventional-changelog/commitlint/commit/a5d8fa118e8221361f14f5fd2b21d7aaad008a27))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n### Bug Fixes\n\n- add missing @babel/runtime dep [#1738](https://github.com/conventional-changelog/commitlint/issues/1738) ([#1754](https://github.com/conventional-changelog/commitlint/issues/1754)) ([09afcd6](https://github.com/conventional-changelog/commitlint/commit/09afcd647a2c1d00538cf1c970e3790d936111f8))\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n- incorrect use of when in getForcedCaseFn ([#993](https://github.com/conventional-changelog/commitlint/issues/993)) ([34c11b8](https://github.com/conventional-changelog/commitlint/commit/34c11b8f3f233eca51866274a10d35231e8eb3d4))\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [8.3.1](https://github.com/conventional-changelog/commitlint/compare/v8.3.0...v8.3.1) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n## [7.6.1](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.1) (2019-05-09)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"6.0.5\"></a>\n\n## [6.0.5](https://github.com/conventional-changelog/commitlint/compare/v6.0.4...v6.0.5) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"6.0.1\"></a>\n\n## [6.0.1](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.1) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"5.2.6\"></a>\n\n## [5.2.6](https://github.com/conventional-changelog/commitlint/compare/v5.2.5...v5.2.6) (2017-12-21)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"5.2.5\"></a>\n\n## [5.2.5](https://github.com/conventional-changelog/commitlint/compare/v5.2.4...v5.2.5) (2017-12-08)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"5.2.4\"></a>\n\n## [5.2.4](https://github.com/conventional-changelog/commitlint/compare/v5.2.3...v5.2.4) (2017-12-08)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"5.2.0\"></a>\n\n# [5.2.0](https://github.com/conventional-changelog/commitlint/compare/v5.1.3...v5.2.0) (2017-11-30)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"5.1.2\"></a>\n\n## [5.1.2](https://github.com/conventional-changelog/commitlint/compare/v5.1.1...v5.1.2) (2017-11-24)\n\n### Bug Fixes\n\n- **prompt:** apply forced cases properly ([3a569a7](https://github.com/conventional-changelog/commitlint/commit/3a569a7)), closes [#145](https://github.com/conventional-changelog/commitlint/issues/145)\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Bug Fixes\n\n- update dependency concurrently to v3.5.1 ([#147](https://github.com/conventional-changelog/commitlint/issues/147)) ([a809d0f](https://github.com/conventional-changelog/commitlint/commit/a809d0f))\n\n### Features\n\n- **prompt:** add description for build, ci and revert ([#148](https://github.com/conventional-changelog/commitlint/issues/148)) ([ee6ec6e](https://github.com/conventional-changelog/commitlint/commit/ee6ec6e))\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"4.2.2\"></a>\n\n## [4.2.2](https://github.com/conventional-changelog/commitlint/compare/v4.2.1...v4.2.2) (2017-10-26)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"4.1.1\"></a>\n\n## [4.1.1](https://github.com/conventional-changelog/commitlint/compare/v4.1.0...v4.1.1) (2017-10-09)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"4.1.0\"></a>\n\n# [4.1.0](https://github.com/conventional-changelog/commitlint/compare/v4.0.0...v4.1.0) (2017-10-05)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"4.0.0\"></a>\n\n# [4.0.0](https://github.com/conventional-changelog/commitlint/compare/v3.2.0...v4.0.0) (2017-10-04)\n\n**Note:** Version bump only for package @commitlint/prompt\n\n<a name=\"3.2.0\"></a>\n\n# 3.2.0 (2017-09-05)\n\n<a name=\"3.1.3\"></a>\n\n## 3.1.3 (2017-08-21)\n\n<a name=\"3.1.2\"></a>\n\n## 3.1.2 (2017-08-07)\n\n<a name=\"3.1.1\"></a>\n\n## 3.1.1 (2017-08-07)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.1.3\"></a>\n\n## 3.1.3 (2017-08-21)\n\n<a name=\"3.1.2\"></a>\n\n## 3.1.2 (2017-08-07)\n\n<a name=\"3.1.1\"></a>\n\n## 3.1.1 (2017-08-07)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.1.2\"></a>\n\n## 3.1.2 (2017-08-07)\n\n<a name=\"3.1.1\"></a>\n\n## 3.1.1 (2017-08-07)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n"
  },
  {
    "path": "@commitlint/prompt/README.md",
    "content": "# @commitlint/prompt\n\ncommitizen adapter using commitlint.config.js\n\nThis is the library and commitizen adapter version of commitlint prompt.\nA ready-to-use cli version is available at [@commitlint/prompt-cli](../prompt-cli).\nLearn how to use it in this [guide](https://commitlint.js.org/guides/use-prompt).\n\n## Getting started\n\n```bash\nnpm install --save-dev @commitlint/prompt @commitlint/config-conventional commitizen\necho \"module.exports = {extends: ['@commitlint/config-conventional']};\" > commitlint.config.js\n```\n\nIn package.json\n\n```\n{\n  \"scripts\": {\n    \"commit\": \"git-cz\"\n  },\n  \"config\": {\n    \"commitizen\": {\n      \"path\": \"@commitlint/prompt\"\n    }\n  }\n}\n```\n\n```bash\ngit add .\nnpm run commit\n```\n"
  },
  {
    "path": "@commitlint/prompt/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/prompt/package.json",
    "content": "{\n  \"name\": \"@commitlint/prompt\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"commitizen prompt using commitlint.config.js\",\n  \"main\": \"./lib/index.js\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-import\"\n  },\n  \"config\": {\n    \"commitizen\": {\n      \"path\": \"./@commitlint/prompt\"\n    }\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/prompt\"\n  },\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"prompt\",\n    \"cz\",\n    \"commitizen\"\n  ],\n  \"author\": \"Mario Nebl <hello@herebecode.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/config-angular\": \"^20.5.0\",\n    \"@commitlint/types\": \"^14.0.0\",\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/inquirer\": \"^9.0.7\",\n    \"commitizen\": \"^4.2.4\"\n  },\n  \"dependencies\": {\n    \"@commitlint/ensure\": \"^20.5.0\",\n    \"@commitlint/load\": \"^20.5.0\",\n    \"@commitlint/types\": \"^20.5.0\",\n    \"inquirer\": \"^9.2.15\",\n    \"picocolors\": \"^1.1.1\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/index.ts",
    "content": "import inquirer from \"inquirer\";\n\nimport { input } from \"./input.js\";\n\ntype Commit = (input: string) => void;\n\n/**\n * Entry point for commitizen\n * @param cz inquirer instance passed by commitizen, unused\n * @param commit callback to execute with complete commit message\n * @return {void}\n */\nexport function prompter(cz: typeof inquirer, commit: Commit): void {\n\tinput(cz.prompt).then((message) => {\n\t\tcommit(message);\n\t});\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/input.test.ts",
    "content": "/// <reference path=\"./inquirer/inquirer.d.ts\" />\n\nimport { expect, test, vi } from \"vitest\";\n// @ts-expect-error -- no typings\nimport config from \"@commitlint/config-angular\";\nimport pc from \"picocolors\";\nimport {\n\tAnswers,\n\tDistinctQuestion,\n\tInputCustomOptions,\n\tPromptModule,\n} from \"inquirer\";\n\nimport { input } from \"./input.js\";\n\nconst testConfig = {\n\tparserPreset: config.parserPreset,\n\trules: {\n\t\t...config.rules,\n\t},\n};\n\nvi.mock(\"@commitlint/load\", () => ({\n\tdefault: () => testConfig,\n}));\n\ntest(\"should work with all fields filled\", async () => {\n\tconst prompt = stub({\n\t\t\"input-custom\": {\n\t\t\ttype: \"fix\",\n\t\t\tscope: \"test\",\n\t\t\tsubject: \"subject\",\n\t\t\tbody: \"body\",\n\t\t\tfooter: \"footer\",\n\t\t},\n\t});\n\tconst message = await input(prompt);\n\texpect(message).toEqual(\"fix(test): subject\\n\" + \"\\nbody\\n\" + \"\\nfooter\");\n});\n\ntest(\"should not add leading blank line to body and footer if rules are disabled\", async () => {\n\ttestConfig.rules[\"body-leading-blank\"] = [\"1\", \"never\"];\n\ttestConfig.rules[\"footer-leading-blank\"] = [\"1\", \"never\"];\n\tconst prompt = stub({\n\t\t\"input-custom\": {\n\t\t\ttype: \"fix\",\n\t\t\tscope: \"test\",\n\t\t\tsubject: \"subject\",\n\t\t\tbody: \"body\",\n\t\t\tfooter: \"footer\",\n\t\t},\n\t});\n\tconst message = await input(prompt);\n\texpect(message).toEqual(\"fix(test): subject\\n\" + \"body\\n\" + \"footer\");\n\t// reset config mock\n\ttestConfig.rules[\"body-leading-blank\"] = config.rules[\"body-leading-blank\"];\n\ttestConfig.rules[\"footer-leading-blank\"] =\n\t\tconfig.rules[\"footer-leading-blank\"];\n});\n\ntest(\"should work without scope\", async () => {\n\tconst prompt = stub({\n\t\t\"input-custom\": {\n\t\t\ttype: \"fix\",\n\t\t\tscope: \"\",\n\t\t\tsubject: \"subject\",\n\t\t\tbody: \"body\",\n\t\t\tfooter: \"footer\",\n\t\t},\n\t});\n\tconst message = await input(prompt);\n\texpect(message).toEqual(\"fix: subject\\n\" + \"\\nbody\\n\" + \"\\nfooter\");\n});\n\ntest(\"should fail without type\", async () => {\n\tconst spy = vi.spyOn(console, \"error\");\n\tconst prompt = stub({\n\t\t\"input-custom\": {\n\t\t\ttype: \"\",\n\t\t\tscope: \"\",\n\t\t\tsubject: \"\",\n\t\t\tbody: \"\",\n\t\t\tfooter: \"\",\n\t\t},\n\t});\n\tconst message = await input(prompt);\n\texpect(message).toEqual(\"\");\n\texpect(console.error).toHaveBeenCalledTimes(1);\n\texpect(console.error).toHaveBeenLastCalledWith(\n\t\tnew Error(`⚠ ${pc.bold(\"type\")} may not be empty.`),\n\t);\n\tspy.mockRestore();\n});\n\nfunction stub(config: Record<string, Record<string, unknown>>): PromptModule {\n\tconst prompt = async (\n\t\tquestions: DistinctQuestion | DistinctQuestion[],\n\t): Promise<any> => {\n\t\tconst result: Answers = {};\n\t\tconst resolvedConfig = Array.isArray(questions) ? questions : [questions];\n\t\tfor (const promptConfig of resolvedConfig) {\n\t\t\tconst configType = promptConfig.type || \"input\";\n\t\t\tconst questions = config[configType];\n\t\t\tif (!questions) {\n\t\t\t\tthrow new Error(`Unexpected config type: ${configType}`);\n\t\t\t}\n\t\t\tlet answer = questions[promptConfig.name!];\n\t\t\tif (answer == null) {\n\t\t\t\tthrow new Error(`Unexpected config name: ${promptConfig.name}`);\n\t\t\t}\n\t\t\tconst validate = promptConfig.validate;\n\t\t\tif (validate) {\n\t\t\t\tconst validationResult = await validate(answer, result);\n\t\t\t\tif (validationResult !== true) {\n\t\t\t\t\tthrow new Error(validationResult || undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst forceLeadingBlankFn = (promptConfig as InputCustomOptions)\n\t\t\t\t.forceLeadingBlankFn;\n\t\t\tif (forceLeadingBlankFn) {\n\t\t\t\tanswer = forceLeadingBlankFn(answer as string);\n\t\t\t}\n\t\t\tresult[promptConfig.name!] = answer;\n\t\t}\n\t\treturn result;\n\t};\n\tprompt.registerPrompt = () => {\n\t\treturn prompt;\n\t};\n\tprompt.restoreDefaultPrompts = () => true;\n\tprompt.prompts = {};\n\treturn prompt as any as PromptModule;\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/input.ts",
    "content": "import load from \"@commitlint/load\";\nimport type { DistinctQuestion, PromptModule } from \"inquirer\";\n\nimport format from \"./library/format.js\";\nimport getPrompt from \"./library/get-prompt.js\";\nimport settings from \"./settings.js\";\nimport type { InputSetting, Result } from \"./library/types.js\";\nimport { getHasName, getMaxLength, getRules } from \"./library/utils.js\";\nimport InputCustomPrompt from \"./inquirer/InputCustomPrompt.js\";\n\n/**\n * Get user input by interactive prompt based on\n * conventional-changelog-lint rules.\n * @param prompter\n * @return commit message\n */\nexport async function input(prompter: PromptModule): Promise<string> {\n\tconst { rules } = await load();\n\tconst parts = [\"type\", \"scope\", \"subject\", \"body\", \"footer\"] as const;\n\tconst headerParts = [\"type\", \"scope\", \"subject\"];\n\n\tconst headerLengthRule = getRules(\"header\", rules).find(\n\t\tgetHasName(\"max-length\"),\n\t);\n\tconst maxLength = getMaxLength(headerLengthRule);\n\n\ttry {\n\t\tconst questions: DistinctQuestion<Result>[] = [];\n\t\tprompter.registerPrompt(\"input-custom\", InputCustomPrompt);\n\n\t\tfor (const input of parts) {\n\t\t\tconst inputSetting: InputSetting = settings[input];\n\t\t\tconst inputRules = getRules(input, rules);\n\t\t\tif (headerParts.includes(input) && maxLength < Infinity) {\n\t\t\t\tinputSetting.header = {\n\t\t\t\t\tlength: maxLength,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst question = getPrompt(input, inputRules, inputSetting);\n\t\t\tif (question) {\n\t\t\t\tquestions.push(question);\n\t\t\t}\n\t\t}\n\n\t\tconst results = await prompter<Result>(questions);\n\t\treturn format(results);\n\t} catch (err) {\n\t\tconsole.error(err);\n\t\treturn \"\";\n\t}\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/inquirer/InputCustomPrompt.ts",
    "content": "/// <reference path=\"./inquirer.d.ts\" />\nimport pc from \"picocolors\";\n\nimport inquirer, { type Answers, type InputCustomOptions } from \"inquirer\";\nimport InputPrompt from \"inquirer/lib/prompts/input.js\";\nimport observe from \"inquirer/lib/utils/events.js\";\nimport type { Interface as ReadlineInterface, Key } from \"node:readline\";\nimport type { Subscription } from \"rxjs\";\n\nimport SuccessfulPromptStateData = inquirer.prompts.SuccessfulPromptStateData;\n\ninterface KeyDescriptor {\n\tvalue: string;\n\tkey: Key;\n}\n\nexport default class InputCustomPrompt<\n\tTQuestion extends InputCustomOptions = InputCustomOptions,\n> extends InputPrompt<TQuestion> {\n\tprivate lineSubscription: Subscription;\n\tprivate readonly tabCompletion: string[];\n\n\tconstructor(\n\t\tquestion: TQuestion,\n\t\treadLine: ReadlineInterface,\n\t\tanswers: Answers,\n\t) {\n\t\tsuper(question, readLine, answers);\n\n\t\tif (this.opt.log) {\n\t\t\tthis.rl.write(this.opt.log(answers));\n\t\t}\n\n\t\tif (!this.opt.maxLength) {\n\t\t\tthis.throwParamError(\"maxLength\");\n\t\t}\n\n\t\tconst events = observe(this.rl);\n\t\tthis.lineSubscription = events.keypress.subscribe(\n\t\t\tthis.onKeyPress2.bind(this),\n\t\t);\n\t\tthis.tabCompletion = (this.opt.tabCompletion || [])\n\t\t\t.map((item) => item.value)\n\t\t\t.sort((a, b) => a.localeCompare(b));\n\t}\n\n\tonEnd(state: SuccessfulPromptStateData): void {\n\t\tthis.lineSubscription.unsubscribe();\n\t\t// Add or remove leading blank if rule is active.\n\t\tstate.value = this.opt.forceLeadingBlankFn(state.value);\n\t\tsuper.onEnd(state);\n\t}\n\n\t/**\n\t * @see https://nodejs.org/api/readline.html#readline_rl_write_data_key\n\t * @see https://nodejs.org/api/readline.html#readline_rl_line\n\t */\n\tupdateLine(line: string): void {\n\t\tthis.rl.write(null as any, { ctrl: true, name: \"b\" });\n\t\tthis.rl.write(null as any, { ctrl: true, name: \"d\" });\n\t\tthis.rl.write(line.substr(this.rl.line.length));\n\t}\n\n\tonKeyPress2(e: KeyDescriptor): void {\n\t\tif (e.key.name === \"tab\" && this.tabCompletion.length > 0) {\n\t\t\tlet line = this.rl.line.trim();\n\t\t\tif (line.length > 0) {\n\t\t\t\tfor (const item of this.tabCompletion) {\n\t\t\t\t\tif (item.startsWith(line) && item !== line) {\n\t\t\t\t\t\tline = item;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updateLine(line);\n\t\t}\n\t}\n\n\tmeasureInput(input: string): number {\n\t\tif (this.opt.filter) {\n\t\t\treturn this.opt.filter(input, this.answers).length;\n\t\t}\n\t\treturn input.length;\n\t}\n\n\trender(error?: string): void {\n\t\tconst answered = this.status === \"answered\";\n\n\t\tlet message = this.getQuestion();\n\t\tconst length = this.measureInput(this.rl.line);\n\n\t\tif (answered) {\n\t\t\tmessage += pc.cyan(this.answer);\n\t\t} else if (this.opt.transformer) {\n\t\t\tmessage += this.opt.transformer(this.rl.line, this.answers, {});\n\t\t}\n\n\t\tlet bottomContent = \"\";\n\n\t\tif (error) {\n\t\t\tbottomContent = pc.red(\">> \") + error;\n\t\t} else if (!answered) {\n\t\t\tconst maxLength = this.opt.maxLength(this.answers);\n\t\t\tif (maxLength < Infinity) {\n\t\t\t\tconst lengthRemaining = maxLength - length;\n\t\t\t\tconst color =\n\t\t\t\t\tlengthRemaining <= 5\n\t\t\t\t\t\t? pc.red\n\t\t\t\t\t\t: lengthRemaining <= 10\n\t\t\t\t\t\t\t? pc.yellow\n\t\t\t\t\t\t\t: pc.gray;\n\t\t\t\tbottomContent = color(`${lengthRemaining} characters left`);\n\t\t\t}\n\t\t}\n\n\t\tthis.screen.render(message, bottomContent);\n\t}\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/inquirer/inquirer.d.ts",
    "content": "import { Answers, InputQuestionOptions } from \"inquirer\";\n\ndeclare module \"inquirer\" {\n\tinterface InputCustomCompletionOption {\n\t\tvalue: string;\n\t\tdescription?: string;\n\t}\n\n\texport interface InputCustomOptions<\n\t\tT extends Answers = Answers,\n\t> extends InputQuestionOptions<T> {\n\t\t/**\n\t\t * @inheritdoc\n\t\t */\n\t\ttype?: \"input-custom\";\n\t\tlog?(answers?: T): string;\n\t\ttabCompletion?: InputCustomCompletionOption[];\n\t\tmaxLength(answers?: T): number;\n\t\tforceLeadingBlankFn(input: string): string;\n\t}\n\n\tinterface QuestionMap<T extends Answers = Answers> {\n\t\t\"input-custom\": InputCustomOptions<T>;\n\t}\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/library/format.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport type { Result } from \"./types.js\";\nimport format from \"./format.js\";\n\ntest(\"should return empty string\", () => {\n\tconst result: Result = {};\n\texpect(format(result)).toBe(\" \");\n});\n\ntest(\"should omit scope\", () => {\n\tconst result: Result = {\n\t\ttype: \"fix\",\n\t\tsubject: \"test\",\n\t};\n\texpect(format(result)).toBe(\"fix: test\");\n});\n\ntest(\"should include scope\", () => {\n\tconst result: Result = {\n\t\ttype: \"fix\",\n\t\tscope: \"prompt\",\n\t\tsubject: \"test\",\n\t};\n\texpect(format(result)).toBe(\"fix(prompt): test\");\n});\n\ntest(\"should include body\", () => {\n\tconst result: Result = {\n\t\ttype: \"fix\",\n\t\tscope: \"prompt\",\n\t\tsubject: \"test\",\n\t\tbody: \"some body\",\n\t};\n\texpect(format(result)).toBe(\"fix(prompt): test\\nsome body\");\n});\n\ntest(\"should include footer\", () => {\n\tconst result: Result = {\n\t\ttype: \"fix\",\n\t\tscope: \"prompt\",\n\t\tsubject: \"test\",\n\t\tfooter: \"some footer\",\n\t};\n\texpect(format(result)).toBe(\"fix(prompt): test\\nsome footer\");\n});\n\ntest(\"should include body and footer\", () => {\n\tconst result: Result = {\n\t\ttype: \"fix\",\n\t\tscope: \"prompt\",\n\t\tsubject: \"test\",\n\t\tbody: \"some body\",\n\t\tfooter: \"some footer\",\n\t};\n\texpect(format(result)).toBe(\"fix(prompt): test\\nsome body\\nsome footer\");\n});\n"
  },
  {
    "path": "@commitlint/prompt/src/library/format.ts",
    "content": "import pc from \"picocolors\";\n\nimport type { Result, ResultPart } from \"./types.js\";\n\n/**\n * Get formatted commit message\n * @param input object containing structured results\n * @param debug show debug information in commit message\n * @return formatted debug message\n */\nexport default function format(input: Result, debug = false): string {\n\tconst defaultInput = {\n\t\ttype: undefined,\n\t\tscope: undefined,\n\t\tsubject: undefined,\n\t\tbody: undefined,\n\t\tfooter: undefined,\n\t\t...input,\n\t};\n\tconst results = debug\n\t\t? Object.entries(defaultInput).reduce<Result>((registry, [name, value]) => {\n\t\t\t\tregistry[name as ResultPart] =\n\t\t\t\t\tvalue === undefined ? pc.gray(`<${name}>`) : pc.bold(value);\n\t\t\t\treturn registry;\n\t\t\t}, {})\n\t\t: defaultInput;\n\n\t// Return formatted string\n\tconst { type, scope, subject, body, footer } = results;\n\treturn [\n\t\t`${type || \"\"}${scope ? `(${scope})` : \"\"}${type || scope ? \":\" : \"\"} ${\n\t\t\tsubject || \"\"\n\t\t}`,\n\t\tbody,\n\t\tfooter,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\");\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/library/get-forced-case-fn.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport { RuleConfigSeverity } from \"@commitlint/types\";\n\nimport getForcedCaseFn from \"./get-forced-case-fn.js\";\n\ntest(\"should not apply\", () => {\n\tlet rule = getForcedCaseFn([\"name\", [RuleConfigSeverity.Disabled]]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test-foo\")).toBe(\"test-foo\");\n\texpect(rule(\"testFoo\")).toBe(\"testFoo\");\n\texpect(rule(\"TEST_FOO\")).toBe(\"TEST_FOO\");\n\n\trule = getForcedCaseFn();\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test-foo\")).toBe(\"test-foo\");\n\texpect(rule(\"testFoo\")).toBe(\"testFoo\");\n\texpect(rule(\"TEST_FOO\")).toBe(\"TEST_FOO\");\n\n\trule = getForcedCaseFn([\"name\", [RuleConfigSeverity.Warning, \"never\"]]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test-foo\")).toBe(\"test-foo\");\n\texpect(rule(\"testFoo\")).toBe(\"testFoo\");\n\texpect(rule(\"TEST_FOO\")).toBe(\"TEST_FOO\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", [\"camel-case\", \"lowercase\"]],\n\t]);\n\texpect(rule(\"test\")).toBe(\"test\");\n\texpect(rule(\"test-foo\")).toBe(\"test-foo\");\n\texpect(rule(\"testFoo\")).toBe(\"testFoo\");\n\texpect(rule(\"TEST_FOO\")).toBe(\"TEST_FOO\");\n});\n\ntest(\"should throw error on invalid casing\", () => {\n\tlet rule = getForcedCaseFn([\"name\", [RuleConfigSeverity.Warning, \"always\"]]);\n\texpect(() => rule(\"test\")).toThrow('Unknown target case \"undefined\"');\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"foo\"],\n\t]);\n\texpect(() => rule(\"test\")).toThrow('Unknown target case \"foo\"');\n});\n\ntest(\"should convert text correctly\", () => {\n\tlet rule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"camel-case\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"testFooBarBazBaz\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"kebab-case\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test-foo-bar-baz-baz\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"snake-case\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test_foo_bar_baz_baz\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"pascal-case\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TestFooBarBazBaz\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"start-case\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TEST FOO Bar Baz Baz\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"upper-case\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TEST_FOOBAR-BAZ BAZ\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"uppercase\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TEST_FOOBAR-BAZ BAZ\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"sentence-case\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TEST_FOOBar-baz baz\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"sentencecase\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"TEST_FOOBar-baz baz\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"lower-case\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test_foobar-baz baz\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"lowercase\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test_foobar-baz baz\");\n\n\trule = getForcedCaseFn([\n\t\t\"name\",\n\t\t[RuleConfigSeverity.Warning, \"always\", \"lowerCase\"],\n\t]);\n\texpect(rule(\"TEST_FOOBar-baz baz\")).toBe(\"test_foobar-baz baz\");\n});\n"
  },
  {
    "path": "@commitlint/prompt/src/library/get-forced-case-fn.ts",
    "content": "import { toCase } from \"@commitlint/ensure\";\nimport type { TargetCaseType } from \"@commitlint/types\";\n\nimport type { RuleEntry } from \"./types.js\";\nimport { ruleIsActive, ruleIsNotApplicable } from \"./utils.js\";\n\n/**\n * Get forced case for rule\n * @param rule to parse\n * @return transform function applying the enforced case\n */\nexport default function getForcedCaseFn(\n\trule?: RuleEntry,\n): (input: string) => string {\n\tconst noop = (input: string) => input;\n\n\tif (!rule || !ruleIsActive(rule) || ruleIsNotApplicable(rule)) {\n\t\treturn noop;\n\t}\n\n\tconst target = rule[1][2];\n\n\tif (Array.isArray(target)) {\n\t\treturn noop;\n\t}\n\n\treturn (input: string) => toCase(input, target as TargetCaseType);\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/library/get-forced-leading-fn.ts",
    "content": "import type { RuleEntry } from \"./types.js\";\nimport { ruleIsActive, ruleIsNotApplicable } from \"./utils.js\";\n\n/**\n * Get forced leading for rule\n * @param rule to parse\n * @return transform function applying the leading\n */\nexport default function getForcedLeadingFn(\n\trule?: RuleEntry,\n): (input: string) => string {\n\tif (!rule || !ruleIsActive(rule)) {\n\t\treturn (input: string): string => input;\n\t}\n\n\tconst remove = (input: string): string => {\n\t\tconst fragments = input.split(\"\\n\");\n\t\treturn fragments[0] === \"\" ? fragments.slice(1).join(\"\\n\") : input;\n\t};\n\tconst lead = (input: string): string => {\n\t\tconst fragments = input.split(\"\\n\");\n\t\treturn fragments[0] === \"\" ? input : [\"\", ...fragments].join(\"\\n\");\n\t};\n\n\treturn !ruleIsNotApplicable(rule) ? lead : remove;\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/library/get-prompt.ts",
    "content": "import pc from \"picocolors\";\nimport type { InputCustomOptions } from \"inquirer\";\n\nimport type { InputSetting, RuleEntry, Result, ResultPart } from \"./types.js\";\n\nimport format from \"./format.js\";\nimport getForcedCaseFn from \"./get-forced-case-fn.js\";\nimport getForcedLeadingFn from \"./get-forced-leading-fn.js\";\nimport meta from \"./meta.js\";\nimport {\n\tenumRuleIsActive,\n\tgetHasName,\n\tgetMaxLength,\n\truleIsActive,\n\truleIsApplicable,\n\truleIsNotApplicable,\n} from \"./utils.js\";\n\nconst EOL = \"\\n\";\n\n/**\n * Get a cli prompt based on rule configuration\n * @param type type of the data to gather\n * @param rules\n * @param settings\n * @return prompt instance\n */\nexport default function getPrompt(\n\ttype: ResultPart,\n\trules: RuleEntry[] = [],\n\tsettings: InputSetting = {},\n): InputCustomOptions<Result> | null {\n\tconst emptyRule = rules.filter(getHasName(\"empty\")).find(ruleIsActive);\n\n\tconst mustBeEmpty = emptyRule ? ruleIsApplicable(emptyRule) : false;\n\n\tif (mustBeEmpty) {\n\t\treturn null;\n\t}\n\n\tconst required = emptyRule ? ruleIsNotApplicable(emptyRule) : false;\n\n\tconst forceCaseFn = getForcedCaseFn(rules.find(getHasName(\"case\")));\n\tconst forceLeadingBlankFn = getForcedLeadingFn(\n\t\trules.find(getHasName(\"leading-blank\")),\n\t);\n\n\tconst maxLengthRule = rules.find(getHasName(\"max-length\"));\n\tconst inputMaxLength = getMaxLength(maxLengthRule);\n\n\tconst enumRule = rules.filter(getHasName(\"enum\")).find(enumRuleIsActive);\n\n\tconst tabCompletion = enumRule\n\t\t? enumRule[1][2].map((enumerable) => {\n\t\t\t\tconst enumSettings = (settings.enumerables || {})[enumerable] || {};\n\t\t\t\treturn {\n\t\t\t\t\tvalue: forceLeadingBlankFn(forceCaseFn(enumerable)),\n\t\t\t\t\tdescription: enumSettings.description || \"\",\n\t\t\t\t};\n\t\t\t})\n\t\t: [];\n\n\tconst maxLength = (res: Result) => {\n\t\tlet remainingHeaderLength = Infinity;\n\t\tif (settings.header && settings.header.length) {\n\t\t\tconst header = format({\n\t\t\t\ttype: res.type,\n\t\t\t\tscope: res.scope,\n\t\t\t\tsubject: res.subject,\n\t\t\t});\n\t\t\tremainingHeaderLength = settings.header.length - header.length;\n\t\t}\n\t\treturn Math.min(inputMaxLength, remainingHeaderLength);\n\t};\n\n\treturn {\n\t\ttype: \"input-custom\",\n\t\tname: type,\n\t\tmessage: `${type}:`,\n\t\tvalidate(input, answers) {\n\t\t\tif (input.length > maxLength(answers || {})) {\n\t\t\t\treturn \"Input contains too many characters!\";\n\t\t\t}\n\t\t\tif (required && input.trim().length === 0) {\n\t\t\t\t// Show help if enum is defined and input may not be empty\n\t\t\t\treturn `⚠ ${pc.bold(type)} may not be empty.`;\n\t\t\t}\n\n\t\t\tconst tabValues = tabCompletion.map((item) => item.value);\n\t\t\tif (\n\t\t\t\tinput.length > 0 &&\n\t\t\t\ttabValues.length > 0 &&\n\t\t\t\t!tabValues.includes(input)\n\t\t\t) {\n\t\t\t\treturn `⚠ ${pc.bold(type)} must be one of ${tabValues.join(\", \")}.`;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\ttabCompletion,\n\t\tlog(answers?: Result) {\n\t\t\tlet prefix =\n\t\t\t\t`${pc.white(\"Please enter a\")} ${pc.bold(type)}: ${meta({\n\t\t\t\t\toptional: !required,\n\t\t\t\t\trequired: required,\n\t\t\t\t\t\"tab-completion\": typeof enumRule !== \"undefined\",\n\t\t\t\t\theader: typeof settings.header !== \"undefined\",\n\t\t\t\t\t\"multi-line\": settings.multiline,\n\t\t\t\t})}` + EOL;\n\n\t\t\tif (settings.description) {\n\t\t\t\tprefix += pc.gray(`${settings.description}`) + EOL;\n\t\t\t}\n\t\t\tif (answers) {\n\t\t\t\tprefix += EOL + `${format(answers, true)}` + EOL;\n\t\t\t}\n\t\t\treturn prefix + EOL;\n\t\t},\n\t\tmaxLength,\n\t\ttransformer(value: string) {\n\t\t\treturn forceCaseFn(value);\n\t\t},\n\t\tforceLeadingBlankFn,\n\t};\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/library/meta.ts",
    "content": "import pc from \"picocolors\";\n\n/**\n * Get formatted meta hints for configuration\n * @param settings dictionary to parse\n * @return formatted meta information\n */\nexport default function meta(settings: Record<string, unknown>): string {\n\treturn pc.gray(\n\t\tObject.entries(settings || {})\n\t\t\t.filter((item) => item[1])\n\t\t\t.map((item) => {\n\t\t\t\tconst [name, value] = item;\n\t\t\t\treturn typeof value === \"boolean\" ? `[${name}]` : `[${name}=${value}]`;\n\t\t\t})\n\t\t\t.join(\" \"),\n\t);\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/library/types.ts",
    "content": "import type {\n\tRuleConfigCondition,\n\tRuleConfigSeverity,\n} from \"@commitlint/types\";\n\nexport type RuleEntry =\n\t| [string, Readonly<[RuleConfigSeverity.Disabled]>]\n\t| [string, Readonly<[RuleConfigSeverity, RuleConfigCondition]>]\n\t| [string, Readonly<[RuleConfigSeverity, RuleConfigCondition, unknown]>];\n\nexport type InputSetting = {\n\tdescription?: string;\n\tenumerables?: Record<\n\t\tstring,\n\t\t{\n\t\t\tdescription: string;\n\t\t}\n\t>;\n\tmultiline?: boolean;\n\theader?: {\n\t\tlength?: number;\n\t};\n};\n\nexport type ResultPart = \"type\" | \"scope\" | \"subject\" | \"body\" | \"footer\";\n\nexport type Result = Partial<Record<ResultPart, string | undefined>>;\n"
  },
  {
    "path": "@commitlint/prompt/src/library/utils.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport {\n\tRuleConfigQuality,\n\tRuleConfigSeverity,\n\tRulesConfig,\n} from \"@commitlint/types\";\n\nimport {\n\tenumRuleIsActive,\n\tgetHasName,\n\tgetMaxLength,\n\tgetRuleName,\n\tgetRulePrefix,\n\tgetRules,\n\truleIsActive,\n} from \"./utils.js\";\n\ntest(\"getRulePrefix\", () => {\n\texpect(getRulePrefix(\"body-leading-blank\")).toEqual(\"body\");\n\texpect(getRulePrefix(\"body-max-line-length\")).toEqual(\"body\");\n\texpect(getRulePrefix(\"footer-leading-blank\")).toEqual(\"footer\");\n\texpect(getRulePrefix(\"footer-max-line-length\")).toEqual(\"footer\");\n\texpect(getRulePrefix(\"header-max-length\")).toEqual(\"header\");\n\texpect(getRulePrefix(\"scope-case\")).toEqual(\"scope\");\n\texpect(getRulePrefix(\"scope-enum\")).toEqual(\"scope\");\n\texpect(getRulePrefix(\"subject-case\")).toEqual(\"subject\");\n\texpect(getRulePrefix(\"subject-empty\")).toEqual(\"subject\");\n\texpect(getRulePrefix(\"subject-full-stop\")).toEqual(\"subject\");\n\texpect(getRulePrefix(\"type-case\")).toEqual(\"type\");\n\texpect(getRulePrefix(\"type-empty\")).toEqual(\"type\");\n\texpect(getRulePrefix(\"type-enum\")).toEqual(\"type\");\n});\n\ntest(\"getRuleName\", () => {\n\texpect(getRuleName(\"body-leading-blank\")).toEqual(\"leading-blank\");\n\texpect(getRuleName(\"body-max-line-length\")).toEqual(\"max-line-length\");\n\texpect(getRuleName(\"footer-leading-blank\")).toEqual(\"leading-blank\");\n\texpect(getRuleName(\"footer-max-line-length\")).toEqual(\"max-line-length\");\n\texpect(getRuleName(\"header-max-length\")).toEqual(\"max-length\");\n\texpect(getRuleName(\"scope-case\")).toEqual(\"case\");\n\texpect(getRuleName(\"scope-enum\")).toEqual(\"enum\");\n\texpect(getRuleName(\"subject-case\")).toEqual(\"case\");\n\texpect(getRuleName(\"subject-empty\")).toEqual(\"empty\");\n\texpect(getRuleName(\"subject-full-stop\")).toEqual(\"full-stop\");\n\texpect(getRuleName(\"type-case\")).toEqual(\"case\");\n\texpect(getRuleName(\"type-empty\")).toEqual(\"empty\");\n\texpect(getRuleName(\"type-enum\")).toEqual(\"enum\");\n});\n\ntest(\"ruleIsActive\", () => {\n\texpect(ruleIsActive([\"\", [RuleConfigSeverity.Error, \"always\", 100]])).toBe(\n\t\ttrue,\n\t);\n\texpect(ruleIsActive([\"\", [RuleConfigSeverity.Warning, \"never\", 100]])).toBe(\n\t\ttrue,\n\t);\n\texpect(ruleIsActive([\"\", [RuleConfigSeverity.Disabled, \"always\", 100]])).toBe(\n\t\tfalse,\n\t);\n\texpect(ruleIsActive([\"\", [RuleConfigSeverity.Error]] as any)).toBe(true);\n});\n\ntest(\"getMaxLength\", () => {\n\texpect(getMaxLength([\"\", [RuleConfigSeverity.Error, \"always\", 100]])).toBe(\n\t\t100,\n\t);\n\texpect(getMaxLength([\"\", [RuleConfigSeverity.Warning, \"never\", 100]])).toBe(\n\t\tInfinity,\n\t);\n\texpect(getMaxLength([\"\", [RuleConfigSeverity.Disabled, \"always\", 100]])).toBe(\n\t\tInfinity,\n\t);\n\texpect(getMaxLength([\"\", [RuleConfigSeverity.Error, 100]] as any)).toBe(\n\t\tInfinity,\n\t);\n\n\tconst rules: any = {\n\t\t\"body-max-line-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\"header-max-length\": [RuleConfigSeverity.Error, \"always\", 100],\n\t\t\"test-max-length\": [RuleConfigSeverity.Disabled, \"always\", 100],\n\t};\n\tlet lengthRule = getRules(\"header\", rules).find(getHasName(\"max-length\"));\n\texpect(getMaxLength(lengthRule)).toBe(100);\n\n\tlengthRule = getRules(\"body\", rules).find(getHasName(\"max-length\"));\n\texpect(getMaxLength(lengthRule)).toBe(Infinity);\n\n\tlengthRule = getRules(\"test\", rules).find(getHasName(\"max-length\"));\n\texpect(getMaxLength(lengthRule)).toBe(Infinity);\n});\n\ntest(\"check enum rule filters\", () => {\n\tconst rules: Partial<RulesConfig<RuleConfigQuality.Qualified>> = {\n\t\t\"enum-string\": [RuleConfigSeverity.Warning, \"always\", [\"1\", \"2\", \"3\"]],\n\t\t\"type-enum\": [RuleConfigSeverity.Error, \"always\", [\"build\", \"chore\", \"ci\"]],\n\t\t\"scope-enum\": [RuleConfigSeverity.Error, \"never\", [\"cli\", \"core\", \"lint\"]],\n\t\t\"bar-enum\": [RuleConfigSeverity.Disabled, \"always\", [\"foo\", \"bar\", \"baz\"]],\n\t};\n\n\tlet enumRule = getRules(\"type\", rules)\n\t\t.filter(getHasName(\"enum\"))\n\t\t.find(enumRuleIsActive);\n\texpect(enumRule).toEqual([\n\t\t\"type-enum\",\n\t\t[RuleConfigSeverity.Error, \"always\", [\"build\", \"chore\", \"ci\"]],\n\t]);\n\n\tenumRule = getRules(\"string\", rules)\n\t\t.filter(getHasName(\"enum\"))\n\t\t.find(enumRuleIsActive);\n\texpect(enumRule).toEqual(undefined);\n\n\tenumRule = getRules(\"enum\", rules)\n\t\t.filter(getHasName(\"string\"))\n\t\t.find(enumRuleIsActive);\n\texpect(enumRule).toEqual([\n\t\t\"enum-string\",\n\t\t[RuleConfigSeverity.Warning, \"always\", [\"1\", \"2\", \"3\"]],\n\t]);\n\n\tenumRule = getRules(\"bar\", rules)\n\t\t.filter(getHasName(\"enum\"))\n\t\t.find(enumRuleIsActive);\n\texpect(enumRule).toEqual(undefined);\n\n\tenumRule = getRules(\"scope\", rules)\n\t\t.filter(getHasName(\"enum\"))\n\t\t.find(enumRuleIsActive);\n\texpect(enumRule).toEqual(undefined);\n});\n"
  },
  {
    "path": "@commitlint/prompt/src/library/utils.ts",
    "content": "import { RuleConfigSeverity } from \"@commitlint/types\";\nimport type { QualifiedRules } from \"@commitlint/types\";\n\nimport type { RuleEntry } from \"./types.js\";\n\n/**\n * Get name for a given rule id\n * @param id of the rule\n * @return name of the rule\n */\nexport function getRuleName(id: string): string {\n\tconst fragments = id.split(\"-\");\n\treturn fragments.length > 1 ? fragments.slice(1).join(\"-\") : fragments[0];\n}\n\n/**\n * Get prefix for a given rule id\n * @param id of the rule\n * @return prefix of the rule\n */\nexport function getRulePrefix(id: string): string | null {\n\tconst fragments = id.split(\"-\");\n\treturn fragments.length > 1 ? fragments[0] : null;\n}\n\n/**\n * Get a predicate matching rule definitions with a given name\n */\nexport function getHasName(name: string) {\n\treturn <T extends RuleEntry>(\n\t\trule: RuleEntry,\n\t): rule is Exclude<T, [string, undefined]> => getRuleName(rule[0]) === name;\n}\n\n/**\n * Check if a rule definition is active\n * @param rule to check\n * @return if the rule definition is active\n */\nexport function ruleIsActive<T extends RuleEntry>(\n\trule: T,\n): rule is Exclude<T, [string, Readonly<[RuleConfigSeverity.Disabled]>]> {\n\tconst [, value] = rule;\n\tif (value && Array.isArray(value)) {\n\t\treturn value[0] > RuleConfigSeverity.Disabled;\n\t}\n\treturn false;\n}\n\n/**\n * Check if a rule definition is applicable\n * @param rule to check\n * @return if the rule definition is applicable\n */\nexport function ruleIsApplicable(\n\trule: RuleEntry,\n): rule is\n\t| [string, Readonly<[RuleConfigSeverity, \"always\"]>]\n\t| [string, Readonly<[RuleConfigSeverity, \"always\", unknown]>] {\n\tconst [, value] = rule;\n\tif (value && Array.isArray(value)) {\n\t\treturn value[1] === \"always\";\n\t}\n\treturn false;\n}\n\n/**\n * Check if a rule definition is applicable\n * @param rule to check\n * @return if the rule definition is applicable\n */\nexport function ruleIsNotApplicable(\n\trule: RuleEntry,\n): rule is\n\t| [string, Readonly<[RuleConfigSeverity, \"never\"]>]\n\t| [string, Readonly<[RuleConfigSeverity, \"never\", unknown]>] {\n\tconst [, value] = rule;\n\tif (value && Array.isArray(value)) {\n\t\treturn value[1] === \"never\";\n\t}\n\treturn false;\n}\n\nexport function enumRuleIsActive(\n\trule: RuleEntry,\n): rule is [\n\tstring,\n\tReadonly<\n\t\t[RuleConfigSeverity.Warning | RuleConfigSeverity.Error, \"always\", string[]]\n\t>,\n] {\n\treturn (\n\t\truleIsActive(rule) &&\n\t\truleIsApplicable(rule) &&\n\t\tArray.isArray(rule[1][2]) &&\n\t\trule[1][2].length > 0\n\t);\n}\n\n/**\n * Get rules for a given prefix\n * @param prefix to search in rule names\n * @param rules rules to search in\n * @return rules matching the prefix search\n */\nexport function getRules(prefix: string, rules: QualifiedRules): RuleEntry[] {\n\treturn Object.entries(rules).filter(\n\t\t(rule): rule is RuleEntry => getRulePrefix(rule[0]) === prefix,\n\t);\n}\n\nexport function getMaxLength(rule?: RuleEntry): number {\n\tif (\n\t\trule &&\n\t\truleIsActive(rule) &&\n\t\truleIsApplicable(rule) &&\n\t\ttypeof rule[1][2] === \"number\"\n\t) {\n\t\treturn rule[1][2];\n\t}\n\treturn Infinity;\n}\n"
  },
  {
    "path": "@commitlint/prompt/src/settings.ts",
    "content": "export default {\n\ttype: {\n\t\tdescription: \"<type> holds information about the goal of a change.\",\n\t\tenumerables: {\n\t\t\tfeat: {\n\t\t\t\tdescription: \"Adds a new feature.\",\n\t\t\t},\n\t\t\tfix: {\n\t\t\t\tdescription: \"Solves a bug.\",\n\t\t\t},\n\t\t\tchore: {\n\t\t\t\tdescription: \"Other changes that don't modify src or test files\",\n\t\t\t},\n\t\t\tdocs: {\n\t\t\t\tdescription: \"Adds or alters documentation.\",\n\t\t\t},\n\t\t\tstyle: {\n\t\t\t\tdescription: \"Improves formatting, white-space.\",\n\t\t\t},\n\t\t\trefactor: {\n\t\t\t\tdescription:\n\t\t\t\t\t\"Rewrites code without feature, performance or bug changes.\",\n\t\t\t},\n\t\t\tperf: {\n\t\t\t\tdescription: \"Improves performance.\",\n\t\t\t},\n\t\t\ttest: {\n\t\t\t\tdescription: \"Adds or modifies tests.\",\n\t\t\t},\n\t\t\tbuild: {\n\t\t\t\tdescription: \"Affects the build system or external dependencies.\",\n\t\t\t},\n\t\t\tci: {\n\t\t\t\tdescription: \"Changes CI configuration files and scripts.\",\n\t\t\t},\n\t\t\trevert: {\n\t\t\t\tdescription: \"Reverts a previous commit.\",\n\t\t\t},\n\t\t},\n\t},\n\tscope: {\n\t\tdescription: \"<scope> marks which sub-component of the project is affected\",\n\t},\n\tsubject: {\n\t\tdescription: \"<subject> is a short, high-level description of the change\",\n\t},\n\tbody: {\n\t\tdescription: \"<body> holds additional information about the change\",\n\t\tmultiline: true,\n\t},\n\tfooter: {\n\t\tdescription:\n\t\t\t\"<footer> holds further meta data, such as breaking changes and issue ids\",\n\t\tmultiline: true,\n\t},\n};\n"
  },
  {
    "path": "@commitlint/prompt/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../types\" }, { \"path\": \"../load\" }]\n}\n"
  },
  {
    "path": "@commitlint/prompt-cli/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n\n### Bug Fixes\n\n* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299))\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [19.3.1](https://github.com/conventional-changelog/commitlint/compare/v19.3.0...v19.3.1) (2024-05-13)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add `main` and `types` keys in package.json ([#3953](https://github.com/conventional-changelog/commitlint/issues/3953)) ([7ddaad4](https://github.com/conventional-changelog/commitlint/commit/7ddaad4bc4e71afe89f25cc02d3e19beba1ce6cd))\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [18.4.1](https://github.com/conventional-changelog/commitlint/compare/v18.4.0...v18.4.1) (2023-11-12)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [18.2.0](https://github.com/conventional-changelog/commitlint/compare/v18.1.0...v18.2.0) (2023-10-26)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.7.2](https://github.com/conventional-changelog/commitlint/compare/v17.7.1...v17.7.2) (2023-09-28)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.7.1](https://github.com/conventional-changelog/commitlint/compare/v17.7.0...v17.7.1) (2023-08-10)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n## [17.4.1](https://github.com/conventional-changelog/commitlint/compare/v17.4.0...v17.4.1) (2023-01-09)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [17.1.2](https://github.com/conventional-changelog/commitlint/compare/v17.1.1...v17.1.2) (2022-08-29)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [17.1.1](https://github.com/conventional-changelog/commitlint/compare/v17.1.0...v17.1.1) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [14.2.0](https://github.com/conventional-changelog/commitlint/compare/v14.1.0...v14.2.0) (2021-11-06)\n\n### Features\n\n- **prompt:** rewrite codebase to use inquirer - UPDATED with current master ([#2697](https://github.com/conventional-changelog/commitlint/issues/2697)) ([5105f43](https://github.com/conventional-changelog/commitlint/commit/5105f43ea8093bce82fe4703c4c14a8210721924))\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [13.2.1](https://github.com/conventional-changelog/commitlint/compare/v13.2.0...v13.2.1) (2021-10-09)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- update dependency execa to v5 ([#2341](https://github.com/conventional-changelog/commitlint/issues/2341)) ([f349df9](https://github.com/conventional-changelog/commitlint/commit/f349df90f08096a9bcad46b5e55b411aac327a24))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency execa to v4 ([#1936](https://github.com/conventional-changelog/commitlint/issues/1936)) ([8efb441](https://github.com/conventional-changelog/commitlint/commit/8efb44193058d286f7325327a6d33936b273ec91))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [8.3.1](https://github.com/conventional-changelog/commitlint/compare/v8.3.0...v8.3.1) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n## [7.6.1](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.1) (2019-05-09)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Features\n\n- check stage before entering prompt ([#495](https://github.com/conventional-changelog/commitlint/issues/495)) ([3b3667a](https://github.com/conventional-changelog/commitlint/commit/3b3667a)), closes [#51](https://github.com/conventional-changelog/commitlint/issues/51) [#51](https://github.com/conventional-changelog/commitlint/issues/51)\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"6.0.5\"></a>\n\n## [6.0.5](https://github.com/conventional-changelog/commitlint/compare/v6.0.4...v6.0.5) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"6.0.1\"></a>\n\n## [6.0.1](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.1) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"5.2.6\"></a>\n\n## [5.2.6](https://github.com/conventional-changelog/commitlint/compare/v5.2.5...v5.2.6) (2017-12-21)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"5.2.5\"></a>\n\n## [5.2.5](https://github.com/conventional-changelog/commitlint/compare/v5.2.4...v5.2.5) (2017-12-08)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"5.2.4\"></a>\n\n## [5.2.4](https://github.com/conventional-changelog/commitlint/compare/v5.2.3...v5.2.4) (2017-12-08)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"5.2.0\"></a>\n\n# [5.2.0](https://github.com/conventional-changelog/commitlint/compare/v5.1.3...v5.2.0) (2017-11-30)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"5.1.2\"></a>\n\n## [5.1.2](https://github.com/conventional-changelog/commitlint/compare/v5.1.1...v5.1.2) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Features\n\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"4.2.2\"></a>\n\n## [4.2.2](https://github.com/conventional-changelog/commitlint/compare/v4.2.1...v4.2.2) (2017-10-26)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"4.1.1\"></a>\n\n## [4.1.1](https://github.com/conventional-changelog/commitlint/compare/v4.1.0...v4.1.1) (2017-10-09)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"4.1.0\"></a>\n\n# [4.1.0](https://github.com/conventional-changelog/commitlint/compare/v4.0.0...v4.1.0) (2017-10-05)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"4.0.0\"></a>\n\n# [4.0.0](https://github.com/conventional-changelog/commitlint/compare/v3.2.0...v4.0.0) (2017-10-04)\n\n**Note:** Version bump only for package @commitlint/prompt-cli\n\n<a name=\"3.2.0\"></a>\n\n# 3.2.0 (2017-09-05)\n\n<a name=\"3.1.3\"></a>\n\n## 3.1.3 (2017-08-21)\n\n<a name=\"3.1.2\"></a>\n\n## 3.1.2 (2017-08-07)\n\n<a name=\"3.1.1\"></a>\n\n## 3.1.1 (2017-08-07)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- **prompt-cli:** add standalone prompt interface ([7911040](https://github.com/conventional-changelog/commitlint/commit/7911040))\n\n<a name=\"3.1.3\"></a>\n\n## 3.1.3 (2017-08-21)\n\n<a name=\"3.1.2\"></a>\n\n## 3.1.2 (2017-08-07)\n\n<a name=\"3.1.1\"></a>\n\n## 3.1.1 (2017-08-07)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- **prompt-cli:** add standalone prompt interface ([7911040](https://github.com/conventional-changelog/commitlint/commit/7911040))\n\n<a name=\"3.1.2\"></a>\n\n## 3.1.2 (2017-08-07)\n\n<a name=\"3.1.1\"></a>\n\n## 3.1.1 (2017-08-07)\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- **prompt-cli:** add standalone prompt interface ([7911040](https://github.com/conventional-changelog/commitlint/commit/7911040))\n\n<a name=\"3.0.4\"></a>\n\n## 3.0.4 (2017-08-04)\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- **prompt-cli:** add standalone prompt interface ([7911040](https://github.com/conventional-changelog/commitlint/commit/7911040))\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- **prompt-cli:** add standalone prompt interface ([7911040](https://github.com/conventional-changelog/commitlint/commit/7911040))\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Features\n\n- **prompt-cli:** add standalone prompt interface ([7911040](https://github.com/conventional-changelog/commitlint/commit/7911040))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n### Features\n\n- **prompt-cli:** add standalone prompt interface ([7911040](https://github.com/conventional-changelog/commitlint/commit/7911040))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Features\n\n- **prompt-cli:** add standalone prompt interface ([b0239d2](https://github.com/conventional-changelog/commitlint/commit/b0239d2))\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Features\n\n- **prompt-cli:** add standalone prompt interface ([b0239d2](https://github.com/conventional-changelog/commitlint/commit/b0239d2))\n"
  },
  {
    "path": "@commitlint/prompt-cli/README.md",
    "content": "# @commitlint/prompt-cli\n\ncommit prompt using commitlint.config.js\n\n## Getting started\n\n```sh\nnpm install -g @commitlint/prompt-cli @commitlint/config-angular\necho \"export default {extends: ['@commitlint/config-angular']};\" > commitlint.config.js\n```\n\n```sh\ngit add .\ncommit\n```\n\nA full usage guide is available at [docs/prompt](https://commitlint.js.org/guides/use-prompt).\n"
  },
  {
    "path": "@commitlint/prompt-cli/cli.js",
    "content": "#!/usr/bin/env node\nimport { prompter } from \"@commitlint/prompt\";\nimport inquirer from \"inquirer\";\nimport { x } from \"tinyexec\";\n\nmain().catch((err) => {\n\tsetTimeout(() => {\n\t\tthrow err;\n\t});\n});\n\nfunction main() {\n\treturn isStageEmpty()\n\t\t.then((empty) => {\n\t\t\tif (empty) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Nothing to commit. Stage your changes via \"git add\" execute \"commit\" again`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t})\n\t\t.then(() => prompter(inquirer, commit));\n}\n\nfunction isStageEmpty() {\n\treturn x(\"git\", [\"diff\", \"--cached\"]).then((r) => r.stdout === \"\");\n}\n\nfunction commit(message) {\n\tconst result = x(\"git\", [\"commit\", \"-m\", message]);\n\tresult.process.stdout.pipe(process.stdout);\n\tresult.process.stderr.pipe(process.stderr);\n}\n"
  },
  {
    "path": "@commitlint/prompt-cli/cli.test.js",
    "content": "import { test, expect } from \"vitest\";\nimport { createRequire } from \"node:module\";\nimport { git } from \"@commitlint/test\";\nimport { x } from \"tinyexec\";\n\nconst require = createRequire(import.meta.url);\n\nconst bin = require.resolve(\"./cli.js\");\n\nconst cli = (args, options) => {\n\treturn (input = \"\") => {\n\t\tconst result = x(bin, args, {\n\t\t\tnodeOptions: {\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tenv: options.env,\n\t\t\t},\n\t\t});\n\n\t\tresult.process.stdin.write(input);\n\t\tresult.process.stdin.end();\n\n\t\treturn result;\n\t};\n};\n\ntest(\"should print warning if stage is empty\", async () => {\n\tconst cwd = await git.bootstrap();\n\tconst actual = await cli([], { cwd })(\"foo: bar\");\n\texpect(actual.stdout).toContain(\"Nothing to commit.\");\n\texpect(actual.stderr).toBe(\"\");\n}, 10000);\n"
  },
  {
    "path": "@commitlint/prompt-cli/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/prompt-cli/package.json",
    "content": "{\n  \"name\": \"@commitlint/prompt-cli\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"commit prompt using commitlint.config.js\",\n  \"main\": \"cli.js\",\n  \"files\": [\n    \"cli.js\"\n  ],\n  \"bin\": {\n    \"commit\": \"./cli.js\"\n  },\n  \"scripts\": {\n    \"commit\": \"$npm_package_bin_commit\",\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-main\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/prompt-cli\"\n  },\n  \"keywords\": [\n    \"commitlint\",\n    \"prompt\"\n  ],\n  \"author\": \"Mario Nebl <hello@herebecode.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"dependencies\": {\n    \"@commitlint/prompt\": \"^20.5.0\",\n    \"inquirer\": \"^9.2.15\",\n    \"tinyexec\": \"^1.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/read/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n\n### Bug Fixes\n\n* **read:** update git-raw-commits to v5 API ([#4638](https://github.com/conventional-changelog/commitlint/issues/4638)) ([bd6ab41](https://github.com/conventional-changelog/commitlint/commit/bd6ab41740210215d92bc10fa93184325bc970a6))\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n\n### Bug Fixes\n\n* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299))\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n\n### Features\n\n* support linting from the last tag ([#4110](https://github.com/conventional-changelog/commitlint/issues/4110)) ([4b204ec](https://github.com/conventional-changelog/commitlint/commit/4b204ecfb43dd6a00e24b51111aadbd78f9d58e1))\n\n\n\n\n\n## [19.2.1](https://github.com/conventional-changelog/commitlint/compare/v19.2.0...v19.2.1) (2024-03-19)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n\n### Features\n\n* **cli:** introduce new --last flag, to stop recommending HEAD~1 ([#3916](https://github.com/conventional-changelog/commitlint/issues/3916)) ([99f4f3f](https://github.com/conventional-changelog/commitlint/commit/99f4f3f4839190a2758083df7ba20b988e7b68a6))\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n\n### Bug Fixes\n\n* **read:** remove fs-extra usage and use fs/promises ([#3803](https://github.com/conventional-changelog/commitlint/issues/3803)) ([714be66](https://github.com/conventional-changelog/commitlint/commit/714be668c104c554c66e866e53addd04944544f6))\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n## [17.5.1](https://github.com/conventional-changelog/commitlint/compare/v17.5.0...v17.5.1) (2023-03-28)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/read\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n\n### Bug Fixes\n\n* update dependency @types/fs-extra to v11 ([#3494](https://github.com/conventional-changelog/commitlint/issues/3494)) ([8f553c7](https://github.com/conventional-changelog/commitlint/commit/8f553c7603e3ee0f435d878e396eec899a213de8))\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n### Bug Fixes\n\n- update dependency fs-extra to v11 ([#3460](https://github.com/conventional-changelog/commitlint/issues/3460)) ([a437923](https://github.com/conventional-changelog/commitlint/commit/a43792388e0d9707da770b26592c5e31553384a1))\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n### Features\n\n- **commitlint:** add additional git log args ([#3334](https://github.com/conventional-changelog/commitlint/issues/3334)) ([229c65b](https://github.com/conventional-changelog/commitlint/commit/229c65b60f15c15da5f5b11deb555d1f557c673a))\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n### Bug Fixes\n\n- update dependency fs-extra to v10 ([#2575](https://github.com/conventional-changelog/commitlint/issues/2575)) ([d47d2b5](https://github.com/conventional-changelog/commitlint/commit/d47d2b595b980adadd4fb8ff198c1914caeff18f))\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/read\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/read\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n### Bug Fixes\n\n- update dependency @types/fs-extra to ^9.0.1 ([#2088](https://github.com/conventional-changelog/commitlint/issues/2088)) ([cb1028e](https://github.com/conventional-changelog/commitlint/commit/cb1028ef2700d86991c69a1e2ad391bc1bdc9d90))\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency fs-extra to v9 ([#1018](https://github.com/conventional-changelog/commitlint/issues/1018)) ([2df49fa](https://github.com/conventional-changelog/commitlint/commit/2df49fac907993ae78199a1012e918b0e2ff5621))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/read\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/read\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/read\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/read\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n### Bug Fixes\n\n- use sander.readFile correctly ([#448](https://github.com/conventional-changelog/commitlint/issues/448)) ([#630](https://github.com/conventional-changelog/commitlint/issues/630)) ([8e47985](https://github.com/conventional-changelog/commitlint/commit/8e47985))\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n- resolve path to commit message for git submodules ([83b1a47](https://github.com/conventional-changelog/commitlint/commit/83b1a47))\n\n### Features\n\n- add support for git submodules ([cc575fa](https://github.com/conventional-changelog/commitlint/commit/cc575fa))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/read\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/read\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/read\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/read\n"
  },
  {
    "path": "@commitlint/read/README.md",
    "content": "# @commitlint/read\n\nRead commit messages from a specified range or last edit\n\n## Getting started\n\n```shell\nnpm install --save @commitlint/read\n```\n\n## Documentation\n\nConsult [API docs](https://commitlint.js.org/api/read) for comprehensive documentation.\n\nDocumentation generated from [`docs` folder](../../docs/api/read.md).\n"
  },
  {
    "path": "@commitlint/read/fixtures/basic/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\tbasic: true\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/empty-file/commitlint.config.js",
    "content": ""
  },
  {
    "path": "@commitlint/read/fixtures/empty-object-file/commitlint.config.js",
    "content": "module.exports = {};\n"
  },
  {
    "path": "@commitlint/read/fixtures/extends-empty/commitlint.config.js",
    "content": "module.exports = {\n\textends: []\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/extends-invalid/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['____foooooo']\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/outer-scope/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\touter: true,\n\t\tinner: false,\n\t\tchild: false\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/outer-scope/inner-scope/child-scope/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\touter: false,\n\t\tinner: false,\n\t\tchild: true\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/overridden-type-enums/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./extended'],\n\trules: {\n\t\t'type-enum': [2, 'always', ['a', 'b', 'c', 'd']]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/overridden-type-enums/extended.js",
    "content": "module.exports = {\n\trules: {\n\t\t'type-enum': [\n\t\t\t2,\n\t\t\t'always',\n\t\t\t[\n\t\t\t\t'build',\n\t\t\t\t'ci',\n\t\t\t\t'docs',\n\t\t\t\t'feat',\n\t\t\t\t'fix',\n\t\t\t\t'perf',\n\t\t\t\t'refactor',\n\t\t\t\t'revert',\n\t\t\t\t'style',\n\t\t\t\t'test'\n\t\t\t]\n\t\t]\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/package.json",
    "content": "{\n  \"type\": \"commonjs\"\n}\n"
  },
  {
    "path": "@commitlint/read/fixtures/parser-preset/commitlint.config.js",
    "content": "module.exports = {\n\tparserOpts: {\n\t\tparserPreset: './conventional-changelog-custom'\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/parser-preset/conventional-changelog-custom.js",
    "content": "module.exports = Promise.resolve().then(() => ({\n\tparserOpts: {\n\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/\n\t}\n}));\n"
  },
  {
    "path": "@commitlint/read/fixtures/parser-preset-override/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./extended'],\n\tparserPreset: './custom'\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/parser-preset-override/custom.js",
    "content": "module.exports = {\n\tparserOpts: {\n\t\theaderPattern: /.*/\n\t},\n\tb: 'b'\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/parser-preset-override/extended/custom.js",
    "content": "module.exports = Promise.resolve({\n\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/,\n\ta: 'a'\n});\n"
  },
  {
    "path": "@commitlint/read/fixtures/parser-preset-override/extended/index.js",
    "content": "module.exports = {\n\tparserPreset: './custom'\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: 0\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends/first-extended/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./second-extended'],\n\trules: {\n\t\tone: 1\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends/first-extended/index.js",
    "content": "module.exports = require('./commitlint.config.js');\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\trules: {\n\t\ttwo: 2\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-js/.commitlintrc.js",
    "content": "module.exports = {\n\textends: ['./first-extended'],\n\trules: {\n\t\tzero: 0\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-js/first-extended/index.js",
    "content": "module.exports = {\n\textends: ['./second-extended'],\n\trules: {\n\t\tone: 1\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-js/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\trules: {\n\t\ttwo: 2\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-json/.commitlintrc.json",
    "content": "{\n  \"extends\": [\"./first-extended\"],\n  \"rules\": {\n    \"zero\": 0\n  }\n}\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-json/first-extended/index.js",
    "content": "module.exports = {\n\textends: ['./second-extended'],\n\trules: {\n\t\tone: 1\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-json/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\trules: {\n\t\ttwo: 2\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-package/first-extended/index.js",
    "content": "module.exports = {\n\textends: ['./second-extended'],\n\trules: {\n\t\tone: 1\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-package/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\trules: {\n\t\ttwo: 2\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-package/package.json",
    "content": "{\n  \"commitlint\": {\n    \"extends\": [\n      \"./first-extended\"\n    ],\n    \"rules\": {\n      \"zero\": 0\n    }\n  }\n}\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-yaml/.commitlintrc.yml",
    "content": "extends:\n  - './first-extended'\nrules:\n  zero: 0\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-yaml/first-extended/index.js",
    "content": "module.exports = {\n\textends: ['./second-extended'],\n\trules: {\n\t\tone: 1\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-extends-yaml/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\trules: {\n\t\ttwo: 2\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-parser-preset/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./first-extended']\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-parser-preset/first-extended/index.js",
    "content": "module.exports = {\n\textends: ['./second-extended']\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-parser-preset/first-extended/second-extended/conventional-changelog-custom.js",
    "content": "module.exports = Promise.resolve().then(() => {\n\treturn {\n\t\tparserOpts: {\n\t\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?-(.*)$/\n\t\t}\n\t};\n});\n"
  },
  {
    "path": "@commitlint/read/fixtures/recursive-parser-preset/first-extended/second-extended/index.js",
    "content": "module.exports = {\n\tparserPreset: './conventional-changelog-custom'\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/specify-config-file/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\tfoo: 'hello',\n\t\tbar: 'world'\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/specify-config-file/config/commitlint.config.js",
    "content": "module.exports = {\n\trules: {\n\t\tfoo: 'bar'\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/trash-extend/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['./one'],\n\tzero: '0',\n\trules: {\n\t\tzero: 0\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/trash-extend/one.js",
    "content": "module.exports = {\n\tone: 1,\n\trules: {\n\t\tone: 1\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/fixtures/trash-file/commitlint.config.js",
    "content": "module.exports = {\n\tfoo: 'bar',\n\tbaz: 'bar',\n\trules: {\n\t\tfoo: 'bar',\n\t\tbaz: 'bar'\n\t}\n};\n"
  },
  {
    "path": "@commitlint/read/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/read/package.json",
    "content": "{\n  \"name\": \"@commitlint/read\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Read commit messages from a specified range or last edit\",\n  \"main\": \"lib/read.js\",\n  \"types\": \"lib/read.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-import\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/read\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/git-raw-commits\": \"^5.0.0\",\n    \"@types/minimist\": \"^1.2.4\"\n  },\n  \"dependencies\": {\n    \"@commitlint/top-level\": \"^20.4.3\",\n    \"@commitlint/types\": \"^20.5.0\",\n    \"git-raw-commits\": \"^5.0.0\",\n    \"minimist\": \"^1.2.8\",\n    \"tinyexec\": \"^1.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/read/src/get-edit-commit.ts",
    "content": "import toplevel from \"@commitlint/top-level\";\nimport fs from \"fs/promises\";\n\nimport { getEditFilePath } from \"./get-edit-file-path.js\";\n\n// Get recently edited commit message\nexport async function getEditCommit(\n\tcwd?: string,\n\tedit?: boolean | string,\n): Promise<string[]> {\n\tconst top = await toplevel(cwd);\n\n\tif (typeof top !== \"string\") {\n\t\tthrow new TypeError(`Could not find git root from ${cwd}`);\n\t}\n\n\tconst editFilePath = await getEditFilePath(top, edit);\n\tconst editFile: Buffer = await fs.readFile(editFilePath);\n\n\treturn [`${editFile.toString(\"utf-8\")}\\n`];\n}\n"
  },
  {
    "path": "@commitlint/read/src/get-edit-file-path.ts",
    "content": "import path from \"node:path\";\nimport { Stats } from \"node:fs\";\nimport fs from \"fs/promises\";\n\n// Get path to recently edited commit message file\nexport async function getEditFilePath(\n\ttop: string,\n\tedit?: boolean | string,\n): Promise<string> {\n\tif (typeof edit === \"string\") {\n\t\treturn path.resolve(top, edit);\n\t}\n\n\tconst dotgitPath = path.join(top, \".git\");\n\tconst dotgitStats: Stats = await fs.lstat(dotgitPath);\n\n\tif (dotgitStats.isDirectory()) {\n\t\treturn path.join(top, \".git/COMMIT_EDITMSG\");\n\t}\n\n\tconst gitFile: string = await fs.readFile(dotgitPath, {\n\t\tencoding: \"utf-8\",\n\t});\n\tconst relativeGitPath = gitFile.replace(\"gitdir: \", \"\").replace(\"\\n\", \"\");\n\treturn path.resolve(top, relativeGitPath, \"COMMIT_EDITMSG\");\n}\n"
  },
  {
    "path": "@commitlint/read/src/get-history-commits.ts",
    "content": "import type { GitOptions } from \"git-raw-commits\";\nimport { getRawCommits } from \"git-raw-commits\";\n\n// Get commit messages from history\nexport async function getHistoryCommits(\n\toptions: GitOptions,\n\topts: { cwd?: string } = {},\n): Promise<string[]> {\n\t// Note: git-raw-commits v5 drops support for arbitrary git log arguments.\n\t// We extract and handle 'skip' manually here to preserve backward compatibility.\n\t// Other arbitrary arguments passed via gitLogArgs may be silently ignored by v5.\n\tconst { skip: skipRaw, ...gitOptions } = options as GitOptions & {\n\t\tskip?: unknown;\n\t};\n\n\tlet skipNum = 0;\n\tif (skipRaw !== undefined) {\n\t\tskipNum = Number(skipRaw);\n\t\tif (!Number.isInteger(skipNum) || skipNum < 0) {\n\t\t\tthrow new TypeError(`Invalid skip value: ${skipRaw}`);\n\t\t}\n\t}\n\n\tconst data: string[] = [];\n\tfor await (const commit of getRawCommits({ ...gitOptions, cwd: opts.cwd })) {\n\t\tif (skipNum > 0) {\n\t\t\tskipNum--;\n\t\t\tcontinue;\n\t\t}\n\t\tdata.push(commit);\n\t}\n\treturn data;\n}\n"
  },
  {
    "path": "@commitlint/read/src/read.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport fs from \"fs/promises\";\nimport path from \"node:path\";\nimport { git } from \"@commitlint/test\";\nimport { x } from \"tinyexec\";\n\nimport read from \"./read.js\";\n\ntest(\"get edit commit message specified by the `edit` flag\", async () => {\n\tconst cwd: string = await git.bootstrap();\n\n\tawait fs.writeFile(path.join(cwd, \"commit-msg-file\"), \"foo\");\n\n\tconst expected = [\"foo\\n\"];\n\tconst actual = await read({ edit: \"commit-msg-file\", cwd });\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"get edit commit message from git root\", async () => {\n\tconst cwd: string = await git.bootstrap();\n\n\tawait fs.writeFile(path.join(cwd, \"alpha.txt\"), \"alpha\");\n\tawait x(\"git\", [\"add\", \".\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", \"alpha\"], { nodeOptions: { cwd } });\n\tconst expected = [\"alpha\\n\\n\"];\n\tconst actual = await read({ edit: true, cwd });\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"get history commit messages\", async () => {\n\tconst cwd: string = await git.bootstrap();\n\tawait fs.writeFile(path.join(cwd, \"alpha.txt\"), \"alpha\");\n\tawait x(\"git\", [\"add\", \"alpha.txt\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", \"alpha\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"rm\", \"alpha.txt\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", \"remove alpha\"], { nodeOptions: { cwd } });\n\n\tconst expected = [\"remove alpha\\n\\n\", \"alpha\\n\\n\"];\n\tconst actual = await read({ cwd });\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"get edit commit message from git subdirectory\", async () => {\n\tconst cwd: string = await git.bootstrap();\n\tawait fs.mkdir(path.join(cwd, \"beta\"));\n\tawait fs.writeFile(path.join(cwd, \"beta/beta.txt\"), \"beta\");\n\n\tawait x(\"git\", [\"add\", \".\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", \"beta\"], { nodeOptions: { cwd } });\n\n\tconst expected = [\"beta\\n\\n\"];\n\tconst actual = await read({ edit: true, cwd });\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"get edit commit message while skipping first commit\", async () => {\n\tconst cwd: string = await git.bootstrap();\n\tawait fs.mkdir(path.join(cwd, \"beta\"));\n\tawait fs.writeFile(path.join(cwd, \"beta/beta.txt\"), \"beta\");\n\n\tawait fs.writeFile(path.join(cwd, \"alpha.txt\"), \"alpha\");\n\tawait x(\"git\", [\"add\", \"alpha.txt\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", \"alpha\"], { nodeOptions: { cwd } });\n\tawait fs.writeFile(path.join(cwd, \"beta.txt\"), \"beta\");\n\tawait x(\"git\", [\"add\", \"beta.txt\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", \"beta\"], { nodeOptions: { cwd } });\n\tawait fs.writeFile(path.join(cwd, \"gamma.txt\"), \"gamma\");\n\tawait x(\"git\", [\"add\", \"gamma.txt\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"-m\", \"gamma\"], { nodeOptions: { cwd } });\n\n\tconst expected = [\"beta\\n\\n\"];\n\tconst actual = await read({ from: \"HEAD~2\", cwd, gitLogArgs: \"--skip 1\" });\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"should only read the last commit\", async () => {\n\tconst cwd: string = await git.bootstrap();\n\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit Z\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit Y\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit X\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\n\tconst result = await read({ cwd, last: true });\n\n\texpect(result).toEqual([\"commit X\"]);\n});\n\ntest(\"should read commits from the last annotated tag\", async () => {\n\tconst cwd: string = await git.bootstrap();\n\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"chore: release v1.0.0\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tawait x(\"git\", [\"tag\", \"v1.0.0\", \"--annotate\", \"-m\", \"v1.0.0\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit 1\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit 2\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\n\tconst result = await read({ cwd, fromLastTag: true });\n\n\texpect(result).toEqual([\"commit 2\\n\\n\", \"commit 1\\n\\n\"]);\n});\n\ntest(\"should read commits from the last lightweight tag\", async () => {\n\tconst cwd: string = await git.bootstrap();\n\n\tawait x(\n\t\t\"git\",\n\t\t[\"commit\", \"--allow-empty\", \"-m\", \"chore: release v9.9.9-alpha.1\"],\n\t\t{ nodeOptions: { cwd } },\n\t);\n\tawait x(\"git\", [\"tag\", \"v9.9.9-alpha.1\"], { nodeOptions: { cwd } });\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit A\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit B\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\n\tconst result = await read({ cwd, fromLastTag: true });\n\n\texpect(result).toEqual([\"commit B\\n\\n\", \"commit A\\n\\n\"]);\n});\n\ntest(\"should not read any commits when there are no tags\", async () => {\n\tconst cwd: string = await git.bootstrap();\n\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit 7\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit 8\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\tawait x(\"git\", [\"commit\", \"--allow-empty\", \"-m\", \"commit 9\"], {\n\t\tnodeOptions: { cwd },\n\t});\n\n\tconst result = await read({ cwd, fromLastTag: true });\n\n\texpect(result).toHaveLength(0);\n});\n"
  },
  {
    "path": "@commitlint/read/src/read.ts",
    "content": "import minimist from \"minimist\";\nimport type { GitOptions } from \"git-raw-commits\";\n\nimport { getHistoryCommits } from \"./get-history-commits.js\";\nimport { getEditCommit } from \"./get-edit-commit.js\";\n\nimport { x } from \"tinyexec\";\n\ninterface GetCommitMessageOptions {\n\tcwd?: string;\n\tfrom?: string;\n\tfromLastTag?: boolean;\n\tto?: string;\n\tlast?: boolean;\n\tedit?: boolean | string;\n\tgitLogArgs?: string;\n}\n\n// Get commit messages\nexport default async function getCommitMessages(\n\tsettings: GetCommitMessageOptions,\n): Promise<string[]> {\n\tconst { cwd, fromLastTag, to, last, edit, gitLogArgs } = settings;\n\tlet from = settings.from;\n\n\tif (edit) {\n\t\treturn getEditCommit(cwd, edit);\n\t}\n\n\tif (last) {\n\t\tconst gitCommandResult = await x(\n\t\t\t\"git\",\n\t\t\t[\"log\", \"-1\", \"--pretty=format:%B\"],\n\t\t\t{ nodeOptions: { cwd } },\n\t\t);\n\t\tlet output = gitCommandResult.stdout.trim();\n\t\t// strip output of extra quotation marks (\"\")\n\t\tif (output[0] == '\"' && output[output.length - 1] == '\"')\n\t\t\toutput = output.slice(1, -1);\n\t\treturn [output];\n\t}\n\n\tif (!from && fromLastTag) {\n\t\tconst output = await x(\n\t\t\t\"git\",\n\t\t\t[\n\t\t\t\t\"describe\",\n\t\t\t\t\"--abbrev=40\",\n\t\t\t\t\"--always\",\n\t\t\t\t\"--first-parent\",\n\t\t\t\t\"--long\",\n\t\t\t\t\"--tags\",\n\t\t\t],\n\t\t\t{ nodeOptions: { cwd } },\n\t\t);\n\t\tconst stdout = output.stdout.trim();\n\n\t\tif (stdout.length === 40) {\n\t\t\t// Hash only means no last tag. Use that as the from ref which\n\t\t\t// results in a no-op.\n\t\t\tfrom = stdout;\n\t\t} else {\n\t\t\t// Description will be in the format: <tag>-<count>-g<hash>\n\t\t\t// Example: v3.2.0-11-g9057371a52adaae5180d93fe4d0bb808d874b9fb\n\t\t\t// Minus zero based (1), dash (1), \"g\" prefix (1), hash (40) = -43\n\t\t\tconst tagSlice = stdout.lastIndexOf(\"-\", stdout.length - 43);\n\n\t\t\tfrom = stdout.slice(0, tagSlice);\n\t\t}\n\t}\n\n\tlet gitOptions: GitOptions = { from, to };\n\tif (gitLogArgs) {\n\t\tgitOptions = {\n\t\t\t...minimist(gitLogArgs.split(\" \")),\n\t\t\tfrom,\n\t\t\tto,\n\t\t};\n\t}\n\n\treturn getHistoryCommits(gitOptions, { cwd });\n}\n"
  },
  {
    "path": "@commitlint/read/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../top-level\" }]\n}\n"
  },
  {
    "path": "@commitlint/resolve-extends/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n\n### Bug Fixes\n\n* **resolve-extends:** always resolve extended parser presets for proper merging ([#4647](https://github.com/conventional-changelog/commitlint/issues/4647)) ([e9ef76c](https://github.com/conventional-changelog/commitlint/commit/e9ef76caf44e77f22086910ce706bbe0c03b0ab5)), closes [#4640](https://github.com/conventional-changelog/commitlint/issues/4640)\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n\n### Bug Fixes\n\n* npx usage [#613](https://github.com/conventional-changelog/commitlint/issues/613) ([#4630](https://github.com/conventional-changelog/commitlint/issues/4630)) ([1644f1e](https://github.com/conventional-changelog/commitlint/commit/1644f1e8f74a844547e44e3e7a76fabbb96775f8)), closes [#3](https://github.com/conventional-changelog/commitlint/issues/3) [#1](https://github.com/conventional-changelog/commitlint/issues/1) [#2](https://github.com/conventional-changelog/commitlint/issues/2) [#4](https://github.com/conventional-changelog/commitlint/issues/4) [#5](https://github.com/conventional-changelog/commitlint/issues/5) [#7](https://github.com/conventional-changelog/commitlint/issues/7) [#6](https://github.com/conventional-changelog/commitlint/issues/6)\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n\n### Bug Fixes\n\n* **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))\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add missing `conditions` param for `moduleResolve` ([#3962](https://github.com/conventional-changelog/commitlint/issues/3962)) ([67baff9](https://github.com/conventional-changelog/commitlint/commit/67baff9182854bbe184b6cf71f977920a05c27a3))\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n\n### Bug Fixes\n\n* fallback to `resolve-from` for Yarn P'n'P ([#3941](https://github.com/conventional-changelog/commitlint/issues/3941)) ([1eb9b5f](https://github.com/conventional-changelog/commitlint/commit/1eb9b5f29979d35f5840141523850a7402633378)), closes [#3936](https://github.com/conventional-changelog/commitlint/issues/3936)\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n\n### Bug Fixes\n\n* drop `resolve-from`, `resolve-global` and `import-fresh`, resolve global packages correctly ([#3939](https://github.com/conventional-changelog/commitlint/issues/3939)) ([8793c63](https://github.com/conventional-changelog/commitlint/commit/8793c639c083c33714da0a29429b338776813d0c)), closes [#3938](https://github.com/conventional-changelog/commitlint/issues/3938)\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n### Features\n\n- config validation ([#2412](https://github.com/conventional-changelog/commitlint/issues/2412)) ([c717202](https://github.com/conventional-changelog/commitlint/commit/c7172022097b11f46b33617e4a94d751243c1049)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n### Features\n\n- simplify config resolution ([#2398](https://github.com/conventional-changelog/commitlint/issues/2398)) ([8a8384f](https://github.com/conventional-changelog/commitlint/commit/8a8384f3c18954447cb633e76a573e1db71a1440)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n### Features\n\n- extend helpUrl from shareable config ([#2846](https://github.com/conventional-changelog/commitlint/issues/2846)) ([d7e2e2b](https://github.com/conventional-changelog/commitlint/commit/d7e2e2b943be383f99f4000b6b6bed0eab03bfcf))\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- **resolve-extends:** `extends` field should be resolved from left to right ([#2070](https://github.com/conventional-changelog/commitlint/issues/2070)) ([c0a86f5](https://github.com/conventional-changelog/commitlint/commit/c0a86f5b5ed6ef071acef4baf38e7fc549fbec37))\n\n### BREAKING CHANGES\n\n- **resolve-extends:** The order of the `extends` resolution is changed from right-to-left to left-to-right\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n\n### Features\n\n- add possibility to extend from string ([#865](https://github.com/conventional-changelog/commitlint/issues/865)) ([056c6fe](https://github.com/conventional-changelog/commitlint/commit/056c6fef346b4e84f8b1f93038a9461a7cbd9beb))\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n### Bug Fixes\n\n- **resolve-extends:** move node types to dev dependencies ([#883](https://github.com/conventional-changelog/commitlint/issues/883)) ([b131a18](https://github.com/conventional-changelog/commitlint/commit/b131a18)), closes [#874](https://github.com/conventional-changelog/commitlint/issues/874)\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n### Features\n\n- **resolve-extends:** accept absolute path in extends ([#825](https://github.com/conventional-changelog/commitlint/issues/825)) ([ecac29f](https://github.com/conventional-changelog/commitlint/commit/ecac29f))\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n### Features\n\n- **resolve-extends:** accept short scoped package names in extends ([#597](https://github.com/conventional-changelog/commitlint/issues/597)) ([ba90e8e](https://github.com/conventional-changelog/commitlint/commit/ba90e8e))\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- **resolve-extends:** override array on extending rules ([#470](https://github.com/conventional-changelog/commitlint/issues/470)) ([#539](https://github.com/conventional-changelog/commitlint/issues/539)) ([b35000c](https://github.com/conventional-changelog/commitlint/commit/b35000c))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace old require-uncached with import-fresh ([#533](https://github.com/conventional-changelog/commitlint/issues/533)) ([b636e8c](https://github.com/conventional-changelog/commitlint/commit/b636e8c))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/resolve-extends\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n### Bug Fixes\n\n- correctly resolve parserOpts [#115](https://github.com/conventional-changelog/commitlint/issues/115) [#95](https://github.com/conventional-changelog/commitlint/issues/95) ([1353dd5](https://github.com/conventional-changelog/commitlint/commit/1353dd5))\n"
  },
  {
    "path": "@commitlint/resolve-extends/fixtures/global-install/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['@commitlint/config-angular']\n};\n"
  },
  {
    "path": "@commitlint/resolve-extends/fixtures/missing-install/commitlint.config.js",
    "content": "module.exports = {\n\textends: ['@commitlint/config-angular']\n};\n"
  },
  {
    "path": "@commitlint/resolve-extends/fixtures/package.json",
    "content": "{\n  \"type\": \"commonjs\"\n}\n"
  },
  {
    "path": "@commitlint/resolve-extends/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/resolve-extends/package.json",
    "content": "{\n  \"name\": \"@commitlint/resolve-extends\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/resolve-extends\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/lodash.mergewith\": \"^4.6.8\"\n  },\n  \"dependencies\": {\n    \"@commitlint/config-validator\": \"^20.5.0\",\n    \"@commitlint/types\": \"^20.5.0\",\n    \"global-directory\": \"^5.0.0\",\n    \"import-meta-resolve\": \"^4.0.0\",\n    \"lodash.mergewith\": \"^4.6.2\",\n    \"resolve-from\": \"^5.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/resolve-extends/src/index.test.ts",
    "content": "import { test, expect, vi } from \"vitest\";\nimport { createRequire } from \"node:module\";\nimport { RuleConfigSeverity, UserConfig } from \"@commitlint/types\";\n\nimport resolveExtends, { ResolveExtendsContext } from \"./index.js\";\n\nconst require = createRequire(import.meta.url);\n\nconst id = (id: unknown) => id;\n\ntest(\"returns empty object when called without params\", async () => {\n\tconst actual = await resolveExtends();\n\texpect(actual).toEqual({});\n});\n\ntest(\"returns an equivalent object as passed in\", async () => {\n\tconst expected = { foo: \"bar\" };\n\tconst actual = await resolveExtends(expected);\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"falls back to global install\", async () => {\n\tconst resolveGlobal = vi.fn(() => \"@commitlint/foo-bar\");\n\tconst dynamicImport = vi.fn(() => ({}));\n\n\tconst ctx = { resolveGlobal, dynamicImport } as ResolveExtendsContext;\n\n\tresolveExtends({ extends: [\"@commitlint/foo-bar\"] }, ctx);\n\texpect(ctx.resolveGlobal).toHaveBeenCalledWith(\"@commitlint/foo-bar\");\n});\n\ntest(\"fails for missing extends\", async () => {\n\tawait expect(() =>\n\t\tresolveExtends({ extends: [\"@commitlint/foo-bar\"] }),\n\t).rejects.toThrow(/Cannot find module \"@commitlint\\/foo-bar\" from/);\n});\n\ntest(\"resolves extends for single config\", async () => {\n\tconst input = { extends: \"extender-name\" };\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(() => ({})),\n\t} as ResolveExtendsContext;\n\tawait resolveExtends(input, ctx);\n\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\"extender-name\");\n});\n\ntest(\"uses empty prefix by default\", async () => {\n\tconst input = { extends: [\"extender-name\"] };\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(() => ({})),\n\t} as ResolveExtendsContext;\n\tawait resolveExtends(input, ctx);\n\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\"extender-name\");\n});\n\ntest(\"uses prefix as configured\", async () => {\n\tconst input = { extends: [\"extender-name\"] };\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(() => ({})),\n\t} as ResolveExtendsContext;\n\n\tawait resolveExtends(input, {\n\t\t...ctx,\n\t\tprefix: \"prefix\",\n\t});\n\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\"prefix-extender-name\");\n});\n\ntest(\"ignores prefix for scoped extends\", async () => {\n\tconst input = { extends: [\"@scope/extender-name\"] };\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(() => ({})),\n\t} as ResolveExtendsContext;\n\n\tawait resolveExtends(input, {\n\t\t...ctx,\n\t\tprefix: \"prefix\",\n\t});\n\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\"@scope/extender-name\");\n});\n\ntest(\"adds prefix as suffix for scopes only\", async () => {\n\tconst input = { extends: [\"@scope\"] };\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(() => ({})),\n\t} as ResolveExtendsContext;\n\n\tawait resolveExtends(input, {\n\t\t...ctx,\n\t\tprefix: \"prefix\",\n\t});\n\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\"@scope/prefix\");\n});\n\ntest(\"ignores prefix for relative extends\", async () => {\n\tconst input = { extends: [\"./extender\"] };\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(() => ({})),\n\t} as ResolveExtendsContext;\n\n\tawait resolveExtends(input, {\n\t\t...ctx,\n\t\tprefix: \"prefix\",\n\t});\n\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\"./extender\");\n});\n\ntest(\"ignores prefix for absolute extends\", async () => {\n\tconst absolutePath = require.resolve(\"@commitlint/config-angular\");\n\tconst input = { extends: [absolutePath] };\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(() => ({})),\n\t} as ResolveExtendsContext;\n\n\tawait resolveExtends(input, {\n\t\t...ctx,\n\t\tprefix: \"prefix\",\n\t});\n\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(absolutePath);\n});\n\ntest(\"propagates return value of require function\", async () => {\n\tconst input = { extends: [\"extender-name\"] };\n\tconst propagated = { foo: \"bar\" };\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(() => propagated),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\texpect(actual).toEqual(expect.objectContaining(propagated));\n});\n\ntest(\"resolves extends recursively\", async () => {\n\tconst input = { extends: [\"extender-name\"] };\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-name\":\n\t\t\t\treturn { extends: [\"recursive-extender-name\"] };\n\t\t\tcase \"recursive-extender-name\":\n\t\t\t\treturn { foo: \"bar\" };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\tawait resolveExtends(input, ctx);\n\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\"extender-name\");\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\"recursive-extender-name\");\n});\n\ntest(\"uses prefix key recursively\", async () => {\n\tconst input = { extends: [\"extender-name\"] };\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"prefix-extender-name\":\n\t\t\t\treturn { extends: [\"recursive-extender-name\"] };\n\t\t\tcase \"prefix-recursive-extender-name\":\n\t\t\t\treturn { foo: \"bar\" };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tawait resolveExtends(input, {\n\t\t...ctx,\n\t\tprefix: \"prefix\",\n\t});\n\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\"prefix-extender-name\");\n\texpect(ctx.dynamicImport).toHaveBeenCalledWith(\n\t\t\"prefix-recursive-extender-name\",\n\t);\n});\n\ntest(\"propagates contents recursively\", async () => {\n\tconst input = { extends: [\"extender-name\"] };\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-name\":\n\t\t\t\treturn { extends: [\"recursive-extender-name\"], foo: \"bar\" };\n\t\t\tcase \"recursive-extender-name\":\n\t\t\t\treturn { baz: \"bar\" };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\tconst expected = {\n\t\textends: [\"extender-name\"],\n\t\tfoo: \"bar\",\n\t\tbaz: \"bar\",\n\t};\n\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"propagates contents recursively with overlap\", async () => {\n\tconst input: UserConfig = { extends: [\"extender-name\"] };\n\n\tconst dynamicImport = (id: string): UserConfig => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-name\":\n\t\t\t\treturn {\n\t\t\t\t\textends: [\"recursive-extender-name\"],\n\t\t\t\t\trules: { rule: [RuleConfigSeverity.Warning, \"always\"] },\n\t\t\t\t};\n\t\t\tcase \"recursive-extender-name\":\n\t\t\t\treturn { rules: { rule: [RuleConfigSeverity.Error, \"never\", \"four\"] } };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\tconst expected: UserConfig = {\n\t\textends: [\"extender-name\"],\n\t\trules: {\n\t\t\trule: [RuleConfigSeverity.Warning, \"always\"],\n\t\t},\n\t};\n\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"extends rules from left to right with overlap\", async () => {\n\tconst input: UserConfig = { extends: [\"left\", \"right\"] };\n\n\tconst dynamicImport = (id: string): UserConfig => {\n\t\tswitch (id) {\n\t\t\tcase \"left\":\n\t\t\t\treturn { rules: { a: [RuleConfigSeverity.Disabled, \"never\", true] } };\n\t\t\tcase \"right\":\n\t\t\t\treturn {\n\t\t\t\t\trules: {\n\t\t\t\t\t\ta: [RuleConfigSeverity.Disabled, \"never\", false],\n\t\t\t\t\t\tb: [RuleConfigSeverity.Disabled, \"never\", true],\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\tconst expected: UserConfig = {\n\t\textends: [\"left\", \"right\"],\n\t\trules: {\n\t\t\ta: [RuleConfigSeverity.Disabled, \"never\", false],\n\t\t\tb: [RuleConfigSeverity.Disabled, \"never\", true],\n\t\t},\n\t};\n\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"extending contents should take precedence\", async () => {\n\tconst input = { extends: [\"extender-name\"], zero: \"root\" };\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-name\":\n\t\t\t\treturn { extends: [\"recursive-extender-name\"], zero: id, one: id };\n\t\t\tcase \"recursive-extender-name\":\n\t\t\t\treturn {\n\t\t\t\t\textends: [\"second-recursive-extender-name\"],\n\t\t\t\t\tzero: id,\n\t\t\t\t\tone: id,\n\t\t\t\t\ttwo: id,\n\t\t\t\t};\n\t\t\tcase \"second-recursive-extender-name\":\n\t\t\t\treturn { zero: id, one: id, two: id, three: id };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\tconst expected = {\n\t\textends: [\"extender-name\"],\n\t\tzero: \"root\",\n\t\tone: \"extender-name\",\n\t\ttwo: \"recursive-extender-name\",\n\t\tthree: \"second-recursive-extender-name\",\n\t};\n\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"should fall back to conventional-changelog-lint-config prefix\", async () => {\n\tconst input = { extends: [\"extender-name\"] };\n\n\tconst resolve = (id: string) => {\n\t\tif (id === \"conventional-changelog-lint-config-extender-name\") {\n\t\t\treturn \"conventional-changelog-lint-config-extender-name\";\n\t\t}\n\t\tthrow new Error(`Could not find module \"*${id}\"`);\n\t};\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"conventional-changelog-lint-config-extender-name\":\n\t\t\t\treturn { rules: { fallback: true } };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: vi.fn(resolve),\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, {\n\t\t...ctx,\n\t\tprefix: \"prefix\",\n\t});\n\n\texpect(actual).toEqual({\n\t\textends: [\"extender-name\"],\n\t\trules: {\n\t\t\tfallback: true,\n\t\t},\n\t});\n});\n\ntest(\"plugins should be merged correctly\", async () => {\n\tconst input = { extends: [\"extender-name\"], zero: \"root\" };\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-name\":\n\t\t\t\treturn { extends: [\"recursive-extender-name\"], plugins: [\"test\"] };\n\t\t\tcase \"recursive-extender-name\":\n\t\t\t\treturn {\n\t\t\t\t\textends: [\"second-recursive-extender-name\"],\n\t\t\t\t\tplugins: [\"test2\"],\n\t\t\t\t};\n\t\t\tcase \"second-recursive-extender-name\":\n\t\t\t\treturn { plugins: [\"test3\"] };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\tconst expected = {\n\t\textends: [\"extender-name\"],\n\t\tplugins: [\"test3\", \"test2\", \"test\"],\n\t\tzero: \"root\",\n\t};\n\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"rules should be merged correctly\", async () => {\n\tconst input: UserConfig = {\n\t\textends: [\"extender-name\"],\n\t\trules: { test1: [RuleConfigSeverity.Warning, \"never\", \"base\"] },\n\t};\n\n\tconst dynamicImport = (id: string): UserConfig => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-name\":\n\t\t\t\treturn {\n\t\t\t\t\textends: [\"recursive-extender-name\"],\n\t\t\t\t\trules: { test2: [RuleConfigSeverity.Error, \"never\", id] },\n\t\t\t\t};\n\t\t\tcase \"recursive-extender-name\":\n\t\t\t\treturn {\n\t\t\t\t\textends: [\"second-recursive-extender-name\"],\n\t\t\t\t\trules: { test1: [RuleConfigSeverity.Disabled, \"never\", id] },\n\t\t\t\t};\n\t\t\tcase \"second-recursive-extender-name\":\n\t\t\t\treturn { rules: { test2: [RuleConfigSeverity.Warning, \"never\", id] } };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\tconst expected: UserConfig = {\n\t\textends: [\"extender-name\"],\n\t\trules: {\n\t\t\ttest1: [RuleConfigSeverity.Warning, \"never\", \"base\"],\n\t\t\ttest2: [RuleConfigSeverity.Error, \"never\", \"extender-name\"],\n\t\t},\n\t};\n\n\texpect(actual).toEqual(expected);\n});\n\n// https://github.com/conventional-changelog/commitlint/issues/327\ntest(\"parserPreset should resolve correctly in extended configuration\", async () => {\n\tconst input = { extends: [\"extender-name\"], zero: \"root\" };\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-name\":\n\t\t\t\treturn {\n\t\t\t\t\textends: [\"recursive-extender-name\"],\n\t\t\t\t\tparserPreset: {\n\t\t\t\t\t\tparserOpts: {\n\t\t\t\t\t\t\tissuePrefixes: [\"#\", \"!\", \"&\", \"no-references\"],\n\t\t\t\t\t\t\treferenceActions: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\tcase \"recursive-extender-name\":\n\t\t\t\treturn { parserPreset: { parserOpts: { issuePrefixes: [\"#\", \"!\"] } } };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\tconst expected = {\n\t\textends: [\"extender-name\"],\n\t\tparserPreset: {\n\t\t\tparserOpts: {\n\t\t\t\tissuePrefixes: [\"#\", \"!\", \"&\", \"no-references\"],\n\t\t\t\treferenceActions: null,\n\t\t\t},\n\t\t},\n\t\tzero: \"root\",\n\t};\n\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"parserPreset should be merged correctly\", async () => {\n\tconst input = { extends: [\"extender-name\"], zero: \"root\" };\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-name\":\n\t\t\t\treturn {\n\t\t\t\t\textends: [\"recursive-extender-name\"],\n\t\t\t\t\tparserPreset: {\n\t\t\t\t\t\tparserOpts: {\n\t\t\t\t\t\t\treferenceActions: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\tcase \"recursive-extender-name\":\n\t\t\t\treturn { parserPreset: { parserOpts: { issuePrefixes: [\"#\", \"!\"] } } };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\tconst expected = {\n\t\textends: [\"extender-name\"],\n\t\tparserPreset: {\n\t\t\tparserOpts: {\n\t\t\t\tissuePrefixes: [\"#\", \"!\"],\n\t\t\t\treferenceActions: null,\n\t\t\t},\n\t\t},\n\t\tzero: \"root\",\n\t};\n\n\texpect(actual).toEqual(expected);\n});\n\n// https://github.com/conventional-changelog/commitlint/issues/4640\n// Verifies that mergeWith deep-merges parserPreset objects so that a\n// user's partial override (issuePrefixes) coexists with the extended\n// config's properties (headerPattern, headerCorrespondence).\n// The full string-to-object resolution path is covered by the\n// integration test in @commitlint/load (\"partial user parserPreset\n// merges with extended string parserPreset\").\ntest(\"user partial parserPreset should merge with extended parserPreset\", async () => {\n\tconst input = {\n\t\textends: [\"extender-name\"],\n\t\tparserPreset: {\n\t\t\tparserOpts: {\n\t\t\t\tissuePrefixes: [\"PROJ-\"],\n\t\t\t},\n\t\t},\n\t};\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-name\":\n\t\t\t\treturn {\n\t\t\t\t\tparserPreset: {\n\t\t\t\t\t\tparserOpts: {\n\t\t\t\t\t\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?!?: (.*)$/,\n\t\t\t\t\t\t\theaderCorrespondence: [\"type\", \"scope\", \"subject\"],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\texpect(actual.parserPreset).toEqual({\n\t\tparserOpts: {\n\t\t\theaderPattern: /^(\\w*)(?:\\((.*)\\))?!?: (.*)$/,\n\t\t\theaderCorrespondence: [\"type\", \"scope\", \"subject\"],\n\t\t\tissuePrefixes: [\"PROJ-\"],\n\t\t},\n\t});\n});\n\ntest(\"should correctly merge nested configs\", async () => {\n\tconst input = { extends: [\"extender-1\"] };\n\n\tconst dynamicImport = (id: string) => {\n\t\tswitch (id) {\n\t\t\tcase \"extender-1\":\n\t\t\t\treturn { extends: [\"extender-3\", \"extender-2\"] };\n\t\t\tcase \"extender-2\":\n\t\t\t\treturn { extends: [\"extender-4\"] };\n\t\t\tcase \"extender-3\":\n\t\t\t\treturn { rules: { test: [RuleConfigSeverity.Warning, \"never\", 3] } };\n\t\t\tcase \"extender-4\":\n\t\t\t\treturn {\n\t\t\t\t\textends: [\"extender-5\", \"extender-6\"],\n\t\t\t\t\trules: { test: [RuleConfigSeverity.Warning, \"never\", 4] },\n\t\t\t\t};\n\t\t\tcase \"extender-5\":\n\t\t\t\treturn { rules: { test: [RuleConfigSeverity.Warning, \"never\", 5] } };\n\t\t\tcase \"extender-6\":\n\t\t\t\treturn { rules: { test: [RuleConfigSeverity.Warning, \"never\", 6] } };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t};\n\n\tconst ctx = {\n\t\tresolve: id,\n\t\tdynamicImport: vi.fn(dynamicImport),\n\t} as ResolveExtendsContext;\n\n\tconst actual = await resolveExtends(input, ctx);\n\n\tconst expected = {\n\t\textends: [\"extender-1\"],\n\t\trules: {\n\t\t\ttest: [RuleConfigSeverity.Warning, \"never\", 4],\n\t\t},\n\t};\n\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/resolve-extends/src/index.ts",
    "content": "import { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { pathToFileURL, fileURLToPath } from \"node:url\";\n\nimport globalDirectory from \"global-directory\";\nimport { moduleResolve } from \"import-meta-resolve\";\nimport mergeWith from \"lodash.mergewith\";\nimport resolveFrom_ from \"resolve-from\";\nimport { validateConfig } from \"@commitlint/config-validator\";\nimport type { ParserPreset, UserConfig } from \"@commitlint/types\";\n\nconst require = createRequire(import.meta.url);\n\nconst dynamicImport = async <T>(id: string): Promise<T> => {\n\tif (id.endsWith(\".json\")) {\n\t\treturn require(id);\n\t}\n\n\tconst imported = await import(\n\t\tpath.isAbsolute(id) ? pathToFileURL(id).toString() : id\n\t);\n\treturn (\"default\" in imported && imported.default) || imported;\n};\n\nconst pathSuffixes = [\n\t\"\",\n\t\".js\",\n\t\".json\",\n\t`${path.sep}index.js`,\n\t`${path.sep}index.json`,\n];\n\nconst specifierSuffixes = [\"\", \".js\", \".json\", \"/index.js\", \"/index.json\"];\n\nconst conditions = new Set([\"import\", \"node\"]);\n\n/**\n * @see moduleResolve\n */\nexport const resolveFrom = (lookup: string, parent?: string): string => {\n\tif (path.isAbsolute(lookup)) {\n\t\tfor (const suffix of pathSuffixes) {\n\t\t\tconst filename = lookup + suffix;\n\t\t\tif (fs.existsSync(filename)) {\n\t\t\t\treturn filename;\n\t\t\t}\n\t\t}\n\t}\n\n\tlet resolveError: Error | undefined;\n\n\tconst base = pathToFileURL(\n\t\tparent\n\t\t\t? fs.statSync(parent).isDirectory()\n\t\t\t\t? path.join(parent, \"noop.js\")\n\t\t\t\t: parent\n\t\t\t: import.meta.url,\n\t);\n\n\tfor (const suffix of specifierSuffixes) {\n\t\ttry {\n\t\t\treturn fileURLToPath(moduleResolve(lookup + suffix, base, conditions));\n\t\t} catch (err) {\n\t\t\tif (!resolveError) {\n\t\t\t\tresolveError = err as Error;\n\t\t\t}\n\t\t}\n\t}\n\n\ttry {\n\t\t/**\n\t\t * Yarn P'n'P does not support pure ESM well, this is only a workaround for\n\t\t * @see https://github.com/conventional-changelog/commitlint/issues/3936\n\t\t */\n\t\treturn resolveFrom_(path.dirname(fileURLToPath(base)), lookup);\n\t} catch {\n\t\tthrow resolveError;\n\t}\n};\n\n/**\n *\n * @param resolvedParserPreset path resolved by {@link resolveFrom}\n * @returns path and parserOpts function retrieved from `resolvedParserPreset`\n */\nexport const loadParserPreset = async (\n\tresolvedParserPreset: string,\n): Promise<Pick<ParserPreset, \"path\" | \"parserOpts\">> => {\n\tconst finalParserOpts = await dynamicImport(resolvedParserPreset);\n\n\tconst relativeParserPath = path.relative(process.cwd(), resolvedParserPreset);\n\n\treturn {\n\t\tpath: `./${relativeParserPath}`.split(path.sep).join(\"/\"),\n\t\tparserOpts: finalParserOpts,\n\t};\n};\n\nexport interface ResolveExtendsContext {\n\tcwd?: string;\n\tparserPreset?: string | ParserPreset;\n\tprefix?: string;\n\tresolve?(id: string, ctx?: { prefix?: string; cwd?: string }): string;\n\tresolveGlobal?: (id: string) => string;\n\tdynamicImport?<T>(id: string): T | Promise<T>;\n}\n\nexport default async function resolveExtends(\n\tconfig: UserConfig = {},\n\tcontext: ResolveExtendsContext = {},\n): Promise<UserConfig> {\n\tconst { extends: e } = config;\n\tconst extended = await loadExtends(config, context);\n\textended.push(config);\n\treturn extended.reduce(\n\t\t(r, { extends: _, ...c }) =>\n\t\t\tmergeWith(r, c, (objValue, srcValue, key) => {\n\t\t\t\tif (key === \"plugins\") {\n\t\t\t\t\tif (Array.isArray(objValue)) {\n\t\t\t\t\t\treturn objValue.concat(srcValue);\n\t\t\t\t\t}\n\t\t\t\t} else if (Array.isArray(objValue)) {\n\t\t\t\t\treturn srcValue;\n\t\t\t\t}\n\t\t\t}),\n\t\te ? { extends: e } : {},\n\t);\n}\n\nasync function loadExtends(\n\tconfig: UserConfig = {},\n\tcontext: ResolveExtendsContext = {},\n): Promise<UserConfig[]> {\n\tconst { extends: e } = config;\n\tconst ext = e ? (Array.isArray(e) ? e : [e]) : [];\n\n\treturn await ext.reduce(async (configs, raw) => {\n\t\tconst resolved = resolveConfig(raw, context);\n\n\t\t// Shallow-copy so we never mutate an ESM namespace object (#4647).\n\t\tconst c = {\n\t\t\t...(await (context.dynamicImport || dynamicImport)<{\n\t\t\t\tparserPreset?: string | ParserPreset;\n\t\t\t}>(resolved)),\n\t\t};\n\t\tconst cwd = path.dirname(resolved);\n\t\tconst ctx = { ...context, cwd };\n\n\t\t// Always resolve string parser presets from extended configs so that\n\t\t// their parserOpts (headerPattern, etc.) are available for merging.\n\t\t// Previously this was skipped when the user provided any parserPreset,\n\t\t// which caused partial user overrides (e.g. just issuePrefixes) to\n\t\t// lose the extended preset's headerPattern (see #4640).\n\t\tif (typeof c === \"object\" && typeof c.parserPreset === \"string\") {\n\t\t\tconst resolvedParserPreset = resolveFrom(c.parserPreset, cwd);\n\n\t\t\tconst parserPreset: ParserPreset = {\n\t\t\t\tname: c.parserPreset,\n\t\t\t\t...(await loadParserPreset(resolvedParserPreset)),\n\t\t\t};\n\n\t\t\tctx.parserPreset = parserPreset;\n\t\t\tc.parserPreset = parserPreset;\n\t\t}\n\n\t\tvalidateConfig(resolved, config);\n\n\t\treturn [...(await configs), ...(await loadExtends(c, ctx)), c];\n\t}, Promise.resolve<UserConfig[]>([]));\n}\n\nfunction getId(raw: string = \"\", prefix: string = \"\"): string {\n\tconst first = raw.charAt(0);\n\tconst scoped = first === \"@\";\n\tconst relative = first === \".\";\n\tconst absolute = path.isAbsolute(raw);\n\n\tif (scoped) {\n\t\treturn raw.includes(\"/\") ? raw : [raw, prefix].filter(String).join(\"/\");\n\t}\n\n\treturn relative || absolute ? raw : [prefix, raw].filter(String).join(\"-\");\n}\n\nfunction resolveConfig(\n\traw: string,\n\tcontext: ResolveExtendsContext = {},\n): string {\n\tconst resolve = context.resolve || resolveId;\n\tconst id = getId(raw, context.prefix);\n\n\tlet resolved: string;\n\ttry {\n\t\tresolved = resolve(id, context);\n\t} catch (err) {\n\t\tconst legacy = getId(raw, \"conventional-changelog-lint-config\");\n\t\tresolved = resolve(legacy, context);\n\t\tconsole.warn(\n\t\t\t`Resolving ${raw} to legacy config ${legacy}. To silence this warning raise an issue at 'npm repo ${legacy}' to rename to ${id}.`,\n\t\t);\n\t}\n\n\treturn resolved;\n}\n\nfunction resolveId(\n\tspecifier: string,\n\tcontext: ResolveExtendsContext = {},\n): string {\n\tconst cwd = context.cwd || process.cwd();\n\tconst localPath = resolveFromSilent(specifier, cwd);\n\n\tif (typeof localPath === \"string\") {\n\t\treturn localPath;\n\t}\n\n\tconst resolveGlobal = context.resolveGlobal || resolveGlobalSilent;\n\tconst globalPath = resolveGlobal(specifier);\n\n\tif (typeof globalPath === \"string\") {\n\t\treturn globalPath;\n\t}\n\n\tconst err = new Error(`Cannot find module \"${specifier}\" from \"${cwd}\"`);\n\tthrow Object.assign(err, { code: \"MODULE_NOT_FOUND\" });\n}\n\nexport function resolveFromSilent(\n\tspecifier: string,\n\tparent: string,\n): string | undefined {\n\ttry {\n\t\treturn resolveFrom(specifier, parent);\n\t} catch {}\n}\n\n/**\n * Get the npm cache directory.\n * Respects npm config (npm_config_cache env var or npm config get cache).\n */\nfunction getNpmCacheDir(): string {\n\tif (process.env.npm_config_cache) {\n\t\treturn process.env.npm_config_cache;\n\t}\n\n\ttry {\n\t\tconst { execSync } = require(\"child_process\");\n\t\tconst cacheDir = execSync(\"npm config get cache\", {\n\t\t\tencoding: \"utf8\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"ignore\"],\n\t\t}).trim();\n\t\tif (cacheDir) {\n\t\t\treturn cacheDir;\n\t\t}\n\t} catch {\n\t\t// Ignore errors\n\t}\n\n\tconst home = os.homedir();\n\treturn path.join(home, \".npm\");\n}\n\nlet npxCachePathsCache: string[] | undefined;\n\n/**\n * Get the npx cache directory paths.\n * npx stores packages in a subdirectory of the npm cache (e.g., ~/.npm/_npx).\n * Results are memoized and sorted by mtime (most recent first) for deterministic resolution.\n */\nfunction getNpxCachePaths(): string[] {\n\tif (npxCachePathsCache) {\n\t\treturn npxCachePathsCache;\n\t}\n\n\tconst npmCache = getNpmCacheDir();\n\tconst npxPath = path.join(npmCache, \"_npx\");\n\n\tif (!fs.existsSync(npxPath)) {\n\t\tnpxCachePathsCache = [];\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst entries = fs.readdirSync(npxPath, { withFileTypes: true });\n\t\tconst dirs = entries\n\t\t\t.filter((entry) => entry.isDirectory())\n\t\t\t.map((entry) => ({\n\t\t\t\tpath: path.join(npxPath, entry.name, \"node_modules\"),\n\t\t\t\tmtime: fs.statSync(path.join(npxPath, entry.name)).mtime,\n\t\t\t}))\n\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\tnpxCachePathsCache = dirs.map((d) => d.path);\n\t} catch (err) {\n\t\tif (process.env.DEBUG === \"true\") {\n\t\t\tconsole.debug(`Failed to read npx cache: ${(err as Error).message}`);\n\t\t}\n\t\tnpxCachePathsCache = [];\n\t}\n\n\treturn npxCachePathsCache;\n}\n\n/**\n * Resolve a module specifier from npx cache directories.\n * Iterates all npx cache directories and returns the first successful resolution.\n * Uses require.resolve for proper Node module resolution (respects package.json main/exports).\n */\nexport function resolveFromNpxCache(specifier: string): string | undefined {\n\tfor (const npxDir of getNpxCachePaths()) {\n\t\ttry {\n\t\t\treturn require.resolve(specifier, { paths: [npxDir] });\n\t\t} catch (err) {\n\t\t\tif (process.env.DEBUG === \"true\") {\n\t\t\t\tconsole.debug(\n\t\t\t\t\t`Failed to resolve ${specifier} from ${npxDir}: ${(err as Error).message}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * @see https://github.com/sindresorhus/resolve-global/blob/682a6bb0bd8192b74a6294219bb4c536b3708b65/index.js#L7\n */\nexport function resolveGlobalSilent(specifier: string): string | undefined {\n\tfor (const globalPackages of [\n\t\tglobalDirectory.npm.packages,\n\t\tglobalDirectory.yarn.packages,\n\t]) {\n\t\ttry {\n\t\t\treturn resolveFrom(specifier, globalPackages);\n\t\t} catch (err) {\n\t\t\tif (process.env.DEBUG === \"true\") {\n\t\t\t\tconsole.debug(\n\t\t\t\t\t`Failed to resolve ${specifier} from global: ${(err as Error).message}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check npx cache directories\n\treturn resolveFromNpxCache(specifier);\n}\n"
  },
  {
    "path": "@commitlint/resolve-extends/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"isolatedModules\": false,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../types\" }, { \"path\": \"../config-validator\" }]\n}\n"
  },
  {
    "path": "@commitlint/rules/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n\n### Bug Fixes\n\n* footer parser does not escape special chars for regex [#4560](https://github.com/conventional-changelog/commitlint/issues/4560) ([#4634](https://github.com/conventional-changelog/commitlint/issues/4634)) ([8ff7c7f](https://github.com/conventional-changelog/commitlint/commit/8ff7c7fcbc2db2b45910ecb5c01e9f1763060770))\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n\n### Bug Fixes\n\n* **rules:** ignore cherry-picks in signed-off-by ([#4625](https://github.com/conventional-changelog/commitlint/issues/4625)) ([691a52d](https://github.com/conventional-changelog/commitlint/commit/691a52d4b0ba2ad8cd5a33f7fa35a901ca861009))\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n\n### Reverts\n\n* replace all lodash string methods with kasi [#4602](https://github.com/conventional-changelog/commitlint/issues/4602) ([#4621](https://github.com/conventional-changelog/commitlint/issues/4621)) ([5326ab9](https://github.com/conventional-changelog/commitlint/commit/5326ab98a7c68f2f67c46c253f10c087d4570ddd)), closes [#4620](https://github.com/conventional-changelog/commitlint/issues/4620) [#4620](https://github.com/conventional-changelog/commitlint/issues/4620)\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n\n### Features\n\n* upgrade conventional commit packages [#4082](https://github.com/conventional-changelog/commitlint/issues/4082) ([#4597](https://github.com/conventional-changelog/commitlint/issues/4597)) ([3aaf0a6](https://github.com/conventional-changelog/commitlint/commit/3aaf0a603c4047d268d85207957c919f45b60e1f))\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n\n### Features\n\n* **rules:** add scope-delimiter-style ([#4580](https://github.com/conventional-changelog/commitlint/issues/4580)) ([fc4849a](https://github.com/conventional-changelog/commitlint/commit/fc4849a4b91f52821d23ad58ed0363369df56aa5))\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n\n### Bug Fixes\n\n* update dependency glob to v11 [security] ([#4561](https://github.com/conventional-changelog/commitlint/issues/4561)) ([a89a08b](https://github.com/conventional-changelog/commitlint/commit/a89a08b2fd3c72a6cd09e00508fc2e972f27c64c))\n\n\n### Features\n\n* **rules:** add breaking-change-exclamation-mark ([#4548](https://github.com/conventional-changelog/commitlint/issues/4548)) ([c4d419b](https://github.com/conventional-changelog/commitlint/commit/c4d419bc76aab72092f1ebd7c0922729a576b7a5)), closes [#4547](https://github.com/conventional-changelog/commitlint/issues/4547)\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n\n* 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)\n\n\n### BREAKING CHANGES\n\n* when lines contain URLs exceeding the maximum\nline length `body-max-line-length` will be ignored\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n\n### Performance Improvements\n\n* **rules:** optimize header-trim ([#4363](https://github.com/conventional-changelog/commitlint/issues/4363)) ([b7e404b](https://github.com/conventional-changelog/commitlint/commit/b7e404bc036dbd3cbdffa38e85c833d10e52d68b))\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n\n### Features\n\n* support using delimiter in `scope-enum` ([#4161](https://github.com/conventional-changelog/commitlint/issues/4161)) ([f55521d](https://github.com/conventional-changelog/commitlint/commit/f55521dbb8ce0530ecb9557122689bba740fb2a5))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n\n### Bug Fixes\n\n* **rules:** handle blank commit message in signed-off-by check ([#4124](https://github.com/conventional-changelog/commitlint/issues/4124)) ([7ab4bab](https://github.com/conventional-changelog/commitlint/commit/7ab4bab31f4b19ddedd850e435398037437007b6))\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n\n### Features\n\n* **rules:** add header-trim rule ([#3199](https://github.com/conventional-changelog/commitlint/issues/3199)) ([#3871](https://github.com/conventional-changelog/commitlint/issues/3871)) ([331579a](https://github.com/conventional-changelog/commitlint/commit/331579a8796af901b5e5103c44fedf1cb3a2f661))\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n\n### Bug Fixes\n\n* subject-full-stop false positive when using ellipsis ([#3839](https://github.com/conventional-changelog/commitlint/issues/3839)) ([b4246d6](https://github.com/conventional-changelog/commitlint/commit/b4246d6428399177d43296dc8bec6714e664d037))\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n\n### Features\n\n* [scope-enum] [scope-case] allow space after comma as scope delimiter ([#3577](https://github.com/conventional-changelog/commitlint/issues/3577)) ([13c4bfc](https://github.com/conventional-changelog/commitlint/commit/13c4bfc637dd6c66477fa1c8da821ed46af28c44)), closes [#3576](https://github.com/conventional-changelog/commitlint/issues/3576)\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n\n### Bug Fixes\n\n* **rules:** avoid processing strings with case-less Letter category symbols in `subject-case` ([#3586](https://github.com/conventional-changelog/commitlint/issues/3586)) ([70a4450](https://github.com/conventional-changelog/commitlint/commit/70a44501ac8459f0c1d2b200608b024585964637)), closes [#3585](https://github.com/conventional-changelog/commitlint/issues/3585)\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n\n### Features\n\n* **rules:** expand Latin-only characters limitation for `subject-case` with Unicode support ([#3575](https://github.com/conventional-changelog/commitlint/issues/3575)) ([5f83423](https://github.com/conventional-changelog/commitlint/commit/5f8342355a856e5be7b8a7b851e1519d62678465))\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n\n### Bug Fixes\n\n* subject-full-stop rule bugfix ([#3531](https://github.com/conventional-changelog/commitlint/issues/3531)) ([5d3d529](https://github.com/conventional-changelog/commitlint/commit/5d3d529a6a57baee1bfdaaf3f0c503dee009e152))\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/rules\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n### Bug Fixes\n\n- **rules:** footer-leading-blank should work with body comments ([#3139](https://github.com/conventional-changelog/commitlint/issues/3139)) ([7dd88c9](https://github.com/conventional-changelog/commitlint/commit/7dd88c913cba9f444acc587c77210cb718c928c9))\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n### Features\n\n- **rules:** allow body-case to accept an array of cases ([5383c9e](https://github.com/conventional-changelog/commitlint/commit/5383c9edcd9a351ea1c33ed49f47afed9b1cde6b)), closes [#2631](https://github.com/conventional-changelog/commitlint/issues/2631)\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n### Features\n\n- add subject-exclamation-mark rule to improve error messages ([#2593](https://github.com/conventional-changelog/commitlint/issues/2593)) ([be701bd](https://github.com/conventional-changelog/commitlint/commit/be701bdb1de4e667b7a872767244285c4fa4fda4))\n- **rules:** add `trailer-exists` rule ([#2578](https://github.com/conventional-changelog/commitlint/issues/2578)) ([cd3816d](https://github.com/conventional-changelog/commitlint/commit/cd3816d553762eae99e088689395c55afce0c6cc))\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/rules\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/rules\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/rules\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Features\n\n- **rules:** add body-full-stop rule ([#2144](https://github.com/conventional-changelog/commitlint/issues/2144)) ([7767ca2](https://github.com/conventional-changelog/commitlint/commit/7767ca2591d10207c4abe7f3e5e6de503ac12a25))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n### Bug Fixes\n\n- **rules:** ignore comments in `signed-off-by` ([#2098](https://github.com/conventional-changelog/commitlint/issues/2098)) ([b610bcd](https://github.com/conventional-changelog/commitlint/commit/b610bcd15215cc5f14fb6de07914ed595cc3047b))\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/rules\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Features\n\n- enable multiple scopes in scope-enum and scope-case rules ([#901](https://github.com/conventional-changelog/commitlint/issues/901)) ([73632ce](https://github.com/conventional-changelog/commitlint/commit/73632cec299d5c3a980d07037c08633c843a8555))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n\n### Features\n\n- add async promise based rules methods into lint ([#976](https://github.com/conventional-changelog/commitlint/issues/976)) ([4443062](https://github.com/conventional-changelog/commitlint/commit/444306249b8a3d04524538f61edca8f6cc10d75f))\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/rules\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/rules\n\n## [7.5.2](https://github.com/conventional-changelog/commitlint/compare/v7.5.1...v7.5.2) (2019-02-11)\n\n### Bug Fixes\n\n- failing sentence-case for subjects with slashes ([#574](https://github.com/conventional-changelog/commitlint/issues/574)) ([48a8602](https://github.com/conventional-changelog/commitlint/commit/48a8602))\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n### Features\n\n- **rule-header-length:** show current header length ([6d61c4f](https://github.com/conventional-changelog/commitlint/commit/6d61c4f))\n\n<a name=\"7.4.0\"></a>\n\n# [7.4.0](https://github.com/conventional-changelog/commitlint/compare/v7.3.2...v7.4.0) (2019-01-27)\n\n### Features\n\n- **rules:** create header-case and header-full-stop rules ([#547](https://github.com/conventional-changelog/commitlint/issues/547)) ([4c36cbd](https://github.com/conventional-changelog/commitlint/commit/4c36cbd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/rules\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n- use correct label for failing empty subjects ([#481](https://github.com/conventional-changelog/commitlint/issues/481)) ([2e7e34d](https://github.com/conventional-changelog/commitlint/commit/2e7e34d)), closes [#476](https://github.com/conventional-changelog/commitlint/issues/476)\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n### Bug Fixes\n\n- **rules:** include possible body offset in footer leading blank ([ff0111a](https://github.com/conventional-changelog/commitlint/commit/ff0111a))\n- handle case rules for numerics correctly ([cadcfed](https://github.com/conventional-changelog/commitlint/commit/cadcfed))\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/rules\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n### Features\n\n- add max line length to body/footer ([542f50e](https://github.com/conventional-changelog/commitlint/commit/542f50e))\n\n<a name=\"6.2.0\"></a>\n\n# [6.2.0](https://github.com/conventional-changelog/commitlint/compare/v6.1.3...v6.2.0) (2018-05-01)\n\n### Features\n\n- **rules:** support array for scope-case and type-case ([#312](https://github.com/conventional-changelog/commitlint/issues/312)) ([1f46b9f](https://github.com/conventional-changelog/commitlint/commit/1f46b9f)), closes [#307](https://github.com/conventional-changelog/commitlint/issues/307)\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/rules\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/rules\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/rules\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/rules\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n### Bug Fixes\n\n- remove typo in error message of type-case ([cb577cb](https://github.com/conventional-changelog/commitlint/commit/cb577cb))\n\n<a name=\"6.0.1\"></a>\n\n## [6.0.1](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.1) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/rules\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/rules\n"
  },
  {
    "path": "@commitlint/rules/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/rules/package.json",
    "content": "{\n  \"name\": \"@commitlint/rules\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/rules\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/parse\": \"^20.5.0\",\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/conventional-commits-parser\": \"^5.0.2\",\n    \"conventional-changelog-angular\": \"^8.2.0\",\n    \"conventional-commits-parser\": \"^6.3.0\",\n    \"glob\": \"^11.0.0\"\n  },\n  \"dependencies\": {\n    \"@commitlint/ensure\": \"^20.5.0\",\n    \"@commitlint/message\": \"^20.4.3\",\n    \"@commitlint/to-lines\": \"^20.0.0\",\n    \"@commitlint/types\": \"^20.5.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/rules/src/body-case.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { bodyCase } from \"./body-case.js\";\n\nconst messages = {\n\tempty: \"test: subject\",\n\tlowercase: \"test: subject\\nbody\",\n\tmixedcase: \"test: subject\\nBody\",\n\tuppercase: \"test: subject\\nBODY\",\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tlowercase: parse(messages.lowercase),\n\tmixedcase: parse(messages.mixedcase),\n\tuppercase: parse(messages.uppercase),\n};\n\ntest('with empty body should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.empty, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty body should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.empty, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty body should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.empty, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty body should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.empty, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase body should fail for \"never lowercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.lowercase, \"never\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase body should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.lowercase, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase body should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.mixedcase, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase body should fail for \"always lowercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.mixedcase, \"always\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase body should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.mixedcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase body should fail for \"always uppercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.mixedcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase body should fail for \"never uppercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.uppercase, \"never\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase body should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = bodyCase(await parsed.uppercase, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/body-case.ts",
    "content": "import { case as ensureCase } from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { TargetCaseType, SyncRule } from \"@commitlint/types\";\n\nconst negated = (when?: string) => when === \"never\";\n\nexport const bodyCase: SyncRule<TargetCaseType | TargetCaseType[]> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = [],\n) => {\n\tconst { body } = parsed;\n\n\tif (!body) {\n\t\treturn [true];\n\t}\n\n\tconst checks = (Array.isArray(value) ? value : [value]).map((check) => {\n\t\tif (typeof check === \"string\") {\n\t\t\treturn {\n\t\t\t\twhen: \"always\",\n\t\t\t\tcase: check,\n\t\t\t};\n\t\t}\n\t\treturn check;\n\t});\n\n\tconst result = checks.some((check) => {\n\t\tconst r = ensureCase(body, check.case);\n\t\treturn negated(check.when) ? !r : r;\n\t});\n\n\tconst list = checks.map((c) => c.case).join(\", \");\n\n\treturn [\n\t\tnegated(when) ? !result : result,\n\t\tmessage([`body must`, negated(when) ? `not` : null, `be ${list}`]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/body-empty.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { bodyEmpty } from \"./body-empty.js\";\n\nconst messages = {\n\tempty: \"test: subject\",\n\tfilled: \"test: subject\\nbody\",\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tfilled: parse(messages.filled),\n};\n\ntest(\"with empty body should succeed for empty keyword\", async () => {\n\tconst [actual] = bodyEmpty(await parsed.empty);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty body should fail for \"never\"', async () => {\n\tconst [actual] = bodyEmpty(await parsed.empty, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty body should succeed for \"always\"', async () => {\n\tconst [actual] = bodyEmpty(await parsed.empty, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with body should fail for empty keyword\", async () => {\n\tconst [actual] = bodyEmpty(await parsed.filled);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with body should succeed for \"never\"', async () => {\n\tconst [actual] = bodyEmpty(await parsed.filled, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with body should fail for \"always\"', async () => {\n\tconst [actual] = bodyEmpty(await parsed.filled, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/body-empty.ts",
    "content": "import * as ensure from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const bodyEmpty: SyncRule = (parsed, when = \"always\") => {\n\tconst negated = when === \"never\";\n\tconst notEmpty = ensure.notEmpty(parsed.body || \"\");\n\n\treturn [\n\t\tnegated ? notEmpty : !notEmpty,\n\t\tmessage([\"body\", negated ? \"may not\" : \"must\", \"be empty\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/body-full-stop.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { bodyFullStop } from \"./body-full-stop.js\";\n\nconst messages = {\n\tempty: \"test:\\n\",\n\twith: `test: subject\\n\\nbody.`,\n\twithout: `test: subject\\n\\nbody`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\twith: parse(messages.with),\n\twithout: parse(messages.without),\n};\n\ntest('empty against \"always\" should succeed', async () => {\n\tconst [actual] = bodyFullStop(await parsed.empty, \"always\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty against \"never .\" should succeed', async () => {\n\tconst [actual] = bodyFullStop(await parsed.empty, \"never\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"always .\" should succeed', async () => {\n\tconst [actual] = bodyFullStop(await parsed.with, \"always\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"never .\" should fail', async () => {\n\tconst [actual] = bodyFullStop(await parsed.with, \"never\", \".\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"always .\" should fail', async () => {\n\tconst [actual] = bodyFullStop(await parsed.without, \"always\", \".\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"never .\" should succeed', async () => {\n\tconst [actual] = bodyFullStop(await parsed.without, \"never\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/body-full-stop.ts",
    "content": "import message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const bodyFullStop: SyncRule<string> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = \".\",\n) => {\n\tconst input = parsed.body;\n\n\tif (!input) {\n\t\treturn [true];\n\t}\n\n\tconst negated = when === \"never\";\n\tconst hasStop = input[input.length - 1] === value;\n\n\treturn [\n\t\tnegated ? !hasStop : hasStop,\n\t\tmessage([\"body\", negated ? \"may not\" : \"must\", \"end with full stop\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/body-leading-blank.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { bodyLeadingBlank } from \"./body-leading-blank.js\";\n\nconst messages = {\n\tsimple: \"test: subject\",\n\twithout: \"test: subject\\nbody\",\n\twith: \"test: subject\\n\\nbody\",\n};\n\nconst parsed = {\n\tsimple: parse(messages.simple),\n\twithout: parse(messages.without),\n\twith: parse(messages.with),\n};\n\ntest(\"with simple message should succeed for empty keyword\", async () => {\n\tconst [actual] = bodyLeadingBlank(await parsed.simple);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with simple message should succeed for \"never\"', async () => {\n\tconst [actual] = bodyLeadingBlank(await parsed.simple, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with simple message should succeed for \"always\"', async () => {\n\tconst [actual] = bodyLeadingBlank(await parsed.simple, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"without blank line before body should fail for empty keyword\", async () => {\n\tconst [actual] = bodyLeadingBlank(await parsed.without);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without blank line before body should succeed for \"never\"', async () => {\n\tconst [actual] = bodyLeadingBlank(await parsed.without, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without blank line before body should fail for \"always\"', async () => {\n\tconst [actual] = bodyLeadingBlank(await parsed.without, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with blank line before body should succeed for empty keyword\", async () => {\n\tconst [actual] = bodyLeadingBlank(await parsed.with);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with blank line before body should fail for \"never\"', async () => {\n\tconst [actual] = bodyLeadingBlank(await parsed.with, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with blank line before body should succeed for \"always\"', async () => {\n\tconst [actual] = bodyLeadingBlank(await parsed.with, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/body-leading-blank.ts",
    "content": "import toLines from \"@commitlint/to-lines\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const bodyLeadingBlank: SyncRule = (parsed, when) => {\n\t// Flunk if no body is found\n\tif (!parsed.body) {\n\t\treturn [true];\n\t}\n\n\tconst negated = when === \"never\";\n\tconst [leading] = toLines(parsed.raw).slice(1);\n\n\t// Check if the first line of body is empty\n\tconst succeeds = leading === \"\";\n\n\treturn [\n\t\tnegated ? !succeeds : succeeds,\n\t\tmessage([\"body\", negated ? \"may not\" : \"must\", \"have leading blank line\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/body-max-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { bodyMaxLength } from \"./body-max-length.js\";\n\nconst short = \"a\";\nconst long = \"ab\";\n\nconst value = short.length;\n\nconst messages = {\n\tempty: \"test: subject\",\n\tshort: `test: subject\\n${short}`,\n\tlong: `test: subject\\n${long}`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = bodyMaxLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should succeed\", async () => {\n\tconst [actual] = bodyMaxLength(await parsed.short, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should fail\", async () => {\n\tconst [actual] = bodyMaxLength(await parsed.long, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/body-max-length.ts",
    "content": "import { maxLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const bodyMaxLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.body;\n\n\tif (!input) {\n\t\treturn [true];\n\t}\n\n\treturn [\n\t\tmaxLength(input, value),\n\t\t`body must not be longer than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/body-max-line-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport type { Commit } from \"conventional-commits-parser\";\nimport { bodyMaxLineLength } from \"./body-max-line-length.js\";\n\nconst short = \"a\";\nconst long = \"ab\";\nconst url = \"https://example.com/URL/with/a/very/long/path\";\n\nconst value = short.length;\n\nconst messages = {\n\tempty: \"test: subject\",\n\tshort: `test: subject\\n${short}`,\n\tlong: `test: subject\\n${long}`,\n\tshortMultipleLines: `test:subject\\n${short}\\n${short}\\n${short}`,\n\tlongMultipleLines: `test:subject\\n${short}\\n${long}\\n${short}`,\n\turlStandalone: `test:subject\\n${short}\\n${url}\\n${short}`,\n\turlMarkdownLinkInline: `test:subject\n\nThis is a [link](${url}).`,\n\turlMarkdownLinkInList: `test:subject\n\nLink in a list:\n\n- ${url}`,\n\turlMarkdownLinkInFooter: `test:subject\n\nFinally, [link][] via footer.\n\n[link]: ${url}`,\n};\n\nconst parsed = Object.entries(messages).reduce(\n\t(_parsed, [key, message]) =>\n\t\tObject.assign(_parsed, {\n\t\t\t[key]: parse(message),\n\t\t}),\n\t{} as Record<keyof typeof messages, Promise<Commit>>,\n);\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = bodyMaxLineLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should succeed\", async () => {\n\tconst [actual] = bodyMaxLineLength(await parsed.short, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should fail\", async () => {\n\tconst [actual] = bodyMaxLineLength(await parsed.long, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short with multiple lines should succeed\", async () => {\n\tconst [actual] = bodyMaxLineLength(\n\t\tawait parsed.shortMultipleLines,\n\t\tundefined,\n\t\tvalue,\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long with multiple lines should fail\", async () => {\n\tconst [actual] = bodyMaxLineLength(\n\t\tawait parsed.longMultipleLines,\n\t\tundefined,\n\t\tvalue,\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with multiple lines and standalone URL should succeed\", async () => {\n\tconst [actual] = bodyMaxLineLength(\n\t\tawait parsed.urlStandalone,\n\t\tundefined,\n\t\tvalue,\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with multiple lines and URL in inline Markdown link should succeed\", async () => {\n\tconst [actual] = bodyMaxLineLength(\n\t\tawait parsed.urlMarkdownLinkInline,\n\t\tundefined,\n\t\t30,\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/body-max-line-length.ts",
    "content": "import { maxLineLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const bodyMaxLineLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.body;\n\n\tif (!input) {\n\t\treturn [true];\n\t}\n\n\treturn [\n\t\tmaxLineLength(input, value),\n\t\t`body's lines must not be longer than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/body-min-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { bodyMinLength } from \"./body-min-length.js\";\n\nconst short = \"a\";\nconst long = \"ab\";\n\nconst value = long.length;\n\nconst messages = {\n\tsimple: \"test: subject\",\n\tshort: `test: subject\\n${short}`,\n\tlong: `test: subject\\n${long}`,\n};\n\nconst parsed = {\n\tsimple: parse(messages.simple),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with simple should succeed\", async () => {\n\tconst [actual] = bodyMinLength(await parsed.simple, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should fail\", async () => {\n\tconst [actual] = bodyMinLength(await parsed.short, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should succeed\", async () => {\n\tconst [actual] = bodyMinLength(await parsed.long, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/body-min-length.ts",
    "content": "import { minLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const bodyMinLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tif (!parsed.body) {\n\t\treturn [true];\n\t}\n\n\treturn [\n\t\tminLength(parsed.body, value),\n\t\t`body must not be shorter than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/breaking-change-exclamation-mark.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { breakingChangeExclamationMark } from \"./breaking-change-exclamation-mark.js\";\n\nconst noHeader = \"commit message\";\nconst plainHeader = \"type: subject\";\nconst breakingHeader = \"type!: subject\";\nconst noFooter = \"\";\nconst plainFooter = \"Some-Other-Trailer: content\";\nconst breakingFooter = \"BREAKING CHANGE: reason\";\n\n// These are equivalence partitions.\nconst messages = {\n\tnoHeaderNoFooter: `${noHeader}\\n\\n${noFooter}`,\n\tnoHeaderPlainFooter: `${noHeader}\\n\\n${plainFooter}`,\n\tnoHeaderBreakingFooter: `${noHeader}\\n\\n${breakingFooter}`,\n\tplainHeaderPlainFooter: `${plainHeader}\\n\\n${plainFooter}`,\n\tplainHeaderBreakingFooter: `${plainHeader}\\n\\n${breakingFooter}`,\n\tbreakingHeaderPlainFooter: `${breakingHeader}\\n\\n${plainFooter}`,\n\tbreakingHeaderBreakingFooter: `${breakingHeader}\\n\\n${breakingFooter}`,\n};\n\nconst parsed = {\n\tnoHeaderNoFooter: parse(messages.noHeaderNoFooter),\n\tnoHeaderPlainFooter: parse(messages.noHeaderPlainFooter),\n\tnoHeaderBreakingFooter: parse(messages.noHeaderBreakingFooter),\n\tplainHeaderPlainFooter: parse(messages.plainHeaderPlainFooter),\n\tplainHeaderBreakingFooter: parse(messages.plainHeaderBreakingFooter),\n\tbreakingHeaderPlainFooter: parse(messages.breakingHeaderPlainFooter),\n\tbreakingHeaderBreakingFooter: parse(messages.breakingHeaderBreakingFooter),\n};\n\ntest(\"with noHeaderNoFooter should succeed\", async () => {\n\tconst [actual] = breakingChangeExclamationMark(await parsed.noHeaderNoFooter);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with noHeaderPlainFooter should succeed\", async () => {\n\tconst [actual] = breakingChangeExclamationMark(\n\t\tawait parsed.noHeaderPlainFooter,\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with noHeaderBreakingFooter should fail\", async () => {\n\tconst [actual] = breakingChangeExclamationMark(\n\t\tawait parsed.noHeaderBreakingFooter,\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with plainHeaderPlainFooter should succeed\", async () => {\n\tconst [actual] = breakingChangeExclamationMark(\n\t\tawait parsed.plainHeaderPlainFooter,\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with plainHeaderBreakingFooter should fail\", async () => {\n\tconst [actual] = breakingChangeExclamationMark(\n\t\tawait parsed.plainHeaderBreakingFooter,\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with breakingHeaderPlainFooter should fail\", async () => {\n\tconst [actual] = breakingChangeExclamationMark(\n\t\tawait parsed.breakingHeaderPlainFooter,\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with breakingHeaderBreakingFooter should succeed\", async () => {\n\tconst [actual] = breakingChangeExclamationMark(\n\t\tawait parsed.breakingHeaderBreakingFooter,\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/breaking-change-exclamation-mark.ts",
    "content": "import message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const breakingChangeExclamationMark: SyncRule = (\n\tparsed,\n\twhen = \"always\",\n) => {\n\tconst header = parsed.header;\n\tconst footer = parsed.footer;\n\n\t// It is the correct behavior to return true only when both the header and footer are empty,\n\t// but still run the usual checks if one or neither are empty.\n\t// The reasoning is that if one is empty and the other contains a breaking change marker,\n\t// then the check fails as it is not possible for the empty one to indicate a breaking change.\n\tif (!header && !footer) {\n\t\treturn [true];\n\t}\n\n\tconst hasExclamationMark =\n\t\t!!header && /^(\\w*)(?:\\((.*)\\))?!: (.*)$/.test(header);\n\tconst hasBreakingChange = !!footer && /^BREAKING[ -]CHANGE:/m.test(footer);\n\n\tconst negated = when === \"never\";\n\tconst check = hasExclamationMark === hasBreakingChange;\n\n\treturn [\n\t\tnegated ? !check : check,\n\t\tmessage([\n\t\t\t\"breaking changes\",\n\t\t\tnegated ? \"must not\" : \"must\",\n\t\t\t\"have both an exclamation mark in the header\",\n\t\t\t\"and BREAKING CHANGE in the footer\",\n\t\t\t\"to identify a breaking change\",\n\t\t]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/footer-empty.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { footerEmpty } from \"./footer-empty.js\";\n\nconst messages = {\n\tsimple: \"test: subject\",\n\tempty: \"test: subject\\nbody\",\n\tfilled: \"test: subject\\nBREAKING CHANGE: something important\",\n};\n\nconst parsed = {\n\tsimple: parse(messages.simple),\n\tempty: parse(messages.empty),\n\tfilled: parse(messages.filled),\n};\n\ntest(\"with simple message should succeed for empty keyword\", async () => {\n\tconst [actual] = footerEmpty(await parsed.simple);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with simple message should fail for \"never\"', async () => {\n\tconst [actual] = footerEmpty(await parsed.simple, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with simple message should succeed for \"always\"', async () => {\n\tconst [actual] = footerEmpty(await parsed.simple, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with empty footer should succeed for empty keyword\", async () => {\n\tconst [actual] = footerEmpty(await parsed.empty);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty footer should fail for \"never\"', async () => {\n\tconst [actual] = footerEmpty(await parsed.empty, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty footer should succeed for \"always\"', async () => {\n\tconst [actual] = footerEmpty(await parsed.empty, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with footer should fail for empty keyword\", async () => {\n\tconst [actual] = footerEmpty(await parsed.filled);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with footer should succeed for \"never\"', async () => {\n\tconst [actual] = footerEmpty(await parsed.filled, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with footer should fail for \"always\"', async () => {\n\tconst [actual] = footerEmpty(await parsed.filled, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/footer-empty.ts",
    "content": "import * as ensure from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const footerEmpty: SyncRule = (parsed, when = \"always\") => {\n\tconst negated = when === \"never\";\n\tconst notEmpty = ensure.notEmpty(parsed.footer || \"\");\n\n\treturn [\n\t\tnegated ? notEmpty : !notEmpty,\n\t\tmessage([\"footer\", negated ? \"may not\" : \"must\", \"be empty\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/footer-leading-blank.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { footerLeadingBlank } from \"./footer-leading-blank.js\";\n\nconst messages = {\n\tsimple: \"test: subject\",\n\tbody: \"test: subject\\nbody\",\n\ttrailing: \"test: subject\\nbody\\n\\n\",\n\twithout: \"test: subject\\nbody\\nBREAKING CHANGE: something important\",\n\twithoutBody:\n\t\t\"feat(new-parser): introduces a new parsing library\\n\\nBREAKING CHANGE: new library does not support foo-construct\",\n\twithBodyWithComment:\n\t\t\"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\",\n\twith: \"test: subject\\nbody\\n\\nBREAKING CHANGE: something important\",\n\twithMulitLine:\n\t\t\"test: subject\\nmulti\\nline\\nbody\\n\\nBREAKING CHANGE: something important\",\n\twithDoubleNewLine: \"fix: some issue\\n\\ndetailed explanation\\n\\ncloses #123\",\n};\n\nconst parsed = {\n\tsimple: parse(messages.simple),\n\tbody: parse(messages.body),\n\ttrailing: parse(messages.trailing),\n\twithout: parse(messages.without),\n\twithoutBody: parse(messages.withoutBody),\n\twithBodyWithComment: parse(messages.withBodyWithComment, undefined, {\n\t\tcommentChar: \"#\",\n\t}),\n\twith: parse(messages.with),\n\twithMulitLine: parse(messages.withMulitLine),\n\twithDoubleNewLine: parse(messages.withDoubleNewLine),\n};\n\ntest(\"with simple message should succeed for empty keyword\", async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.simple);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with simple message should succeed for \"never\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.simple, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with simple message should succeed for \"always\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.simple, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with body message should succeed for empty keyword\", async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.body);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with body message should succeed for \"never\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.body, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with body message should succeed for \"always\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.body, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with trailing message should succeed for empty keyword\", async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.trailing);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with trailing message should succeed for \"never\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.trailing, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with trailing message should succeed for \"always\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.trailing, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without body should fail for \"never\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.withoutBody, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without body should succeed for \"always\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.withoutBody, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"without blank line before footer should fail for empty keyword\", async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.without);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without blank line before footer should succeed for \"never\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.without, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without blank line before footer should fail for \"always\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.without, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with blank line before footer should succeed for empty keyword\", async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.with);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with blank line before footer should fail for \"never\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.with, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with blank line before footer should succeed for \"always\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.with, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with blank line before footer and multiline body should succeed for empty keyword\", async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.withMulitLine);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with blank line before footer and multiline body should fail for \"never\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.withMulitLine, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with blank line before footer and multiline body should succeed for \"always\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.withMulitLine, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with double blank line before footer and double line in body should fail for \"never\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.withDoubleNewLine, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with double blank line before footer and double line in body should succeed for \"always\"', async () => {\n\tconst [actual] = footerLeadingBlank(await parsed.withDoubleNewLine, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with body containing comments should succeed for \"always\"', async () => {\n\tconst [actual] = footerLeadingBlank(\n\t\tawait parsed.withBodyWithComment,\n\t\t\"always\",\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/footer-leading-blank.ts",
    "content": "import toLines from \"@commitlint/to-lines\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const footerLeadingBlank: SyncRule = (parsed, when = \"always\") => {\n\t// Flunk if no footer is found\n\tif (!parsed.footer) {\n\t\treturn [true];\n\t}\n\n\tconst negated = when === \"never\";\n\tconst rawLines = toLines(parsed.raw);\n\tconst footerLines = toLines(parsed.footer);\n\tconst footerOffset = rawLines.indexOf(footerLines[0]);\n\tconst [leading] = rawLines.slice(footerOffset - 1);\n\n\t// Check if the first line of footer is empty\n\tconst succeeds = leading === \"\";\n\n\treturn [\n\t\tnegated ? !succeeds : succeeds,\n\t\tmessage([\n\t\t\t\"footer\",\n\t\t\tnegated ? \"may not\" : \"must\",\n\t\t\t\"have leading blank line\",\n\t\t]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/footer-max-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { footerMaxLength } from \"./footer-max-length.js\";\n\nconst short = \"BREAKING CHANGE: a\";\nconst long = \"BREAKING CHANGE: ab\";\n\nconst value = short.length;\n\nconst messages = {\n\tsimple: \"test: subject\",\n\tempty: \"test: subject\\nbody\",\n\tshort: `test: subject\\n${short}`,\n\tlong: `test: subject\\n${long}`,\n};\n\nconst parsed = {\n\tsimple: parse(messages.simple),\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with simple should succeed\", async () => {\n\tconst [actual] = footerMaxLength(await parsed.simple, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = footerMaxLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should succeed\", async () => {\n\tconst [actual] = footerMaxLength(await parsed.short, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should fail\", async () => {\n\tconst [actual] = footerMaxLength(await parsed.long, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/footer-max-length.ts",
    "content": "import { maxLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const footerMaxLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.footer;\n\n\tif (!input) {\n\t\treturn [true];\n\t}\n\n\treturn [\n\t\tmaxLength(input, value),\n\t\t`footer must not be longer than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/footer-max-line-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { footerMaxLineLength } from \"./footer-max-line-length.js\";\n\nconst short = \"BREAKING CHANGE: a\";\nconst long = \"BREAKING CHANGE: ab\";\n\nconst value = short.length;\n\nconst messages = {\n\tsimple: \"test: subject\",\n\tempty: \"test: subject\\nbody\",\n\tshort: `test: subject\\n${short}`,\n\tlong: `test: subject\\n${long}`,\n\tshortMultipleLines: `test:subject\\n${short}\\n${short}\\n${short}`,\n\tlongMultipleLines: `test:subject\\n${short}\\n${long}\\n${short}`,\n};\n\nconst parsed = {\n\tsimple: parse(messages.simple),\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with simple should succeed\", async () => {\n\tconst [actual] = footerMaxLineLength(await parsed.simple, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = footerMaxLineLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should succeed\", async () => {\n\tconst [actual] = footerMaxLineLength(await parsed.short, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should fail\", async () => {\n\tconst [actual] = footerMaxLineLength(await parsed.long, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short with multiple lines should succeed\", async () => {\n\tconst [actual] = footerMaxLineLength(await parsed.short, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long with multiple lines should fail\", async () => {\n\tconst [actual] = footerMaxLineLength(await parsed.long, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/footer-max-line-length.ts",
    "content": "import { maxLineLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const footerMaxLineLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.footer;\n\n\tif (!input) {\n\t\treturn [true];\n\t}\n\n\treturn [\n\t\tmaxLineLength(input, value),\n\t\t`footer's lines must not be longer than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/footer-min-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { footerMinLength } from \"./footer-min-length.js\";\n\nconst short = \"BREAKING CHANGE: a\";\nconst long = \"BREAKING CHANGE: ab\";\n\nconst value = long.length;\n\nconst messages = {\n\tsimple: \"test: subject\",\n\tempty: \"test: subject\\nbody\",\n\tshort: `test: subject\\n${short}`,\n\tlong: `test: subject\\n${long}`,\n};\n\nconst parsed = {\n\tsimple: parse(messages.simple),\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with simple should succeed\", async () => {\n\tconst [actual] = footerMinLength(await parsed.simple, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = footerMinLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should fail\", async () => {\n\tconst [actual] = footerMinLength(await parsed.short, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should succeed\", async () => {\n\tconst [actual] = footerMinLength(await parsed.long, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/footer-min-length.ts",
    "content": "import { minLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const footerMinLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tif (!parsed.footer) {\n\t\treturn [true];\n\t}\n\n\treturn [\n\t\tminLength(parsed.footer, value),\n\t\t`footer must not be shorter than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/header-case.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { headerCase } from \"./header-case.js\";\n\nconst messages = {\n\tnumeric: \"1.0.0\\n\",\n\tlowercase: \"header\\n\",\n\tmixedcase: \"hEaDeR\\n\",\n\tuppercase: \"HEADER\\n\",\n\tcamelcase: \"heaDer\\n\",\n\tkebabcase: \"hea-der\\n\",\n\tpascalcase: \"HeaDer\\n\",\n\tsnakecase: \"hea_der\\n\",\n\tstartcase: \"Hea Der\\n\",\n};\n\nconst parsed = {\n\tnumeric: parse(messages.numeric),\n\tlowercase: parse(messages.lowercase),\n\tmixedcase: parse(messages.mixedcase),\n\tuppercase: parse(messages.uppercase),\n\tcamelcase: parse(messages.camelcase),\n\tkebabcase: parse(messages.kebabcase),\n\tpascalcase: parse(messages.pascalcase),\n\tsnakecase: parse(messages.snakecase),\n\tstartcase: parse(messages.startcase),\n};\n\ntest('with lowercase header should fail for \"never lowercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.lowercase, \"never\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase header should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.lowercase, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase header should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.mixedcase, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase header should fail for \"always lowercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.mixedcase, \"always\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase header should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.mixedcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase header should fail for \"always uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.mixedcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase header should fail for \"never uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.uppercase, \"never\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase header should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.uppercase, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase header should fail for \"always uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.camelcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase header should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.camelcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase header should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.camelcase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase header should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.camelcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase header should fail for \"always snakecase\"', async () => {\n\tconst [actual] = headerCase(await parsed.camelcase, \"always\", \"snake-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase header should succeed for \"always camelcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.camelcase, \"always\", \"camel-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase header should fail for \"always uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.pascalcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase header should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.pascalcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase header should succeed for \"always pascalcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.pascalcase, \"always\", \"pascal-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase header should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.pascalcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase header should fail for \"always snakecase\"', async () => {\n\tconst [actual] = headerCase(await parsed.pascalcase, \"always\", \"snake-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase header should fail for \"always camelcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.pascalcase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase header should fail for \"always uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.snakecase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase header should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.snakecase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase header should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.snakecase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase header should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.snakecase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase header should succeed for \"always snakecase\"', async () => {\n\tconst [actual] = headerCase(await parsed.snakecase, \"always\", \"snake-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase header should fail for \"always camelcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.snakecase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase header should fail for \"always uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.startcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase header should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.startcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase header should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.startcase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase header should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.startcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase header should fail for \"always snakecase\"', async () => {\n\tconst [actual] = headerCase(await parsed.startcase, \"always\", \"snake-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase header should fail for \"always camelcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.startcase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase header should succeed for \"always startcase\"', async () => {\n\tconst [actual] = headerCase(await parsed.startcase, \"always\", \"start-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('should use expected message with \"always\"', async () => {\n\tconst [, message] = headerCase(\n\t\tawait parsed.uppercase,\n\t\t\"always\",\n\t\t\"lower-case\",\n\t);\n\texpect(message).toContain(\"must be lower-case\");\n});\n\ntest('should use expected message with \"never\"', async () => {\n\tconst [, message] = headerCase(await parsed.uppercase, \"never\", \"upper-case\");\n\texpect(message).toContain(\"must not be upper-case\");\n});\n\ntest('with uppercase scope should succeed for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = headerCase(await parsed.uppercase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase header should succeed for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = headerCase(await parsed.lowercase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase header should fail for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = headerCase(await parsed.mixedcase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase header should pass for \"always [uppercase, lowercase, camel-case]\"', async () => {\n\tconst [actual] = headerCase(await parsed.mixedcase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t\t\"camel-case\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should pass for \"never [uppercase, lowercase]\"', async () => {\n\tconst [actual] = headerCase(await parsed.mixedcase, \"never\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase scope should fail for \"never [uppercase, lowercase]\"', async () => {\n\tconst [actual] = headerCase(await parsed.uppercase, \"never\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with numeric header should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.numeric, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with numeric header should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.numeric, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with numeric header should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.numeric, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with numeric header should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = headerCase(await parsed.numeric, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/header-case.ts",
    "content": "import { case as ensureCase } from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { TargetCaseType, SyncRule } from \"@commitlint/types\";\n\nconst negated = (when?: string) => when === \"never\";\n\nexport const headerCase: SyncRule<TargetCaseType | TargetCaseType[]> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = [],\n) => {\n\tconst { header } = parsed;\n\n\tif (typeof header !== \"string\" || !header.match(/^[a-z]/i)) {\n\t\treturn [true];\n\t}\n\n\tconst checks = (Array.isArray(value) ? value : [value]).map((check) => {\n\t\tif (typeof check === \"string\") {\n\t\t\treturn {\n\t\t\t\twhen: \"always\",\n\t\t\t\tcase: check,\n\t\t\t};\n\t\t}\n\t\treturn check;\n\t});\n\n\tconst result = checks.some((check) => {\n\t\tconst r = ensureCase(header, check.case);\n\t\treturn negated(check.when) ? !r : r;\n\t});\n\n\tconst list = checks.map((c) => c.case).join(\", \");\n\n\treturn [\n\t\tnegated(when) ? !result : result,\n\t\tmessage([`header must`, negated(when) ? `not` : null, `be ${list}`]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/header-full-stop.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { headerFullStop } from \"./header-full-stop.js\";\n\nconst messages = {\n\twith: `header.\\n`,\n\twithout: `header\\n`,\n};\n\nconst parsed = {\n\twith: parse(messages.with),\n\twithout: parse(messages.without),\n};\n\ntest('with against \"always .\" should succeed', async () => {\n\tconst [actual] = headerFullStop(await parsed.with, \"always\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"never .\" should fail', async () => {\n\tconst [actual] = headerFullStop(await parsed.with, \"never\", \".\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"always .\" should fail', async () => {\n\tconst [actual] = headerFullStop(await parsed.without, \"always\", \".\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"never .\" should succeed', async () => {\n\tconst [actual] = headerFullStop(await parsed.without, \"never\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/header-full-stop.ts",
    "content": "import message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const headerFullStop: SyncRule<string> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = \".\",\n) => {\n\tconst { header } = parsed;\n\tconst negated = when === \"never\";\n\tconst hasStop = header?.[header.length - 1] === value;\n\n\treturn [\n\t\tnegated ? !hasStop : hasStop,\n\t\tmessage([\"header\", negated ? \"may not\" : \"must\", \"end with full stop\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/header-max-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { headerMaxLength } from \"./header-max-length.js\";\n\nconst short = \"test: a\";\nconst long = \"test: ab\";\n\nconst value = short.length;\n\nconst messages = {\n\tshort,\n\tlong,\n};\n\nconst parsed = {\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with short should succeed\", async () => {\n\tconst [actual] = headerMaxLength(await parsed.short, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should fail\", async () => {\n\tconst [actual] = headerMaxLength(await parsed.long, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/header-max-length.ts",
    "content": "import { maxLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const headerMaxLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\treturn [\n\t\tmaxLength(parsed.header, value),\n\t\t`header must not be longer than ${value} characters, current length is ${parsed.header?.length}`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/header-min-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { headerMinLength } from \"./header-min-length.js\";\n\nconst short = \"BREAKING CHANGE: a\";\nconst long = \"BREAKING CHANGE: ab\";\n\nconst value = long.length;\n\nconst messages = {\n\tshort,\n\tlong,\n};\n\nconst parsed = {\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with short should fail\", async () => {\n\tconst [actual] = headerMinLength(await parsed.short, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should succeed\", async () => {\n\tconst [actual] = headerMinLength(await parsed.long, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/header-min-length.ts",
    "content": "import { minLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const headerMinLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\treturn [\n\t\tminLength(parsed.header, value),\n\t\t`header must not be shorter than ${value} characters, current length is ${parsed.header?.length}`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/header-trim.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport type { Commit } from \"conventional-commits-parser\";\n\nimport { headerTrim } from \"./header-trim.js\";\n\nconst messages = {\n\tcorrect: \"test: subject\",\n\n\twhitespaceStart: \" test: subject\",\n\twhitespaceEnd: \"test: subject  \",\n\twhitespaceSurround: \" test: subject \",\n\n\ttabStart: \"\\t\\ttest: subject\",\n\ttabEnd: \"test: subject\\t\\t\",\n\ttabSurround: \"\\t\\ttest: subject\\t\",\n\n\tmixStart: \"\\t\\ttest: subject\",\n\tmixEnd: \"test: subject\\t\\t\",\n\tmixSurround: \"\\t \\ttest: subject \\t  \\t\",\n};\n\nconst parsed = Object.entries(messages).reduce(\n\t(_parsed, [key, message]) =>\n\t\tObject.assign(_parsed, {\n\t\t\t[key]: parse(message),\n\t\t}),\n\t{} as Record<keyof typeof messages, Promise<Commit>>,\n);\n\ntest(\"should succeed when header is not surrounded by whitespace\", async () => {\n\tconst result = headerTrim(await parsed.correct);\n\texpect(result).toEqual(expect.arrayContaining([true]));\n});\n\ntest.each([\n\t{ scenario: \"mixed whitespace \", commit: parsed.mixStart },\n\t{ scenario: \"whitespace\", commit: parsed.whitespaceStart },\n\t{ scenario: \"tab\", commit: parsed.tabStart },\n] as const)(\"should fail when starts with $scenario\", async ({ commit }) => {\n\tconst result = headerTrim(await commit);\n\texpect(result).toEqual(\n\t\texpect.arrayContaining([false, \"header must not start with whitespace\"]),\n\t);\n});\n\ntest.each([\n\t{ scenario: \"mixed whitespace\", commit: parsed.mixEnd },\n\t{ scenario: \"whitespace\", commit: parsed.whitespaceEnd },\n\t{ scenario: \"tab\", commit: parsed.tabEnd },\n] as const)(\"should fail when ends with $scenario\", async ({ commit }) => {\n\tconst result = headerTrim(await commit);\n\texpect(result).toEqual(\n\t\texpect.arrayContaining([false, \"header must not end with whitespace\"]),\n\t);\n});\n\ntest.each([\n\t{ scenario: \"mixed whitespace\", commit: parsed.mixSurround },\n\t{ scenario: \"whitespace\", commit: parsed.whitespaceSurround },\n\t{ scenario: \"tab\", commit: parsed.tabSurround },\n] as const)(\n\t\"should fail when surrounded by with $scenario\",\n\tasync ({ commit }) => {\n\t\tconst result = headerTrim(await commit);\n\t\texpect(result).toEqual(\n\t\t\texpect.arrayContaining([\n\t\t\t\tfalse,\n\t\t\t\t\"header must not be surrounded by whitespace\",\n\t\t\t]),\n\t\t);\n\t},\n);\n"
  },
  {
    "path": "@commitlint/rules/src/header-trim.ts",
    "content": "import message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const headerTrim: SyncRule = (parsed) => {\n\tconst { header } = parsed;\n\n\tif (!header) return [true];\n\n\tconst startsWithWhiteSpace = header.length > header.trimStart().length;\n\tconst endsWithWhiteSpace = header.length > header.trimEnd().length;\n\n\tif (startsWithWhiteSpace && endsWithWhiteSpace)\n\t\treturn [false, message([\"header\", \"must not be surrounded by whitespace\"])];\n\n\tif (startsWithWhiteSpace)\n\t\treturn [false, message([\"header\", \"must not start with whitespace\"])];\n\n\tif (endsWithWhiteSpace)\n\t\treturn [false, message([\"header\", \"must not end with whitespace\"])];\n\n\treturn [true];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { globSync } from \"glob\";\n\nimport rules from \"./index.js\";\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\ntest(\"exports all rules\", () => {\n\tconst expected = _glob(\"*.ts\").sort();\n\tconst actual = Object.keys(rules).sort();\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"rules export functions\", () => {\n\tconst actual = Object.values(rules);\n\texpect(actual.every((rule) => typeof rule === \"function\")).toBe(true);\n});\n\ntest(\"all rules are present in documentation\", () => {\n\tconst file = fs.readFileSync(\n\t\tpath.join(__dirname, \"../../../docs/reference/rules.md\"),\n\t\t\"utf-8\",\n\t);\n\tconst results = file\n\t\t.split(/(\\n|\\r)/)\n\t\t.filter((s) => s.startsWith(\"##\") && !s.includes(\"`deprecated`\"))\n\t\t.map((s) => s.replace(\"## \", \"\"));\n\n\texpect(Object.keys(rules)).toEqual(expect.arrayContaining(results));\n});\n\nfunction _glob(pattern: string) {\n\tconst files = globSync(pattern, {\n\t\tignore: [\"**/index.ts\", \"**/*.test.ts\"],\n\t\tcwd: __dirname,\n\t});\n\treturn files.map(relative).map(toExport);\n}\n\nfunction relative(filePath: string) {\n\treturn path.relative(__dirname, filePath);\n}\n\nfunction toExport(fileName: string) {\n\treturn path.basename(fileName, path.extname(fileName));\n}\n"
  },
  {
    "path": "@commitlint/rules/src/index.ts",
    "content": "import { breakingChangeExclamationMark } from \"./breaking-change-exclamation-mark.js\";\nimport { bodyCase } from \"./body-case.js\";\nimport { bodyEmpty } from \"./body-empty.js\";\nimport { bodyFullStop } from \"./body-full-stop.js\";\nimport { bodyLeadingBlank } from \"./body-leading-blank.js\";\nimport { bodyMaxLength } from \"./body-max-length.js\";\nimport { bodyMaxLineLength } from \"./body-max-line-length.js\";\nimport { bodyMinLength } from \"./body-min-length.js\";\nimport { footerEmpty } from \"./footer-empty.js\";\nimport { footerLeadingBlank } from \"./footer-leading-blank.js\";\nimport { footerMaxLength } from \"./footer-max-length.js\";\nimport { footerMaxLineLength } from \"./footer-max-line-length.js\";\nimport { footerMinLength } from \"./footer-min-length.js\";\nimport { headerCase } from \"./header-case.js\";\nimport { headerFullStop } from \"./header-full-stop.js\";\nimport { headerMaxLength } from \"./header-max-length.js\";\nimport { headerMinLength } from \"./header-min-length.js\";\nimport { headerTrim } from \"./header-trim.js\";\nimport { referencesEmpty } from \"./references-empty.js\";\nimport { scopeCase } from \"./scope-case.js\";\nimport { scopeDelimiterStyle } from \"./scope-delimiter-style.js\";\nimport { scopeEmpty } from \"./scope-empty.js\";\nimport { scopeEnum } from \"./scope-enum.js\";\nimport { scopeMaxLength } from \"./scope-max-length.js\";\nimport { scopeMinLength } from \"./scope-min-length.js\";\nimport { signedOffBy } from \"./signed-off-by.js\";\nimport { subjectCase } from \"./subject-case.js\";\nimport { subjectEmpty } from \"./subject-empty.js\";\nimport { subjectFullStop } from \"./subject-full-stop.js\";\nimport { subjectMaxLength } from \"./subject-max-length.js\";\nimport { subjectMinLength } from \"./subject-min-length.js\";\nimport { subjectExclamationMark } from \"./subject-exclamation-mark.js\";\nimport { trailerExists } from \"./trailer-exists.js\";\nimport { typeCase } from \"./type-case.js\";\nimport { typeEmpty } from \"./type-empty.js\";\nimport { typeEnum } from \"./type-enum.js\";\nimport { typeMaxLength } from \"./type-max-length.js\";\nimport { typeMinLength } from \"./type-min-length.js\";\n\nexport default {\n\t\"body-case\": bodyCase,\n\t\"body-empty\": bodyEmpty,\n\t\"body-full-stop\": bodyFullStop,\n\t\"body-leading-blank\": bodyLeadingBlank,\n\t\"body-max-length\": bodyMaxLength,\n\t\"body-max-line-length\": bodyMaxLineLength,\n\t\"body-min-length\": bodyMinLength,\n\t\"breaking-change-exclamation-mark\": breakingChangeExclamationMark,\n\t\"footer-empty\": footerEmpty,\n\t\"footer-leading-blank\": footerLeadingBlank,\n\t\"footer-max-length\": footerMaxLength,\n\t\"footer-max-line-length\": footerMaxLineLength,\n\t\"footer-min-length\": footerMinLength,\n\t\"header-case\": headerCase,\n\t\"header-full-stop\": headerFullStop,\n\t\"header-max-length\": headerMaxLength,\n\t\"header-min-length\": headerMinLength,\n\t\"header-trim\": headerTrim,\n\t\"references-empty\": referencesEmpty,\n\t\"scope-case\": scopeCase,\n\t\"scope-delimiter-style\": scopeDelimiterStyle,\n\t\"scope-empty\": scopeEmpty,\n\t\"scope-enum\": scopeEnum,\n\t\"scope-max-length\": scopeMaxLength,\n\t\"scope-min-length\": scopeMinLength,\n\t\"signed-off-by\": signedOffBy,\n\t\"subject-case\": subjectCase,\n\t\"subject-empty\": subjectEmpty,\n\t\"subject-exclamation-mark\": subjectExclamationMark,\n\t\"subject-full-stop\": subjectFullStop,\n\t\"subject-max-length\": subjectMaxLength,\n\t\"subject-min-length\": subjectMinLength,\n\t\"trailer-exists\": trailerExists,\n\t\"type-case\": typeCase,\n\t\"type-empty\": typeEmpty,\n\t\"type-enum\": typeEnum,\n\t\"type-max-length\": typeMaxLength,\n\t\"type-min-length\": typeMinLength,\n};\n"
  },
  {
    "path": "@commitlint/rules/src/references-empty.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { referencesEmpty } from \"./references-empty.js\";\n\n// @ts-expect-error -- no typings\nimport preset from \"conventional-changelog-angular\";\n\nconst messages = {\n\tplain: \"foo: bar\",\n\tcomment: \"foo: baz\\n#1 Comment\",\n\treference: \"#comment\\nfoo: baz \\nCloses #1\",\n\treferences: \"#comment\\nfoo: bar \\nCloses #1, #2, #3\",\n\tprefix: \"bar REF-1234\",\n};\n\nconst opts = (async () => {\n\tconst o = await preset();\n\to.parser.commentChar = \"#\";\n\treturn o;\n})();\n\nconst parsed = {\n\tplain: (async () => parse(messages.plain, undefined, (await opts).parser))(),\n\tcomment: (async () =>\n\t\tparse(messages.comment, undefined, (await opts).parser))(),\n\treference: (async () =>\n\t\tparse(messages.reference, undefined, (await opts).parser))(),\n\treferences: (async () =>\n\t\tparse(messages.references, undefined, (await opts).parser))(),\n\tprefix: parse(messages.prefix, undefined, {\n\t\tissuePrefixes: [\"REF-\"],\n\t}),\n};\n\ntest(\"defaults to never and fails for plain\", async () => {\n\tconst [actual] = referencesEmpty(await parsed.plain);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"defaults to never and succeeds for reference\", async () => {\n\tconst [actual] = referencesEmpty(await parsed.reference);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"fails for comment with never\", async () => {\n\tconst [actual] = referencesEmpty(await parsed.comment, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"succeeds for comment with always\", async () => {\n\tconst [actual] = referencesEmpty(await parsed.comment, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"succeeds for reference with never\", async () => {\n\tconst [actual] = referencesEmpty(await parsed.reference, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"fails for reference with always\", async () => {\n\tconst [actual] = referencesEmpty(await parsed.reference, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"succeeds for references with never\", async () => {\n\tconst [actual] = referencesEmpty(await parsed.references, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"fails for references with always\", async () => {\n\tconst [actual] = referencesEmpty(await parsed.references, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"succeeds for custom references with always\", async () => {\n\tconst [actual] = referencesEmpty(await parsed.prefix, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/references-empty.ts",
    "content": "import message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const referencesEmpty: SyncRule = (parsed, when = \"never\") => {\n\tconst negated = when === \"always\";\n\tconst notEmpty = parsed.references.length > 0;\n\treturn [\n\t\tnegated ? !notEmpty : notEmpty,\n\t\tmessage([\"references\", negated ? \"must\" : \"may not\", \"be empty\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/scope-case.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { scopeCase } from \"./scope-case.js\";\n\nconst messages = {\n\tempty: \"test: subject\",\n\tlowercase: \"test(scope): subject\",\n\tmixedcase: \"test(sCoPe): subject\",\n\tuppercase: \"test(SCOPE): subject\",\n\tcamelcase: \"test(myScope): subject\",\n\tkebabcase: \"test(my-scope): subject\",\n\tpascalcase: \"test(MyScope): subject\",\n\tsnakecase: \"test(my_scope): subject\",\n\tstartcase: \"test(My Scope): subject\",\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tlowercase: parse(messages.lowercase),\n\tmixedcase: parse(messages.mixedcase),\n\tuppercase: parse(messages.uppercase),\n\tcamelcase: parse(messages.camelcase),\n\tkebabcase: parse(messages.kebabcase),\n\tpascalcase: parse(messages.pascalcase),\n\tsnakecase: parse(messages.snakecase),\n\tstartcase: parse(messages.startcase),\n};\n\ntest('with empty scope should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"never camelcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"camel-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"always camelcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"camel-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"never kebabcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"kebab-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"always kebabcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"kebab-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"never pascalcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"pascal-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"always pascalcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"pascal-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"never snakecase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"snake-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"always snakecase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"snake-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"never startcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"start-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty scope should succeed for \"always startcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.empty, \"never\", \"start-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase scope should fail for \"never lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.lowercase, \"never\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase scope should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.lowercase, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.mixedcase, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should fail for \"always lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.mixedcase, \"always\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.mixedcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with kebabcase scope should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.kebabcase, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with kebabcase scope should fail for \"always camelcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.kebabcase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with kebabcase scope should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.kebabcase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with kebabcase scope should succeed for \"always kebabcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.kebabcase, \"always\", \"kebab-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase scope should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.snakecase, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase scope should fail for \"always camelcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.snakecase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase scope should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.snakecase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase scope should succeed for \"always snakecase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.snakecase, \"always\", \"snake-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase scope should fail for \"always lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.camelcase, \"always\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase scope should succeed for \"always camelcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.camelcase, \"always\", \"camel-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase scope should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.camelcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase scope should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.camelcase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase scope should fail for \"always lowercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.pascalcase, \"always\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase scope should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.pascalcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase scope should fail for \"always camelcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.pascalcase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase scope should succeed for \"always pascalcase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.pascalcase, \"always\", \"pascal-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should fail for \"always uppercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.mixedcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase scope should fail for \"never uppercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.uppercase, \"never\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase scope should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = scopeCase(await parsed.uppercase, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase scope should succeed for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = scopeCase(await parsed.uppercase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase scope should succeed for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = scopeCase(await parsed.lowercase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should fail for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = scopeCase(await parsed.mixedcase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should pass for \"always [uppercase, lowercase, camel-case]\"', async () => {\n\tconst [actual] = scopeCase(await parsed.mixedcase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t\t\"camel-case\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should pass for \"never [uppercase, lowercase]\"', async () => {\n\tconst [actual] = scopeCase(await parsed.mixedcase, \"never\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase scope should fail for \"never [uppercase, lowercase]\"', async () => {\n\tconst [actual] = scopeCase(await parsed.uppercase, \"never\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with slash in scope should succeed for \"always pascal-case\"', async () => {\n\tconst commit = await parse(\"feat(Modules/Graph): add Pie Chart\");\n\tconst [actual] = scopeCase(commit, \"always\", \"pascal-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with slash in subject should succeed for \"always sentence case\"', async () => {\n\tconst commit = await parse(\"chore: Update @angular/core\");\n\tconst [actual] = scopeCase(commit, \"always\", \"sentencecase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with object-based configuration should use default delimiters\", async () => {\n\tconst commit = await parse(\"feat(scope/my-scope, shared-scope): subject\");\n\tconst [actual] = scopeCase(commit, \"always\", {\n\t\tcases: [\"kebab-case\"],\n\t});\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with object-based configuration should support custom single delimiter\", async () => {\n\tconst commit = await parse(\"feat(scope|my-scope): subject\");\n\tconst [actual] = scopeCase(commit, \"always\", {\n\t\tcases: [\"kebab-case\"],\n\t\tdelimiters: [\"|\"],\n\t});\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with object-based configuration should support multiple custom delimiters\", async () => {\n\tconst commit = await parse(\n\t\t\"feat(scope|my-scope/shared-scope,common-scope): subject\",\n\t);\n\tconst [actual] = scopeCase(commit, \"always\", {\n\t\tcases: [\"kebab-case\"],\n\t\tdelimiters: [\"|\", \"/\", \",\"],\n\t});\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with object-based configuration should fall back to default delimiters when empty array provided\", async () => {\n\tconst commit = await parse(\"feat(scope/my-scope): subject\");\n\tconst [actual] = scopeCase(commit, \"always\", {\n\t\tcases: [\"kebab-case\"],\n\t\tdelimiters: [],\n\t});\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with object-based configuration should handle special delimiters\", async () => {\n\tconst commit = await parse(\"feat(scope*my-scope): subject\");\n\tconst [actual] = scopeCase(commit, \"always\", {\n\t\tcases: [\"kebab-case\"],\n\t\tdelimiters: [\"*\"],\n\t});\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with object-based configuration should respect \"never\" when custom delimiter is used', async () => {\n\tconst commit = await parse(\"feat(scope|my-scope): subject\");\n\tconst [actual] = scopeCase(commit, \"never\", {\n\t\tcases: [\"kebab-case\"],\n\t\tdelimiters: [\"|\"],\n\t});\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/scope-case.ts",
    "content": "import { case as ensureCase } from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { TargetCaseType, SyncRule } from \"@commitlint/types\";\n\nconst negated = (when?: string) => when === \"never\";\n\nexport const scopeCase: SyncRule<\n\t| TargetCaseType\n\t| TargetCaseType[]\n\t| {\n\t\t\tcases: TargetCaseType[];\n\t\t\tdelimiters?: string[];\n\t  }\n> = (parsed, when = \"always\", value = []) => {\n\tconst { scope } = parsed;\n\n\tif (!scope) {\n\t\treturn [true];\n\t}\n\tconst isObjectBasedConfiguration =\n\t\t!Array.isArray(value) && !(typeof value === \"string\");\n\n\tconst checks = (\n\t\tisObjectBasedConfiguration\n\t\t\t? value.cases\n\t\t\t: Array.isArray(value)\n\t\t\t\t? value\n\t\t\t\t: [value]\n\t).map((check) => {\n\t\tif (typeof check === \"string\") {\n\t\t\treturn {\n\t\t\t\twhen: \"always\",\n\t\t\t\tcase: check,\n\t\t\t};\n\t\t}\n\t\treturn check;\n\t});\n\n\tconst delimiters =\n\t\tisObjectBasedConfiguration && value.delimiters?.length\n\t\t\t? value.delimiters\n\t\t\t: [\"/\", \"\\\\\", \",\"];\n\tconst delimiterPatterns = delimiters.map((delimiter) => {\n\t\treturn delimiter === \",\"\n\t\t\t? \", ?\"\n\t\t\t: delimiter.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t});\n\tconst delimiterRegex = new RegExp(delimiterPatterns.join(\"|\"));\n\tconst scopeSegments = scope.split(delimiterRegex);\n\n\tconst result = checks.some((check) => {\n\t\tconst r = scopeSegments.every(\n\t\t\t(segment) =>\n\t\t\t\tdelimiterRegex.test(segment) || ensureCase(segment, check.case),\n\t\t);\n\n\t\treturn negated(check.when) ? !r : r;\n\t});\n\n\tconst list = checks.map((c) => c.case).join(\", \");\n\n\treturn [\n\t\tnegated(when) ? !result : result,\n\t\tmessage([`scope must`, negated(when) ? `not` : null, `be ${list}`]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/scope-delimiter-style.test.ts",
    "content": "import { describe, test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { scopeDelimiterStyle } from \"./scope-delimiter-style.js\";\n\nconst messages = {\n\tnoScope: \"feat: subject\",\n\n\tkebabScope: \"feat(lint-staged): subject\",\n\tsnakeScope: \"feat(my_scope): subject\",\n\n\tdefaultSlash: \"feat(core/api): subject\",\n\tdefaultComma: \"feat(core,api): subject\",\n\tdefaultCommaSpace: \"feat(core, api): subject\",\n\tdefaultBackslash: \"feat(core\\\\api): subject\",\n\n\tnonDefaultPipe: \"feat(core|api): subject\",\n\tnonDefaultStar: \"feat(core*api): subject\",\n\tmixedCustom: \"feat(core|api/utils): subject\",\n} as const;\n\ndescribe(\"Scope Delimiter Validation\", () => {\n\tdescribe(\"Messages without scopes\", () => {\n\t\ttest('Succeeds for \"always\" when there is no scope', async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.noScope),\n\t\t\t\t\"always\",\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(true);\n\t\t\texpect(error).toEqual(undefined);\n\t\t});\n\n\t\ttest('Succeeds for \"never\" when there is no scope', async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.noScope),\n\t\t\t\t\"never\",\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(true);\n\t\t\texpect(error).toEqual(undefined);\n\t\t});\n\t});\n\n\tdescribe('\"always\" with default configuration', () => {\n\t\ttest.each([\n\t\t\t{ scenario: \"kebab-case scope\", commit: messages.kebabScope },\n\t\t\t{ scenario: \"snake_case scope\", commit: messages.snakeScope },\n\t\t] as const)(\n\t\t\t\"Treats $scenario as part of the scope and not a delimiter\",\n\t\t\tasync ({ commit }) => {\n\t\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\t\tawait parse(commit),\n\t\t\t\t\t\"always\",\n\t\t\t\t);\n\n\t\t\t\texpect(actual).toEqual(true);\n\t\t\t\texpect(error).toEqual(\"scope delimiters must be one of [/, \\\\, ,]\");\n\t\t\t},\n\t\t);\n\n\t\ttest.each([\n\t\t\t{ scenario: \"comma ',' delimiter\", commit: messages.defaultComma },\n\t\t\t{ scenario: \"slash '/' delimiter\", commit: messages.defaultSlash },\n\t\t\t{\n\t\t\t\tscenario: \"backslash '\\\\' delimiter\",\n\t\t\t\tcommit: messages.defaultBackslash,\n\t\t\t},\n\t\t] as const)(\"Succeeds when only $scenario is used\", async ({ commit }) => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(commit),\n\t\t\t\t\"always\",\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(true);\n\t\t\texpect(error).toEqual(\"scope delimiters must be one of [/, \\\\, ,]\");\n\t\t});\n\n\t\ttest.each([\n\t\t\t{ scenario: \"comma without space\", commit: messages.defaultComma },\n\t\t\t{ scenario: \"comma with space\", commit: messages.defaultCommaSpace },\n\t\t] as const)(\n\t\t\t\"Normalizes $scenario as the same delimiter ','\",\n\t\t\tasync ({ commit }) => {\n\t\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\t\tawait parse(commit),\n\t\t\t\t\t\"always\",\n\t\t\t\t);\n\n\t\t\t\texpect(actual).toEqual(true);\n\t\t\t\texpect(error).toEqual(\"scope delimiters must be one of [/, \\\\, ,]\");\n\t\t\t},\n\t\t);\n\n\t\ttest(\"Fails when a non-default delimiter is used\", async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.nonDefaultStar),\n\t\t\t\t\"always\",\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(false);\n\t\t\texpect(error).toEqual(\"scope delimiters must be one of [/, \\\\, ,]\");\n\t\t});\n\t});\n\n\tdescribe('\"never\" with default configuration', () => {\n\t\ttest(\"Fails when scope uses only default delimiters\", async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.defaultSlash),\n\t\t\t\t\"never\",\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(false);\n\t\t\texpect(error).toEqual(\"scope delimiters must not be one of [/, \\\\, ,]\");\n\t\t});\n\n\t\ttest(\"Succeeds when scope uses only non-default delimiter\", async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.nonDefaultPipe),\n\t\t\t\t\"never\",\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(true);\n\t\t\texpect(error).toEqual(\"scope delimiters must not be one of [/, \\\\, ,]\");\n\t\t});\n\t});\n\n\tdescribe(\"Custom configuration\", () => {\n\t\ttest(\"Falls back to default delimiters when delimiters is an empty array\", async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.defaultComma),\n\t\t\t\t\"always\",\n\t\t\t\t[],\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(true);\n\t\t\texpect(error).toEqual(\"scope delimiters must be one of [/, \\\\, ,]\");\n\t\t});\n\n\t\ttest(\"Succeeds when a custom single allowed delimiter is used\", async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.nonDefaultStar),\n\t\t\t\t\"always\",\n\t\t\t\t[\"*\"],\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(true);\n\t\t\texpect(error).toEqual(\"scope delimiters must be one of [*]\");\n\t\t});\n\n\t\ttest(\"Fails when ',' is used but only '/' is allowed\", async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.defaultComma),\n\t\t\t\t\"always\",\n\t\t\t\t[\"/\"],\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(false);\n\t\t\texpect(error).toEqual(\"scope delimiters must be one of [/]\");\n\t\t});\n\n\t\ttest(\"Succeeds when both '/' and '|' are allowed and used in the scope\", async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.mixedCustom),\n\t\t\t\t\"always\",\n\t\t\t\t[\"/\", \"|\"],\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(true);\n\t\t\texpect(error).toEqual(\"scope delimiters must be one of [/, |]\");\n\t\t});\n\n\t\ttest('In \"never\" mode fails when explicitly forbidden delimiter is used', async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.nonDefaultPipe),\n\t\t\t\t\"never\",\n\t\t\t\t[\"|\"],\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(false);\n\t\t\texpect(error).toEqual(\"scope delimiters must not be one of [|]\");\n\t\t});\n\n\t\ttest('In \"never\" mode succeeds when delimiter is not in the forbidden list', async () => {\n\t\t\tconst [actual, error] = scopeDelimiterStyle(\n\t\t\t\tawait parse(messages.nonDefaultPipe),\n\t\t\t\t\"never\",\n\t\t\t\t[\"/\"],\n\t\t\t);\n\n\t\t\texpect(actual).toEqual(true);\n\t\t\texpect(error).toEqual(\"scope delimiters must not be one of [/]\");\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "@commitlint/rules/src/scope-delimiter-style.ts",
    "content": "import * as ensure from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const scopeDelimiterStyle: SyncRule<string[]> = (\n\t{ scope },\n\twhen = \"always\",\n\tvalue = [],\n) => {\n\tif (!scope) {\n\t\treturn [true];\n\t}\n\n\tconst delimiters = value.length ? value : [\"/\", \"\\\\\", \",\"];\n\tconst scopeRawDelimiters = scope.match(/[^A-Za-z0-9-_]+/g) ?? [];\n\tconst scopeDelimiters = [\n\t\t...new Set(\n\t\t\tscopeRawDelimiters.map((delimiter) => {\n\t\t\t\treturn delimiter.trim() === \",\" ? \",\" : delimiter;\n\t\t\t}),\n\t\t),\n\t];\n\n\tconst isAllDelimitersAllowed = scopeDelimiters.every((delimiter) => {\n\t\treturn ensure.enum(delimiter, delimiters);\n\t});\n\tconst isNever = when === \"never\";\n\n\treturn [\n\t\tisNever ? !isAllDelimitersAllowed : isAllDelimitersAllowed,\n\t\tmessage([\n\t\t\t`scope delimiters must ${isNever ? \"not \" : \"\"}be one of [${delimiters.join(\", \")}]`,\n\t\t]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/scope-empty.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { scopeEmpty } from \"./scope-empty.js\";\n\nconst messages = {\n\tplain: \"foo(bar): baz\",\n\tsuperfluous: \"foo(): baz\",\n\tempty: \"foo: baz\",\n};\n\nconst parsed = {\n\tplain: parse(messages.plain),\n\tsuperfluous: parse(messages.superfluous),\n\tempty: parse(messages.empty),\n};\n\ntest(\"with plain message it should succeed for empty keyword\", async () => {\n\tconst [actual] = scopeEmpty(await parsed.plain);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with plain message it should succeed for \"never\"', async () => {\n\tconst [actual] = scopeEmpty(await parsed.plain, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with plain message it should fail for \"always\"', async () => {\n\tconst [actual] = scopeEmpty(await parsed.plain, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with superfluous message it should fail for empty keyword\", async () => {\n\tconst [actual] = scopeEmpty(await parsed.superfluous);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with superfluous message it should fail for \"never\"', async () => {\n\tconst [actual] = scopeEmpty(await parsed.superfluous, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with superfluous message it should fail for \"always\"', async () => {\n\tconst [actual] = scopeEmpty(await parsed.superfluous, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with empty message it should fail for empty keyword\", async () => {\n\tconst [actual] = scopeEmpty(await parsed.empty);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty message it should fail for \"never\"', async () => {\n\tconst [actual] = scopeEmpty(await parsed.empty, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty message it should fail for \"always\"', async () => {\n\tconst [actual] = scopeEmpty(await parsed.empty, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/scope-empty.ts",
    "content": "import * as ensure from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const scopeEmpty: SyncRule = (parsed, when = \"never\") => {\n\tconst negated = when === \"always\";\n\tconst notEmpty = ensure.notEmpty(parsed.scope || \"\");\n\treturn [\n\t\tnegated ? !notEmpty : notEmpty,\n\t\tmessage([\"scope\", negated ? \"must\" : \"may not\", \"be empty\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/scope-enum.test.ts",
    "content": "import { describe, test, it, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { RuleConfigCondition } from \"@commitlint/types\";\n\nimport { scopeEnum } from \"./scope-enum.js\";\n\nconst messagesByScope = {\n\tsingle: {\n\t\tplain: \"foo(bar): baz\",\n\t},\n\tmultiple: {\n\t\tmultiple: \"foo(bar,baz): qux\",\n\t\tmultipleCommaSpace: \"foo(bar, baz): qux\",\n\t\tmultipleSlash: \"foo(bar/baz): qux\",\n\t},\n\tnone: {\n\t\tempty: \"foo: baz\",\n\t\tsuperfluous: \"foo(): baz\",\n\t},\n\tobjectBaseConfiguration: {\n\t\tpipeDelimiter: \"foo(bar|baz): qux\",\n\t\tasteriskDelimiter: \"foo(bar*baz): qux\",\n\t\tmultipleCustomDelimiters: \"foo(bar|baz/qux*xyz): qux\",\n\t},\n};\n\nconst { single, multiple, none } = messagesByScope;\n\nconst messages = Object.values(messagesByScope).reduce<Record<string, string>>(\n\t(acc, curr) => ({ ...acc, ...curr }),\n\t{},\n);\n\nconst conditions: RuleConfigCondition[] = [\"always\", \"never\"];\n\ndescribe(\"Scope Enum Validation\", () => {\n\tdescribe.each(conditions)(\"condition: %s\", (condition) => {\n\t\tdescribe(\"Enum without Scopes\", () => {\n\t\t\ttest.each(Object.keys(messages))(\n\t\t\t\t`Succeeds with a %s message and '${condition}'`,\n\t\t\t\tasync (messageType) => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(messages[messageType]),\n\t\t\t\t\t\tcondition,\n\t\t\t\t\t\t[],\n\t\t\t\t\t);\n\t\t\t\t\tconst expected = true;\n\t\t\t\t\texpect(actual).toEqual(expected);\n\t\t\t\t\texpect(message).toEqual(\"\");\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\tdescribe(\"Messages without Scopes\", () => {\n\t\t\tObject.keys(none).forEach((messageType) => {\n\t\t\t\tconst fakeMessage = messages[messageType];\n\n\t\t\t\tit(`Succeeds with a '${messageType}' message and '${condition}' with single-scope enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\tcondition,\n\t\t\t\t\t\t[\"bar\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeTruthy();\n\t\t\t\t\texpect(message).toBeFalsy();\n\t\t\t\t});\n\n\t\t\t\tit(`Succeeds with a '${messageType}' message  and '${condition}' with multi-scope enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\tcondition,\n\t\t\t\t\t\t[\"bar\", \"baz\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeTruthy();\n\t\t\t\t\texpect(message).toBeFalsy();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Always\", () => {\n\t\tdescribe(\"Single-Scope Messages\", () => {\n\t\t\tObject.keys(single).forEach((messageType) => {\n\t\t\t\tconst fakeMessage = messages[messageType];\n\n\t\t\t\tit(`Succeeds with a '${messageType}' message when all message scopes are included in single-scope enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\t\"always\",\n\t\t\t\t\t\t[\"bar\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeTruthy();\n\t\t\t\t\texpect(message).toEqual(\"scope must be one of [bar]\");\n\t\t\t\t});\n\n\t\t\t\ttest(`Succeeds with a '${messageType}' message when all message scopes are included in multi-scope enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\t\"always\",\n\t\t\t\t\t\t[\"bar\", \"baz\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeTruthy();\n\t\t\t\t\texpect(message).toEqual(\"scope must be one of [bar, baz]\");\n\t\t\t\t});\n\n\t\t\t\ttest(`Fails with a '${messageType}' message when any message scope is not included in enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\t\"always\",\n\t\t\t\t\t\t[\"foo\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeFalsy();\n\t\t\t\t\texpect(message).toEqual(\"scope must be one of [foo]\");\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Multi-Scope Messages\", () => {\n\t\t\tObject.keys(multiple).forEach((messageType) => {\n\t\t\t\tconst fakeMessage = messages[messageType];\n\n\t\t\t\ttest(`Succeeds with a '${messageType}' message when all message scopes are included in enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\t\"always\",\n\t\t\t\t\t\t[\"bar\", \"baz\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeTruthy();\n\t\t\t\t\texpect(message).toEqual(\"scope must be one of [bar, baz]\");\n\t\t\t\t});\n\n\t\t\t\ttest(`Fails with a '${messageType}' message when no message scopes are included in enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\t\"always\",\n\t\t\t\t\t\t[\"foo\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeFalsy();\n\t\t\t\t\texpect(message).toEqual(\"scope must be one of [foo]\");\n\t\t\t\t});\n\n\t\t\t\tit(`Fails with a '${messageType}' message when only some message scopes are included in enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\t\"always\",\n\t\t\t\t\t\t[\"bar\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeFalsy();\n\t\t\t\t\texpect(message).toEqual(\"scope must be one of [bar]\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\ttest(`Succeeds with a 'multipleSlash' message when the scopes are included in enum`, async () => {\n\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\tawait parse(messages[\"multipleSlash\"]),\n\t\t\t\t\t\"always\",\n\t\t\t\t\t[\"bar/baz\"],\n\t\t\t\t);\n\t\t\t\texpect(actual).toBeTruthy();\n\t\t\t\texpect(message).toEqual(\"scope must be one of [bar/baz]\");\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Never\", () => {\n\t\tdescribe(\"Messages with Scopes\", () => {\n\t\t\tObject.keys({ ...single, ...multiple }).forEach((messageType) => {\n\t\t\t\tconst fakeMessage = messages[messageType];\n\n\t\t\t\ttest(`Succeeds with a '${messageType}' message when no message scopes are included in enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\t\"never\",\n\t\t\t\t\t\t[\"foo\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeTruthy();\n\t\t\t\t\texpect(message).toEqual(\"scope must not be one of [foo]\");\n\t\t\t\t});\n\n\t\t\t\tit(`Fails with a '${messageType}' message when any message scope is included in single-scope enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\t\"never\",\n\t\t\t\t\t\t[\"bar\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeFalsy();\n\t\t\t\t\texpect(message).toEqual(\"scope must not be one of [bar]\");\n\t\t\t\t});\n\n\t\t\t\ttest(`Fails with a '${messageType}' message when any message scope is included in multi-scope enum`, async () => {\n\t\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\t\tawait parse(fakeMessage),\n\t\t\t\t\t\t\"never\",\n\t\t\t\t\t\t[\"bar\", \"baz\"],\n\t\t\t\t\t);\n\t\t\t\t\texpect(actual).toBeFalsy();\n\t\t\t\t\texpect(message).toEqual(\"scope must not be one of [bar, baz]\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\ttest(`Fails with a 'multipleSlash' message when the scopes are included in enum`, async () => {\n\t\t\t\tconst [actual, message] = scopeEnum(\n\t\t\t\t\tawait parse(messages[\"multipleSlash\"]),\n\t\t\t\t\t\"never\",\n\t\t\t\t\t[\"bar/baz\"],\n\t\t\t\t);\n\t\t\t\texpect(actual).toBeFalsy();\n\t\t\t\texpect(message).toEqual(\"scope must not be one of [bar/baz]\");\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Object-based configuration\", () => {\n\t\ttest(\"Supports object value with default delimiters (/, \\\\ or ,)\", async () => {\n\t\t\tconst [actual, error] = scopeEnum(\n\t\t\t\tawait parse(messages[\"multipleCommaSpace\"]),\n\t\t\t\t\"always\",\n\t\t\t\t{\n\t\t\t\t\tscopes: [\"bar\", \"baz\"],\n\t\t\t\t},\n\t\t\t);\n\t\t\texpect(actual).toBe(true);\n\t\t\texpect(error).toEqual(\"scope must be one of [bar, baz]\");\n\t\t});\n\n\t\ttest(\"Supports custom single delimiter\", async () => {\n\t\t\tconst [actual, error] = scopeEnum(\n\t\t\t\tawait parse(messages[\"pipeDelimiter\"]),\n\t\t\t\t\"always\",\n\t\t\t\t{\n\t\t\t\t\tscopes: [\"bar\", \"baz\"],\n\t\t\t\t\tdelimiters: [\"|\"],\n\t\t\t\t},\n\t\t\t);\n\t\t\texpect(actual).toBe(true);\n\t\t\texpect(error).toEqual(\"scope must be one of [bar, baz]\");\n\t\t});\n\n\t\ttest(\"Supports multiple custom delimiters\", async () => {\n\t\t\tconst [actual, error] = scopeEnum(\n\t\t\t\tawait parse(messages[\"multipleCustomDelimiters\"]),\n\t\t\t\t\"always\",\n\t\t\t\t{\n\t\t\t\t\tscopes: [\"bar\", \"baz\", \"qux\", \"xyz\"],\n\t\t\t\t\tdelimiters: [\"|\", \"/\", \"*\"],\n\t\t\t\t},\n\t\t\t);\n\t\t\texpect(actual).toBe(true);\n\t\t\texpect(error).toEqual(\"scope must be one of [bar, baz, qux, xyz]\");\n\t\t});\n\n\t\ttest(\"Fails when any scope segment is not in enum with custom delimiter\", async () => {\n\t\t\tconst [actual, error] = scopeEnum(\n\t\t\t\tawait parse(messages[\"pipeDelimiter\"]),\n\t\t\t\t\"always\",\n\t\t\t\t{\n\t\t\t\t\tscopes: [\"bar\", \"qux\"],\n\t\t\t\t\tdelimiters: [\"|\"],\n\t\t\t\t},\n\t\t\t);\n\t\t\texpect(actual).toBe(false);\n\t\t\texpect(error).toEqual(\"scope must be one of [bar, qux]\");\n\t\t});\n\n\t\ttest(\"Falls back to default delimiters when delimiters is an empty array\", async () => {\n\t\t\tconst [actual, error] = scopeEnum(\n\t\t\t\tawait parse(messages[\"multipleSlash\"]),\n\t\t\t\t\"always\",\n\t\t\t\t{\n\t\t\t\t\tscopes: [\"bar\", \"baz\"],\n\t\t\t\t\tdelimiters: [],\n\t\t\t\t},\n\t\t\t);\n\t\t\texpect(actual).toBe(true);\n\t\t\texpect(error).toEqual(\"scope must be one of [bar, baz]\");\n\t\t});\n\n\t\ttest(\"Uses object value for 'never' with custom delimiter\", async () => {\n\t\t\tconst [actual, error] = scopeEnum(\n\t\t\t\tawait parse(messages[\"pipeDelimiter\"]),\n\t\t\t\t\"never\",\n\t\t\t\t{\n\t\t\t\t\tscopes: [\"bar\", \"baz\"],\n\t\t\t\t\tdelimiters: [\"|\"],\n\t\t\t\t},\n\t\t\t);\n\t\t\texpect(actual).toBe(false);\n\t\t\texpect(error).toEqual(\"scope must not be one of [bar, baz]\");\n\t\t});\n\n\t\ttest(\"Handles special characters in delimiters\", async () => {\n\t\t\tconst [actual, error] = scopeEnum(\n\t\t\t\tawait parse(messages[\"asteriskDelimiter\"]),\n\t\t\t\t\"always\",\n\t\t\t\t{\n\t\t\t\t\tscopes: [\"bar\", \"baz\"],\n\t\t\t\t\tdelimiters: [\"*\"],\n\t\t\t\t},\n\t\t\t);\n\t\t\texpect(actual).toBe(true);\n\t\t\texpect(error).toEqual(\"scope must be one of [bar, baz]\");\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "@commitlint/rules/src/scope-enum.ts",
    "content": "import * as ensure from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const scopeEnum: SyncRule<\n\t| string[]\n\t| {\n\t\t\tscopes: string[];\n\t\t\tdelimiters?: string[];\n\t  }\n> = ({ scope }, when = \"always\", value = []) => {\n\tconst scopes = Array.isArray(value) ? value : value.scopes;\n\n\tif (!scope || !scopes.length) {\n\t\treturn [true, \"\"];\n\t}\n\n\tconst delimiters =\n\t\tArray.isArray(value) || !value.delimiters?.length\n\t\t\t? [\"/\", \"\\\\\", \",\"]\n\t\t\t: value.delimiters;\n\tconst delimiterPatterns = delimiters.map((delimiter) => {\n\t\treturn delimiter === \",\"\n\t\t\t? \", ?\"\n\t\t\t: delimiter.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t});\n\tconst messageScopes = scope.split(new RegExp(delimiterPatterns.join(\"|\")));\n\tconst errorMessage = [\"scope must\", `be one of [${scopes.join(\", \")}]`];\n\tconst isScopeInEnum = (scope: string) => ensure.enum(scope, scopes);\n\tlet isValid;\n\n\tif (when === \"never\") {\n\t\tisValid = !messageScopes.some(isScopeInEnum) && !isScopeInEnum(scope);\n\t\terrorMessage.splice(1, 0, \"not\");\n\t} else {\n\t\tisValid = messageScopes.every(isScopeInEnum) || isScopeInEnum(scope);\n\t}\n\n\treturn [isValid, message(errorMessage)];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/scope-max-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { scopeMaxLength } from \"./scope-max-length.js\";\n\nconst short = \"a\";\nconst long = \"ab\";\n\nconst value = short.length;\n\nconst messages = {\n\tempty: \"test: \\n\",\n\tshort: `test(${short}): \\n`,\n\tlong: `test(${long}): \\n`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = scopeMaxLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should succeed\", async () => {\n\tconst [actual] = scopeMaxLength(await parsed.short, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should fail\", async () => {\n\tconst [actual] = scopeMaxLength(await parsed.long, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/scope-max-length.ts",
    "content": "import { maxLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const scopeMaxLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.scope;\n\n\tif (!input) {\n\t\treturn [true];\n\t}\n\n\treturn [\n\t\tmaxLength(input, value),\n\t\t`scope must not be longer than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/scope-min-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { scopeMinLength } from \"./scope-min-length.js\";\n\nconst short = \"a\";\nconst long = \"ab\";\n\nconst value = long.length;\n\nconst messages = {\n\tempty: \"test:\\n\",\n\tshort: `test(${short}): \\n`,\n\tlong: `test(${long}): \\n`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = scopeMinLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should fail\", async () => {\n\tconst [actual] = scopeMinLength(await parsed.short, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should succeed\", async () => {\n\tconst [actual] = scopeMinLength(await parsed.long, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/scope-min-length.ts",
    "content": "import { minLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const scopeMinLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.scope;\n\tif (!input) {\n\t\treturn [true];\n\t}\n\treturn [\n\t\tminLength(input, value),\n\t\t`scope must not be shorter than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/signed-off-by.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { signedOffBy } from \"./signed-off-by.js\";\n\nconst messages = {\n\tempty: \"test:\\n\",\n\twith: `test: subject\\nbody\\nfooter\\nSigned-off-by:\\n\\n`,\n\twithout: `test: subject\\nbody\\nfooter\\n\\n`,\n\tinSubject: `test: subject Signed-off-by:\\nbody\\nfooter\\n\\n`,\n\tinBody: `test: subject\\nbody Signed-off-by:\\nfooter\\n\\n`,\n\twithSignoffAndComments: `test: subject\n\nmessage body\n\nSigned-off-by:\n\n# Please enter the commit message for your changes. Lines starting\n# with '#' will be ignored, and an empty message aborts the commit.\n`,\n\n\twithSignoffAndCherryPick: `test: subject\n\nmessage body\n\nSigned-off-by:\n\n(cherry picked from commit 1234567aB)\n`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\twith: parse(messages.with),\n\twithout: parse(messages.without),\n\tinSubject: parse(messages.inSubject),\n\tinBody: parse(messages.inBody),\n\twithSignoffAndComments: parse(messages.withSignoffAndComments),\n\twithSignoffAndCherryPick: parse(messages.withSignoffAndCherryPick),\n};\n\ntest('empty against \"always signed-off-by\" should fail', async () => {\n\tconst [actual] = signedOffBy(await parsed.empty, \"always\", \"Signed-off-by:\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty against \"never signed-off-by\" should succeed', async () => {\n\tconst [actual] = signedOffBy(await parsed.empty, \"never\", \"Signed-off-by:\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"always signed-off-by\" should succeed', async () => {\n\tconst [actual] = signedOffBy(await parsed.with, \"always\", \"Signed-off-by:\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"never signed-off-by\" should fail', async () => {\n\tconst [actual] = signedOffBy(await parsed.with, \"never\", \"Signed-off-by:\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"always signed-off-by\" should fail', async () => {\n\tconst [actual] = signedOffBy(\n\t\tawait parsed.without,\n\t\t\"always\",\n\t\t\"Signed-off-by:\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"never signed-off-by\" should succeed', async () => {\n\tconst [actual] = signedOffBy(await parsed.without, \"never\", \"Signed-off-by:\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"trailing comments should be ignored\", async () => {\n\tconst [actual] = signedOffBy(\n\t\tawait parsed.withSignoffAndComments,\n\t\t\"always\",\n\t\t\"Signed-off-by:\",\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('inSubject against \"always signed-off-by\" should fail', async () => {\n\tconst [actual] = signedOffBy(\n\t\tawait parsed.inSubject,\n\t\t\"always\",\n\t\t\"Signed-off-by:\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('inSubject against \"never signed-off-by\" should succeed', async () => {\n\tconst [actual] = signedOffBy(\n\t\tawait parsed.inSubject,\n\t\t\"never\",\n\t\t\"Signed-off-by:\",\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('inBody against \"always signed-off-by\" should fail', async () => {\n\tconst [actual] = signedOffBy(await parsed.inBody, \"always\", \"Signed-off-by:\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('inBody against \"never signed-off-by\" should succeed', async () => {\n\tconst [actual] = signedOffBy(await parsed.inBody, \"never\", \"Signed-off-by:\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"cherry pick marker should be ignored\", async () => {\n\tconst [actual] = signedOffBy(\n\t\tawait parsed.withSignoffAndCherryPick,\n\t\t\"always\",\n\t\t\"Signed-off-by:\",\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('cherry pick marker with \"never signed-off-by\" should fail', async () => {\n\tconst [actual] = signedOffBy(\n\t\tawait parsed.withSignoffAndCherryPick,\n\t\t\"never\",\n\t\t\"Signed-off-by:\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/signed-off-by.ts",
    "content": "import message from \"@commitlint/message\";\nimport toLines from \"@commitlint/to-lines\";\nimport { SyncRule } from \"@commitlint/types\";\n\nconst CHERRY_PICK_REGEX = /^\\(cherry picked from commit [0-9a-f]{7,64}\\)$/i;\n\nexport const signedOffBy: SyncRule<string> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = \"\",\n) => {\n\tconst lines = toLines(parsed.raw).filter(\n\t\t(ln) =>\n\t\t\t// skip comments\n\t\t\t!ln.startsWith(\"#\") &&\n\t\t\t// skip cherry pick commits\n\t\t\t!CHERRY_PICK_REGEX.test(ln.trim()) &&\n\t\t\t// ignore empty lines\n\t\t\tBoolean(ln),\n\t);\n\n\tconst last = lines[lines.length - 1];\n\n\tconst negated = when === \"never\";\n\tconst hasSignedOffBy =\n\t\t// empty commit message\n\t\tlast ? last.startsWith(value) : false;\n\n\treturn [\n\t\tnegated ? !hasSignedOffBy : hasSignedOffBy,\n\t\tmessage([\"message\", negated ? \"must not\" : \"must\", \"be signed off\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/subject-case.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { subjectCase } from \"./subject-case.js\";\n\nconst messages = {\n\tempty: \"test:\\n\",\n\tnumeric: \"test: 1.0.0\",\n\tlowercase: \"test: subject\",\n\tlowercase_unicode: \"test: тема\", // Bulgarian for `subject`\n\tmixedcase: \"test: sUbJeCt\",\n\tcaseless: \"test: 这是一次提交\", // Chinese for `this is a commit`\n\tuppercase: \"test: SUBJECT\",\n\tuppercase_unicode: \"test: ÛNDERWERP\", // Frisian for `SUBJECT`\n\tcamelcase: \"test: subJect\",\n\tcamelcase_unicode: \"test: θέΜα\", // Greek for `subJect`\n\tkebabcase: \"test: sub-ject\",\n\tkebabcase_unicode: \"test: áb-har\", // Irish for `sub-ject`\n\tpascalcase: \"test: SubJect\",\n\tpascalcase_unicode: \"test: ТақыРып\", // Kazakh for `SubJect`\n\tsnakecase: \"test: sub_ject\",\n\tsnakecase_unicode: \"test: сэ_дэв\", // Mongolian for `sub_ject`\n\tstartcase: \"test: Sub Ject\",\n\tstartcase_unicode: \"test: Äm Ne\", // Swedish for `Sub Ject`\n\tsentencecase: \"test: Sub ject\",\n\tsentencecase_unicode: \"test: Мав зуъ\", // Tajik for `Sub ject`\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tnumeric: parse(messages.numeric),\n\tlowercase: parse(messages.lowercase),\n\tlowercase_unicode: parse(messages.lowercase_unicode),\n\tmixedcase: parse(messages.mixedcase),\n\tcaseless: parse(messages.caseless),\n\tuppercase: parse(messages.uppercase),\n\tuppercase_unicode: parse(messages.uppercase_unicode),\n\tcamelcase: parse(messages.camelcase),\n\tcamelcase_unicode: parse(messages.camelcase_unicode),\n\tkebabcase: parse(messages.kebabcase),\n\tkebabcase_unicode: parse(messages.kebabcase_unicode),\n\tpascalcase: parse(messages.pascalcase),\n\tpascalcase_unicode: parse(messages.pascalcase_unicode),\n\tsnakecase: parse(messages.snakecase),\n\tsnakecase_unicode: parse(messages.snakecase_unicode),\n\tstartcase: parse(messages.startcase),\n\tstartcase_unicode: parse(messages.startcase_unicode),\n\tsentencecase: parse(messages.sentencecase),\n\tsentencecase_unicode: parse(messages.sentencecase_unicode),\n};\n\ntest('with empty subject should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.empty, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty subject should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.empty, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty subject should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.empty, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty subject should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.empty, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase subject should fail for \"never lowercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.lowercase, \"never\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase subject should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.lowercase, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase unicode subject should fail for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.lowercase_unicode,\n\t\t\"always\",\n\t\t\"upper-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase subject should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.mixedcase, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase subject should fail for \"always lowercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.mixedcase, \"always\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase subject should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.mixedcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase subject should fail for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.mixedcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with caseless subject should succeed for \"never sentencecase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.caseless, \"never\", \"sentence-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with caseless subject should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.caseless, \"never\", \"upper-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with caseless subject should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.caseless, \"always\", \"upper-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase subject should fail for \"never uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.uppercase, \"never\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase subject should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.uppercase, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase unicode subject should fail for \"always lowercase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.uppercase_unicode,\n\t\t\"always\",\n\t\t\"lower-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase subject should fail for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.camelcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase subject should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.camelcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase subject should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.camelcase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase subject should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.camelcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase subject should fail for \"always snakecase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.camelcase, \"always\", \"snake-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase subject should succeed for \"always camelcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.camelcase, \"always\", \"camel-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase unicode subject should fail for \"always sentencecase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.camelcase_unicode,\n\t\t\"always\",\n\t\t\"sentence-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with kebabcase unicode subject should fail for \"always camelcase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.kebabcase_unicode,\n\t\t\"always\",\n\t\t\"camel-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase subject should fail for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.pascalcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase subject should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.pascalcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase subject should succeed for \"always pascalcase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.pascalcase,\n\t\t\"always\",\n\t\t\"pascal-case\",\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase subject should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.pascalcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase subject should fail for \"always snakecase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.pascalcase, \"always\", \"snake-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase subject should fail for \"always camelcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.pascalcase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase unicode subject should fail for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.pascalcase_unicode,\n\t\t\"always\",\n\t\t\"upper-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase subject should fail for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.snakecase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase subject should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.snakecase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase subject should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.snakecase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase subject should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.snakecase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase subject should succeed for \"always snakecase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.snakecase, \"always\", \"snake-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase subject should fail for \"always camelcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.snakecase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase unicode subject should fail for \"never lowercase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.snakecase_unicode,\n\t\t\"never\",\n\t\t\"lower-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase subject should fail for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.startcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase subject should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.startcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase subject should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.startcase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase subject should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.startcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase subject should fail for \"always snakecase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.startcase, \"always\", \"snake-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase subject should fail for \"always camelcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.startcase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase subject should succeed for \"always startcase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.startcase, \"always\", \"start-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase unicode subject should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.startcase_unicode,\n\t\t\"always\",\n\t\t\"pascal-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with sentencecase subject should succeed for \"always sentence-case\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.sentencecase,\n\t\t\"always\",\n\t\t\"sentence-case\",\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with sentencecase subject should fail for \"never sentencecase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.sentencecase,\n\t\t\"never\",\n\t\t\"sentence-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with sentencecase subject should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.sentencecase,\n\t\t\"always\",\n\t\t\"pascal-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with sentencecase subject should succeed for \"never camelcase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.sentencecase,\n\t\t\"never\",\n\t\t\"camel-case\",\n\t);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with sentencecase unicode subject should fail for \"always camelcase\"', async () => {\n\tconst [actual] = subjectCase(\n\t\tawait parsed.sentencecase_unicode,\n\t\t\"always\",\n\t\t\"camel-case\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('should use expected message with \"always\"', async () => {\n\tconst [, message] = subjectCase(\n\t\tawait parsed.uppercase,\n\t\t\"always\",\n\t\t\"lower-case\",\n\t);\n\texpect(message).toContain(\"must be lower-case\");\n});\n\ntest('should use expected message with \"never\"', async () => {\n\tconst [, message] = subjectCase(\n\t\tawait parsed.uppercase,\n\t\t\"never\",\n\t\t\"upper-case\",\n\t);\n\texpect(message).toContain(\"must not be upper-case\");\n});\n\ntest('with uppercase scope should succeed for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = subjectCase(await parsed.uppercase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase subject should succeed for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = subjectCase(await parsed.lowercase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase subject should fail for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = subjectCase(await parsed.mixedcase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase subject should pass for \"always [uppercase, lowercase, camel-case]\"', async () => {\n\tconst [actual] = subjectCase(await parsed.mixedcase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t\t\"camel-case\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should pass for \"never [uppercase, lowercase]\"', async () => {\n\tconst [actual] = subjectCase(await parsed.mixedcase, \"never\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase scope should fail for \"never [uppercase, lowercase]\"', async () => {\n\tconst [actual] = subjectCase(await parsed.uppercase, \"never\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with numeric subject should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.numeric, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with numeric subject should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.numeric, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with numeric subject should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.numeric, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with numeric subject should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = subjectCase(await parsed.numeric, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"accepts lowercase Cyrillic subjects\", async () => {\n\tconst message = \"chore(deps): обновлены все зависимости\";\n\tconst parsed = await parse(message);\n\tconst [actual] = subjectCase(parsed, \"never\", [\n\t\t\"sentence-case\",\n\t\t\"start-case\",\n\t\t\"pascal-case\",\n\t\t\"upper-case\",\n\t]);\n\n\texpect(actual).toBe(true);\n});\n\ntest(\"rejects uppercase Cyrillic subjects\", async () => {\n\tconst message = \"chore(deps): ОБНОВЛЕНЫ ВСЕ ЗАВИСИМОСТИ\";\n\tconst parsed = await parse(message);\n\tconst [actual] = subjectCase(parsed, \"never\", [\n\t\t\"sentence-case\",\n\t\t\"start-case\",\n\t\t\"pascal-case\",\n\t\t\"upper-case\",\n\t]);\n\n\texpect(actual).toBe(false);\n});\n\ntest(\"accepts lowercase Chinese subjects\", async () => {\n\tconst message = \"fix(面试): 修复评价功能\";\n\tconst parsed = await parse(message);\n\tconst [actual] = subjectCase(parsed, \"never\", [\n\t\t\"sentence-case\",\n\t\t\"start-case\",\n\t\t\"pascal-case\",\n\t\t\"upper-case\",\n\t]);\n\n\texpect(actual).toBe(true);\n});\n\ntest(\"accepts lowercase Arabic subjects\", async () => {\n\tconst message = \"feat(مميزات): إضافة وظيفة جديدة\";\n\tconst parsed = await parse(message);\n\tconst [actual] = subjectCase(parsed, \"never\", [\n\t\t\"sentence-case\",\n\t\t\"start-case\",\n\t\t\"pascal-case\",\n\t\t\"upper-case\",\n\t]);\n\n\texpect(actual).toBe(true);\n});\n\ntest(\"accepts lowercase Hebrew subjects\", async () => {\n\tconst message = \"fix(תיקון): תיקון בעיה\";\n\tconst parsed = await parse(message);\n\tconst [actual] = subjectCase(parsed, \"never\", [\n\t\t\"sentence-case\",\n\t\t\"start-case\",\n\t\t\"pascal-case\",\n\t\t\"upper-case\",\n\t]);\n\n\texpect(actual).toBe(true);\n});\n\ntest(\"accepts mixed Latin and Cyrillic lowercase subjects\", async () => {\n\tconst message = \"chore(deps): update зависимости\";\n\tconst parsed = await parse(message);\n\tconst [actual] = subjectCase(parsed, \"never\", [\n\t\t\"sentence-case\",\n\t\t\"start-case\",\n\t\t\"pascal-case\",\n\t\t\"upper-case\",\n\t]);\n\n\texpect(actual).toBe(true);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/subject-case.ts",
    "content": "import { case as ensureCase } from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { TargetCaseType, SyncRule } from \"@commitlint/types\";\n\n/**\n * Since the rule requires first symbol of a subject to be a letter, use\n * Unicode `Cased_Letter` category now to allow non-Latin alphabets as well.\n *\n * Do not use `Letter` category directly to avoid capturing `Modifier_Letter`\n * (which just modifiers letters, so we probably shouldn't anyway) and\n * `Other_Letter` (they actually are case-less, so they can't be validated)\n * categories, and to stay close to previous implementation.\n *\n * Also, typescript does not seem to support almost any longhand category name\n * (and even short for `Cased_Letter` too) so list all required letter\n * categories manually just to prevent it from complaining about unknown stuff.\n *\n * @see [Unicode Categories]{@link https://www.regular-expressions.info/unicode.html}\n */\nconst startsWithLetterRegex = /^[\\p{Ll}\\p{Lu}\\p{Lt}]/iu;\n\nconst negated = (when?: string) => when === \"never\";\n\nexport const subjectCase: SyncRule<TargetCaseType | TargetCaseType[]> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = [],\n) => {\n\tconst { subject } = parsed;\n\n\tif (typeof subject !== \"string\" || !subject.match(startsWithLetterRegex)) {\n\t\treturn [true];\n\t}\n\n\tconst checks = (Array.isArray(value) ? value : [value]).map((check) => {\n\t\tif (typeof check === \"string\") {\n\t\t\treturn {\n\t\t\t\twhen: \"always\",\n\t\t\t\tcase: check,\n\t\t\t};\n\t\t}\n\t\treturn check;\n\t});\n\n\tconst result = checks.some((check) => {\n\t\tconst r = ensureCase(subject, check.case);\n\t\treturn negated(check.when) ? !r : r;\n\t});\n\n\tconst list = checks.map((c) => c.case).join(\", \");\n\n\treturn [\n\t\tnegated(when) ? !result : result,\n\t\tmessage([`subject must`, negated(when) ? `not` : null, `be ${list}`]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/subject-empty.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { subjectEmpty } from \"./subject-empty.js\";\n\nconst messages = {\n\tempty: \"test: \\nbody\",\n\tfilled: \"test: subject\\nbody\",\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tfilled: parse(messages.filled),\n};\n\ntest(\"without subject should succeed for empty keyword\", async () => {\n\tconst [actual] = subjectEmpty(await parsed.empty);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without subject should fail for \"never\"', async () => {\n\tconst [actual] = subjectEmpty(await parsed.empty, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without subject should succeed for \"always\"', async () => {\n\tconst [actual] = subjectEmpty(await parsed.empty, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with subject fail for empty keyword\", async () => {\n\tconst [actual] = subjectEmpty(await parsed.filled);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with subject succeed for \"never\"', async () => {\n\tconst [actual] = subjectEmpty(await parsed.filled, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with subject fail for \"always\"', async () => {\n\tconst [actual] = subjectEmpty(await parsed.filled, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/subject-empty.ts",
    "content": "import * as ensure from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const subjectEmpty: SyncRule = (parsed, when = \"always\") => {\n\tconst negated = when === \"never\";\n\tconst notEmpty = ensure.notEmpty(parsed.subject || \"\");\n\n\treturn [\n\t\tnegated ? notEmpty : !notEmpty,\n\t\tmessage([\"subject\", negated ? \"may not\" : \"must\", \"be empty\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/subject-exclamation-mark.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\n// @ts-expect-error -- no typings\nimport preset from \"conventional-changelog-angular\";\n\nimport { subjectExclamationMark } from \"./subject-exclamation-mark.js\";\n\nconst parseMessage = async (str: string) => {\n\tconst { parserOpts } = await preset();\n\treturn parse(str, undefined, parserOpts);\n};\n\nconst messages = {\n\tempty: \"test:\\n\",\n\twith: `test!: subject\\n`,\n\twithout: `test: subject\\n`,\n};\n\nconst parsed = {\n\tempty: parseMessage(messages.empty),\n\twith: parseMessage(messages.with),\n\twithout: parseMessage(messages.without),\n};\n\ntest('empty against \"always\" should fail', async () => {\n\tconst [actual] = subjectExclamationMark(await parsed.empty, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty against \"never\" should succeed', async () => {\n\tconst [actual] = subjectExclamationMark(await parsed.empty, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"always\" should succeed', async () => {\n\tconst [actual] = subjectExclamationMark(await parsed.with, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"never\" should fail', async () => {\n\tconst [actual] = subjectExclamationMark(await parsed.with, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"always\" should fail', async () => {\n\tconst [actual] = subjectExclamationMark(await parsed.without, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"never\" should succeed', async () => {\n\tconst [actual] = subjectExclamationMark(await parsed.without, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/subject-exclamation-mark.ts",
    "content": "import message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const subjectExclamationMark: SyncRule = (parsed, when = \"always\") => {\n\tconst input = parsed.header;\n\tif (!input) {\n\t\treturn [true, \"\"];\n\t}\n\n\tconst negated = when === \"never\";\n\tconst hasExclamationMark = /^(\\w*)(?:\\((.*)\\))?!: (.*)$/.test(input);\n\n\treturn [\n\t\tnegated ? !hasExclamationMark : hasExclamationMark,\n\t\tmessage([\n\t\t\t\"subject\",\n\t\t\tnegated ? \"must not\" : \"must\",\n\t\t\t\"have an exclamation mark in the subject to identify a breaking change\",\n\t\t]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/subject-full-stop.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { subjectFullStop } from \"./subject-full-stop.js\";\n\nconst messages = {\n\tempty: \"test:\\n\",\n\twith: `test: subject.\\n`,\n\twithout: `test: subject\\n`,\n\tstandardScopeWith: `type(scope): subject.\\n`,\n\tnonStandardScopeWith: \"type.scope: subject.\\n\",\n\tellipsisMessage: \"test: subject ends with ellipsis...\",\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\twith: parse(messages.with),\n\twithout: parse(messages.without),\n\tstandardScopeWith: parse(messages.standardScopeWith),\n\tnonStandardScopeWith: parse(messages.nonStandardScopeWith),\n\tellipsisMessage: parse(messages.ellipsisMessage),\n};\n\ntest('empty against \"always\" should succeed', async () => {\n\tconst [actual] = subjectFullStop(await parsed.empty, \"always\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty against \"never .\" should succeed', async () => {\n\tconst [actual] = subjectFullStop(await parsed.empty, \"never\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"always .\" should succeed', async () => {\n\tconst [actual] = subjectFullStop(await parsed.with, \"always\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"never .\" should fail', async () => {\n\tconst [actual] = subjectFullStop(await parsed.with, \"never\", \".\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"always .\" should fail', async () => {\n\tconst [actual] = subjectFullStop(await parsed.without, \"always\", \".\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"never .\" should succeed', async () => {\n\tconst [actual] = subjectFullStop(await parsed.without, \"never\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('commit message title with standard scope and full-stop against \"never .\" should fail', async () => {\n\tconst [actual] = subjectFullStop(\n\t\tawait parsed.standardScopeWith,\n\t\t\"never\",\n\t\t\".\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('commit message title with non standard scope and full-stop against \"never .\" should fail', async () => {\n\tconst [actual] = subjectFullStop(\n\t\tawait parsed.nonStandardScopeWith,\n\t\t\"never\",\n\t\t\".\",\n\t);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('ellipsis is not fullstop so commit title ending with it against \"never .\" should not fail', async () => {\n\tconst [actual] = subjectFullStop(await parsed.ellipsisMessage, \"never\", \".\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/subject-full-stop.ts",
    "content": "import message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const subjectFullStop: SyncRule<string> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = \".\",\n) => {\n\tconst colonIndex = parsed.header?.indexOf(\":\") || 0;\n\tif (colonIndex > 0 && colonIndex === parsed.header!.length - 1) {\n\t\treturn [true];\n\t}\n\n\tconst input = parsed.header;\n\n\tconst negated = when === \"never\";\n\tlet hasStop = input?.[input.length - 1] === value;\n\tif (input?.slice(-3) === \"...\") {\n\t\thasStop = false;\n\t}\n\n\treturn [\n\t\tnegated ? !hasStop : hasStop,\n\t\tmessage([\"subject\", negated ? \"may not\" : \"must\", \"end with full stop\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/subject-max-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { subjectMaxLength } from \"./subject-max-length.js\";\n\nconst short = \"a\";\nconst long = \"ab\";\n\nconst value = short.length;\n\nconst messages = {\n\tempty: \"test:\\n\",\n\tshort: `test: ${short}\\n`,\n\tlong: `test: ${long}\\n`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = subjectMaxLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should succeed\", async () => {\n\tconst [actual] = subjectMaxLength(await parsed.short, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should fail\", async () => {\n\tconst [actual] = subjectMaxLength(await parsed.long, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/subject-max-length.ts",
    "content": "import { maxLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const subjectMaxLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.subject;\n\n\tif (!input) {\n\t\treturn [true];\n\t}\n\n\treturn [\n\t\tmaxLength(input, value),\n\t\t`subject must not be longer than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/subject-min-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { subjectMinLength } from \"./subject-min-length.js\";\n\nconst short = \"a\";\nconst long = \"ab\";\n\nconst value = long.length;\n\nconst messages = {\n\tempty: \"test:\\n\",\n\tshort: `test: ${short}\\n`,\n\tlong: `test: ${long}\\n`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = subjectMinLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should fail\", async () => {\n\tconst [actual] = subjectMinLength(await parsed.short, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should succeed\", async () => {\n\tconst [actual] = subjectMinLength(await parsed.long, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/subject-min-length.ts",
    "content": "import { minLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const subjectMinLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.subject;\n\tif (!input) {\n\t\treturn [true];\n\t}\n\treturn [\n\t\tminLength(input, value),\n\t\t`subject must not be shorter than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/trailer-exists.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { trailerExists } from \"./trailer-exists.js\";\n\nconst messages = {\n\tempty: \"test:\\n\",\n\twith: `test: subject\\n\\nbody\\n\\nfooter\\n\\nSigned-off-by:\\n\\n`,\n\twithout: `test: subject\\n\\nbody\\n\\nfooter\\n\\n`,\n\tinSubject: `test: subject Signed-off-by:\\n\\nbody\\n\\nfooter\\n\\n`,\n\tinBody: `test: subject\\n\\nbody Signed-off-by:\\n\\nfooter\\n\\n`,\n\twithSignoffAndNoise: `test: subject\n\nmessage body\n\nArbitrary-trailer:\nSigned-off-by:\nAnother-arbitrary-trailer:\n\n# Please enter the commit message for your changes. Lines starting\n# with '#' will be ignored, and an empty message aborts the commit.\n`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\twith: parse(messages.with),\n\twithout: parse(messages.without),\n\tinSubject: parse(messages.inSubject),\n\tinBody: parse(messages.inBody),\n\twithSignoffAndNoise: parse(messages.withSignoffAndNoise),\n};\n\ntest('empty against \"always trailer-exists\" should fail', async () => {\n\tconst [actual] = trailerExists(\n\t\tawait parsed.empty,\n\t\t\"always\",\n\t\t\"Signed-off-by:\",\n\t);\n\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty against \"never trailer-exists\" should succeed', async () => {\n\tconst [actual] = trailerExists(await parsed.empty, \"never\", \"Signed-off-by:\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"always trailer-exists\" should succeed', async () => {\n\tconst [actual] = trailerExists(await parsed.with, \"always\", \"Signed-off-by:\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with against \"never trailer-exists\" should fail', async () => {\n\tconst [actual] = trailerExists(await parsed.with, \"never\", \"Signed-off-by:\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"always trailer-exists\" should fail', async () => {\n\tconst [actual] = trailerExists(\n\t\tawait parsed.without,\n\t\t\"always\",\n\t\t\"Signed-off-by:\",\n\t);\n\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without against \"never trailer-exists\" should succeed', async () => {\n\tconst [actual] = trailerExists(\n\t\tawait parsed.without,\n\t\t\"never\",\n\t\t\"Signed-off-by:\",\n\t);\n\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"comments and other trailers should be ignored\", async () => {\n\tconst [actual] = trailerExists(\n\t\tawait parsed.withSignoffAndNoise,\n\t\t\"always\",\n\t\t\"Signed-off-by:\",\n\t);\n\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('inSubject against \"always trailer-exists\" should fail', async () => {\n\tconst [actual] = trailerExists(\n\t\tawait parsed.inSubject,\n\t\t\"always\",\n\t\t\"Signed-off-by:\",\n\t);\n\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('inSubject against \"never trailer-exists\" should succeed', async () => {\n\tconst [actual] = trailerExists(\n\t\tawait parsed.inSubject,\n\t\t\"never\",\n\t\t\"Signed-off-by:\",\n\t);\n\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('inBody against \"always trailer-exists\" should fail', async () => {\n\tconst [actual] = trailerExists(\n\t\tawait parsed.inBody,\n\t\t\"always\",\n\t\t\"Signed-off-by:\",\n\t);\n\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('inBody against \"never trailer-exists\" should succeed', async () => {\n\tconst [actual] = trailerExists(\n\t\tawait parsed.inBody,\n\t\t\"never\",\n\t\t\"Signed-off-by:\",\n\t);\n\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/trailer-exists.ts",
    "content": "import { spawnSync } from \"node:child_process\";\nimport message from \"@commitlint/message\";\nimport toLines from \"@commitlint/to-lines\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const trailerExists: SyncRule<string> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = \"\",\n) => {\n\tconst trailers = spawnSync(\"git\", [\"interpret-trailers\", \"--parse\"], {\n\t\tinput: parsed.raw || \"\",\n\t}).stdout;\n\n\tconst matches = toLines(trailers.toString()).filter((ln) =>\n\t\tln.startsWith(value),\n\t).length;\n\n\tconst negated = when === \"never\";\n\tconst hasTrailer = matches > 0;\n\n\treturn [\n\t\tnegated ? !hasTrailer : hasTrailer,\n\t\tmessage([\n\t\t\t\"message\",\n\t\t\tnegated ? \"must not\" : \"must\",\n\t\t\t\"have `\" + value + \"` trailer\",\n\t\t]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/type-case.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { typeCase } from \"./type-case.js\";\n\nconst messages = {\n\tempty: \"(scope): subject\",\n\tlowercase: \"type: subject\",\n\tmixedcase: \"tYpE: subject\",\n\tuppercase: \"TYPE: subject\",\n\tcamelcase: \"tyPe: subject\",\n\tpascalcase: \"TyPe: subject\",\n\tsnakecase: \"ty_pe: subject\",\n\tkebabcase: \"ty-pe: subject\",\n\tstartcase: \"Ty Pe: subject\",\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tlowercase: parse(messages.lowercase),\n\tmixedcase: parse(messages.mixedcase),\n\tuppercase: parse(messages.uppercase),\n\tcamelcase: parse(messages.camelcase),\n\tpascalcase: parse(messages.pascalcase),\n\tsnakecase: parse(messages.snakecase),\n\tkebabcase: parse(messages.kebabcase),\n\tstartcase: parse(messages.startcase, undefined, {\n\t\theaderPattern: /^(.*): (.*)$/,\n\t\theaderCorrespondence: [\"type\", \"subject\"],\n\t}),\n};\n\ntest('with empty type should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.empty, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty type should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.empty, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty type should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.empty, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with empty type should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.empty, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase type should fail for \"never lowercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.lowercase, \"never\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase type should succeed for \"always lowercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.lowercase, \"always\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase type should succeed for \"never lowercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.mixedcase, \"never\", \"lowercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase type should fail for \"always lowercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.mixedcase, \"always\", \"lowercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase type should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.mixedcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase type should fail for \"always uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.mixedcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase type should fail for \"never uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.uppercase, \"never\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase type should succeed for \"always uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.uppercase, \"always\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase type should fail for \"always uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.camelcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase type should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.camelcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase type should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.camelcase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase type should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.camelcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase type should fail for \"always snakecase\"', async () => {\n\tconst [actual] = typeCase(await parsed.camelcase, \"always\", \"snake-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase type should fail for \"always startcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.camelcase, \"always\", \"start-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with camelcase type should succeed for \"always camelcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.camelcase, \"always\", \"camel-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase type should fail for \"always uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.pascalcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase type should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.pascalcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase type should fail for \"always camelcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.pascalcase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase type should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.pascalcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase type should fail for \"always snakecase\"', async () => {\n\tconst [actual] = typeCase(await parsed.pascalcase, \"always\", \"snake-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase type should fail for \"always startcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.pascalcase, \"always\", \"start-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with pascalcase type should succeed for \"always pascalcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.pascalcase, \"always\", \"pascal-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase type should fail for \"always uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.snakecase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase type should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.snakecase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase type should fail for \"always camelcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.snakecase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase type should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.snakecase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase type should succeed for \"always snakecase\"', async () => {\n\tconst [actual] = typeCase(await parsed.snakecase, \"always\", \"snake-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase type should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.snakecase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with snakecase type should fail for \"always start case\"', async () => {\n\tconst [actual] = typeCase(await parsed.snakecase, \"always\", \"start-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase type should fail for \"always uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.startcase, \"always\", \"uppercase\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase type should succeed for \"never uppercase\"', async () => {\n\tconst [actual] = typeCase(await parsed.startcase, \"never\", \"uppercase\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase type should fail for \"always camelcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.startcase, \"always\", \"camel-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase type should fail for \"always kebabcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.startcase, \"always\", \"kebab-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase type should fail for \"always snakecase\"', async () => {\n\tconst [actual] = typeCase(await parsed.startcase, \"always\", \"snake-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase type should fail for \"always pascalcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.startcase, \"always\", \"pascal-case\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with startcase type should succeed for \"always startcase\"', async () => {\n\tconst [actual] = typeCase(await parsed.startcase, \"always\", \"start-case\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase scope should succeed for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = typeCase(await parsed.uppercase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with lowercase subject should succeed for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = typeCase(await parsed.lowercase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase subject should fail for \"always [uppercase, lowercase]\"', async () => {\n\tconst [actual] = typeCase(await parsed.mixedcase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase subject should pass for \"always [uppercase, lowercase, camel-case]\"', async () => {\n\tconst [actual] = typeCase(await parsed.mixedcase, \"always\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t\t\"camel-case\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with mixedcase scope should pass for \"never [uppercase, lowercase]\"', async () => {\n\tconst [actual] = typeCase(await parsed.mixedcase, \"never\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with uppercase scope should fail for \"never [uppercase, lowercase]\"', async () => {\n\tconst [actual] = typeCase(await parsed.uppercase, \"never\", [\n\t\t\"uppercase\",\n\t\t\"lowercase\",\n\t]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/type-case.ts",
    "content": "import { case as ensureCase } from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { TargetCaseType, SyncRule } from \"@commitlint/types\";\n\nconst negated = (when?: string) => when === \"never\";\n\nexport const typeCase: SyncRule<TargetCaseType | TargetCaseType[]> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = [],\n) => {\n\tconst { type } = parsed;\n\n\tif (!type) {\n\t\treturn [true];\n\t}\n\n\tconst checks = (Array.isArray(value) ? value : [value]).map((check) => {\n\t\tif (typeof check === \"string\") {\n\t\t\treturn {\n\t\t\t\twhen: \"always\",\n\t\t\t\tcase: check,\n\t\t\t};\n\t\t}\n\t\treturn check;\n\t});\n\n\tconst result = checks.some((check) => {\n\t\tconst r = ensureCase(type, check.case);\n\t\treturn negated(check.when) ? !r : r;\n\t});\n\n\tconst list = checks.map((c) => c.case).join(\", \");\n\n\treturn [\n\t\tnegated(when) ? !result : result,\n\t\tmessage([`type must`, negated(when) ? `not` : null, `be ${list}`]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/type-empty.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { typeEmpty } from \"./type-empty.js\";\n\nconst messages = {\n\tempty: \"(scope):\",\n\tfilled: \"type: subject\",\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tfilled: parse(messages.filled),\n};\n\ntest(\"without type should succeed for empty keyword\", async () => {\n\tconst [actual] = typeEmpty(await parsed.empty);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without type should fail for \"never\"', async () => {\n\tconst [actual] = typeEmpty(await parsed.empty, \"never\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('without type should succeed for \"always\"', async () => {\n\tconst [actual] = typeEmpty(await parsed.empty, \"always\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with type fail for empty keyword\", async () => {\n\tconst [actual] = typeEmpty(await parsed.filled);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with type succeed for \"never\"', async () => {\n\tconst [actual] = typeEmpty(await parsed.filled, \"never\");\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('with type fail for \"always\"', async () => {\n\tconst [actual] = typeEmpty(await parsed.filled, \"always\");\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/type-empty.ts",
    "content": "import * as ensure from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const typeEmpty: SyncRule = (parsed, when = \"always\") => {\n\tconst negated = when === \"never\";\n\tconst notEmpty = ensure.notEmpty(parsed.type || \"\");\n\treturn [\n\t\tnegated ? notEmpty : !notEmpty,\n\t\tmessage([\"type\", negated ? \"may not\" : \"must\", \"be empty\"]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/type-enum.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { typeEnum } from \"./type-enum.js\";\n\nconst messages = {\n\tempty: \"(): \\n\",\n\ta: \"a(): \\n\",\n\tb: \"b(): \\n\",\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\ta: parse(messages.a),\n\tb: parse(messages.b),\n};\n\ntest(\"empty succeeds\", async () => {\n\tconst [actual] = typeEnum(await parsed.empty);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty on \"a\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.empty, undefined, [\"a\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty on \"always a\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.empty, \"always\", [\"a\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty on \"never a\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.empty, \"never\", [\"a\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty on \"always a, b\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.empty, \"always\", [\"a\", \"b\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('empty on \"never a, b\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.empty, \"never\", [\"a\", \"b\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('a on \"a\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.a, undefined, [\"a\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('a on \"always a\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.a, \"always\", [\"a\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('a on \"never a\" fails', async () => {\n\tconst [actual] = typeEnum(await parsed.a, \"never\", [\"a\"]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('b on \"b\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.b, undefined, [\"b\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('b on \"always b\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.b, \"always\", [\"b\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('b on \"never b\" fails', async () => {\n\tconst [actual] = typeEnum(await parsed.b, \"never\", [\"b\"]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('a on \"a, b\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.a, undefined, [\"a\", \"b\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('a on \"always a, b\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.a, \"always\", [\"a\", \"b\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('a on \"never a, b\" fails', async () => {\n\tconst [actual] = typeEnum(await parsed.a, \"never\", [\"a\", \"b\"]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest('b on \"a, b\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.b, undefined, [\"a\", \"b\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('b on \"always a, b\" succeeds', async () => {\n\tconst [actual] = typeEnum(await parsed.b, \"always\", [\"a\", \"b\"]);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest('b on \"never a, b\" fails', async () => {\n\tconst [actual] = typeEnum(await parsed.b, \"never\", [\"a\", \"b\"]);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/type-enum.ts",
    "content": "import * as ensure from \"@commitlint/ensure\";\nimport message from \"@commitlint/message\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const typeEnum: SyncRule<string[]> = (\n\tparsed,\n\twhen = \"always\",\n\tvalue = [],\n) => {\n\tconst { type: input } = parsed;\n\n\tif (!input) {\n\t\treturn [true];\n\t}\n\n\tconst negated = when === \"never\";\n\tconst result = ensure.enum(input, value);\n\n\treturn [\n\t\tnegated ? !result : result,\n\t\tmessage([\n\t\t\t`type must`,\n\t\t\tnegated ? `not` : null,\n\t\t\t`be one of [${value.join(\", \")}]`,\n\t\t]),\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/type-max-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { typeMaxLength } from \"./type-max-length.js\";\n\nconst short = \"a\";\nconst long = \"ab\";\n\nconst value = short.length;\n\nconst messages = {\n\tempty: \"():\\n\",\n\tshort: `${short}: \\n`,\n\tlong: `${long}: \\n`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = typeMaxLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should succeed\", async () => {\n\tconst [actual] = typeMaxLength(await parsed.short, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should fail\", async () => {\n\tconst [actual] = typeMaxLength(await parsed.long, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/type-max-length.ts",
    "content": "import { maxLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const typeMaxLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.type;\n\n\tif (!input) {\n\t\treturn [true];\n\t}\n\n\treturn [\n\t\tmaxLength(input, value),\n\t\t`type must not be longer than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/src/type-min-length.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport parse from \"@commitlint/parse\";\nimport { typeMinLength } from \"./type-min-length.js\";\n\nconst short = \"a\";\nconst long = \"ab\";\n\nconst value = long.length;\n\nconst messages = {\n\tempty: \"():\\n\",\n\tshort: `${short}: \\n`,\n\tlong: `${long}: \\n`,\n};\n\nconst parsed = {\n\tempty: parse(messages.empty),\n\tshort: parse(messages.short),\n\tlong: parse(messages.long),\n};\n\ntest(\"with empty should succeed\", async () => {\n\tconst [actual] = typeMinLength(await parsed.empty, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with short should fail\", async () => {\n\tconst [actual] = typeMinLength(await parsed.short, undefined, value);\n\tconst expected = false;\n\texpect(actual).toEqual(expected);\n});\n\ntest(\"with long should succeed\", async () => {\n\tconst [actual] = typeMinLength(await parsed.long, undefined, value);\n\tconst expected = true;\n\texpect(actual).toEqual(expected);\n});\n"
  },
  {
    "path": "@commitlint/rules/src/type-min-length.ts",
    "content": "import { minLength } from \"@commitlint/ensure\";\nimport { SyncRule } from \"@commitlint/types\";\n\nexport const typeMinLength: SyncRule<number> = (\n\tparsed,\n\t_when = undefined,\n\tvalue = 0,\n) => {\n\tconst input = parsed.type;\n\tif (!input) {\n\t\treturn [true];\n\t}\n\treturn [\n\t\tminLength(input, value),\n\t\t`type must not be shorter than ${value} characters`,\n\t];\n};\n"
  },
  {
    "path": "@commitlint/rules/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [\n    { \"path\": \"../ensure\" },\n    { \"path\": \"../message\" },\n    { \"path\": \"../to-lines\" },\n    { \"path\": \"../types\" }\n  ]\n}\n"
  },
  {
    "path": "@commitlint/to-lines/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/to-lines\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/to-lines\n"
  },
  {
    "path": "@commitlint/to-lines/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/to-lines/package.json",
    "content": "{\n  \"name\": \"@commitlint/to-lines\",\n  \"type\": \"module\",\n  \"version\": \"20.0.0\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/to-lines\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/to-lines/src/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\n\nimport toLines from \"./index.js\";\n\ntest(\"should return an array for empty input\", () => {\n\texpect((toLines as () => string[])()).toStrictEqual([]);\n});\n\ntest(\"should return an array for null input\", () => {\n\texpect((toLines as (input: any) => string[])(null)).toStrictEqual([]);\n});\n\ntest(\"should return an array for empty string input\", () => {\n\texpect(toLines(\"\")).toStrictEqual([\"\"]);\n});\n\ntest(\"should split LF newlines\", () => {\n\texpect(toLines(\"some\\nweird\\ntext\")).toStrictEqual([\"some\", \"weird\", \"text\"]);\n});\n\ntest(\"should split CR+LF newlines\", () => {\n\texpect(toLines(\"some\\r\\nweird\\r\\ntext\")).toStrictEqual([\n\t\t\"some\",\n\t\t\"weird\",\n\t\t\"text\",\n\t]);\n});\n"
  },
  {
    "path": "@commitlint/to-lines/src/index.ts",
    "content": "export default function toLines(input?: string | null): string[] {\n\tif (typeof input !== \"string\") {\n\t\treturn [];\n\t}\n\n\treturn input.split(/(?:\\r?\\n)/);\n}\n"
  },
  {
    "path": "@commitlint/to-lines/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@commitlint/top-level/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency find-up to v5 ([#2060](https://github.com/conventional-changelog/commitlint/issues/2060)) ([25d42f4](https://github.com/conventional-changelog/commitlint/commit/25d42f4179396bdfbfc622a401d8ca8877102286))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n<a name=\"6.0.5\"></a>\n\n## [6.0.5](https://github.com/conventional-changelog/commitlint/compare/v6.0.4...v6.0.5) (2018-01-31)\n\n### Bug Fixes\n\n- remove utils from prod dependencies ([4fb858a](https://github.com/conventional-changelog/commitlint/commit/4fb858a))\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/top-level\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/top-level\n"
  },
  {
    "path": "@commitlint/top-level/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/top-level/package.json",
    "content": "{\n  \"name\": \"@commitlint/top-level\",\n  \"type\": \"module\",\n  \"version\": \"20.4.3\",\n  \"description\": \"Lint your commit messages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/top-level\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"library\",\n    \"core\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\"\n  },\n  \"dependencies\": {\n    \"escalade\": \"^3.2.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/top-level/src/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { fix, git } from \"@commitlint/test\";\nimport topLevel from \"./index.js\";\n\ntest(\"find .git in normal repository as directory\", async () => {\n\tconst temp = await git.bootstrap();\n\tconst cwd = path.join(temp, \"src\", \"shared\");\n\tawait fs.mkdir(cwd, { recursive: true });\n\n\tconst top = (await topLevel(cwd)) as string;\n\texpect(top).toEqual(temp);\n\texpect((await fs.stat(path.join(top, \".git\"))).isDirectory()).toEqual(true);\n});\n\ntest(\"find .git in submodule repository as file\", async () => {\n\tconst temp = await git.bootstrap();\n\tconst root = path.join(temp, \"parser\");\n\tconst cwd = path.join(root, \"src\");\n\tawait fs.mkdir(cwd, { recursive: true });\n\tawait fs.writeFile(path.join(root, \".git\"), \"\");\n\n\tconst top = (await topLevel(cwd)) as string;\n\texpect(top).toEqual(root);\n\texpect((await fs.stat(path.join(top, \".git\"))).isFile()).toEqual(true);\n});\n\ntest(\"not found in non-git folder\", async () => {\n\tconst temp = await fix.bootstrap();\n\tconst cwd = path.join(temp, \"src\", \"shared\");\n\tawait fs.mkdir(cwd, { recursive: true });\n\n\tconst top = (await topLevel(cwd)) as undefined;\n\texpect(top).toEqual(undefined);\n});\n\ntest(\"very deep directory from the root\", async () => {\n\tconst temp = await git.bootstrap();\n\tconst cwd = path.join(temp, ...new Array(10).fill(\"dir\"));\n\tawait fs.mkdir(cwd, { recursive: true });\n\n\tconst top = (await topLevel(cwd)) as string;\n\texpect(top).toEqual(temp);\n\texpect((await fs.stat(path.join(top, \".git\"))).isDirectory()).toEqual(true);\n});\n"
  },
  {
    "path": "@commitlint/top-level/src/index.ts",
    "content": "import process from \"node:process\";\nimport escalade from \"escalade\";\n\nexport default toplevel;\n\n/**\n * Find the next git root\n */\nfunction toplevel(cwd = process.cwd()) {\n\treturn escalade(cwd, (directory, files) => {\n\t\tif (files.includes(\".git\")) {\n\t\t\treturn directory;\n\t\t}\n\t});\n}\n"
  },
  {
    "path": "@commitlint/top-level/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@commitlint/travis-cli/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n\n### Bug Fixes\n\n* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299))\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [19.2.1](https://github.com/conventional-changelog/commitlint/compare/v19.2.0...v19.2.1) (2024-03-19)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add `main` and `types` keys in package.json ([#3953](https://github.com/conventional-changelog/commitlint/issues/3953)) ([7ddaad4](https://github.com/conventional-changelog/commitlint/commit/7ddaad4bc4e71afe89f25cc02d3e19beba1ce6cd))\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [18.4.1](https://github.com/conventional-changelog/commitlint/compare/v18.4.0...v18.4.1) (2023-11-12)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [18.2.0](https://github.com/conventional-changelog/commitlint/compare/v18.1.0...v18.2.0) (2023-10-26)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.7.2](https://github.com/conventional-changelog/commitlint/compare/v17.7.1...v17.7.2) (2023-09-28)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.7.1](https://github.com/conventional-changelog/commitlint/compare/v17.7.0...v17.7.1) (2023-08-10)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.5.1](https://github.com/conventional-changelog/commitlint/compare/v17.5.0...v17.5.1) (2023-03-28)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n## [17.4.1](https://github.com/conventional-changelog/commitlint/compare/v17.4.0...v17.4.1) (2023-01-09)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [17.1.2](https://github.com/conventional-changelog/commitlint/compare/v17.1.1...v17.1.2) (2022-08-29)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [17.1.1](https://github.com/conventional-changelog/commitlint/compare/v17.1.0...v17.1.1) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [17.0.2](https://github.com/conventional-changelog/commitlint/compare/v17.0.1...v17.0.2) (2022-06-01)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [17.0.1](https://github.com/conventional-changelog/commitlint/compare/v17.0.0...v17.0.1) (2022-05-25)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [16.0.3](https://github.com/conventional-changelog/commitlint/compare/v16.0.2...v16.0.3) (2022-01-19)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [16.0.2](https://github.com/conventional-changelog/commitlint/compare/v16.0.1...v16.0.2) (2022-01-09)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [16.0.1](https://github.com/conventional-changelog/commitlint/compare/v16.0.0...v16.0.1) (2021-12-28)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [13.2.1](https://github.com/conventional-changelog/commitlint/compare/v13.2.0...v13.2.1) (2021-10-09)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- update dependency execa to v5 ([#2341](https://github.com/conventional-changelog/commitlint/issues/2341)) ([f349df9](https://github.com/conventional-changelog/commitlint/commit/f349df90f08096a9bcad46b5e55b411aac327a24))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency execa to v4 ([#1936](https://github.com/conventional-changelog/commitlint/issues/1936)) ([8efb441](https://github.com/conventional-changelog/commitlint/commit/8efb44193058d286f7325327a6d33936b273ec91))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n### Bug Fixes\n\n- add missing @babel/runtime dep [#1738](https://github.com/conventional-changelog/commitlint/issues/1738) ([#1754](https://github.com/conventional-changelog/commitlint/issues/1754)) ([09afcd6](https://github.com/conventional-changelog/commitlint/commit/09afcd647a2c1d00538cf1c970e3790d936111f8))\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Features\n\n- passdown argv to lint command ([#891](https://github.com/conventional-changelog/commitlint/issues/891)) ([c49a57c](https://github.com/conventional-changelog/commitlint/commit/c49a57c77767b8213d565df3a8bbcd7369f36641))\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [8.3.1](https://github.com/conventional-changelog/commitlint/compare/v8.3.0...v8.3.1) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [7.6.1](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.1) (2019-05-09)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [7.5.2](https://github.com/conventional-changelog/commitlint/compare/v7.5.1...v7.5.2) (2019-02-11)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n## [7.5.1](https://github.com/conventional-changelog/commitlint/compare/v7.5.0...v7.5.1) (2019-02-09)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.4.0\"></a>\n\n# [7.4.0](https://github.com/conventional-changelog/commitlint/compare/v7.3.2...v7.4.0) (2019-01-27)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"7.3.2\"></a>\n\n## [7.3.2](https://github.com/conventional-changelog/commitlint/compare/v7.3.1...v7.3.2) (2019-01-15)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"6.2.0\"></a>\n\n# [6.2.0](https://github.com/conventional-changelog/commitlint/compare/v6.1.3...v6.2.0) (2018-05-01)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"6.0.5\"></a>\n\n## [6.0.5](https://github.com/conventional-changelog/commitlint/compare/v6.0.4...v6.0.5) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"6.0.1\"></a>\n\n## [6.0.1](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.1) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"5.2.6\"></a>\n\n## [5.2.6](https://github.com/conventional-changelog/commitlint/compare/v5.2.5...v5.2.6) (2017-12-21)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"5.2.5\"></a>\n\n## [5.2.5](https://github.com/conventional-changelog/commitlint/compare/v5.2.4...v5.2.5) (2017-12-08)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"5.2.4\"></a>\n\n## [5.2.4](https://github.com/conventional-changelog/commitlint/compare/v5.2.3...v5.2.4) (2017-12-08)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"5.2.3\"></a>\n\n## [5.2.3](https://github.com/conventional-changelog/commitlint/compare/v5.2.2...v5.2.3) (2017-12-05)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"5.2.2\"></a>\n\n## [5.2.2](https://github.com/conventional-changelog/commitlint/compare/v5.2.1...v5.2.2) (2017-11-30)\n\n### Bug Fixes\n\n- **travis-cli:** read push commits directly ([9bc56c6](https://github.com/conventional-changelog/commitlint/commit/9bc56c6))\n\n<a name=\"5.2.1\"></a>\n\n## [5.2.1](https://github.com/conventional-changelog/commitlint/compare/v5.2.0...v5.2.1) (2017-11-30)\n\n### Bug Fixes\n\n- **travis-cli:** lint ranges only for pr builds ([85b201f](https://github.com/conventional-changelog/commitlint/commit/85b201f))\n\n<a name=\"5.2.0\"></a>\n\n# [5.2.0](https://github.com/conventional-changelog/commitlint/compare/v5.1.3...v5.2.0) (2017-11-30)\n\n### Bug Fixes\n\n- consider pull requests from forks ([4653c2c](https://github.com/conventional-changelog/commitlint/commit/4653c2c))\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/travis-cli\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Features\n\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n"
  },
  {
    "path": "@commitlint/travis-cli/README.md",
    "content": "> Lint all relevant commits for a change or PR on Travis CI\n\n# @commitlint/travis-cli\n\nThis package is a convenience wrapper around `commitlint`,\nproviding zero-configuration linting of all relevant commits\nfor a given change/build combination.\n\n## Getting started\n\n```\nnpm install --save-dev @commitlint/travis-cli\n```\n\n```yml\n# .travis.yml\nscript\n- commitlint-travis\n```\n"
  },
  {
    "path": "@commitlint/travis-cli/cli.js",
    "content": "#!/usr/bin/env node\nimport \"./lib/cli.js\";\n"
  },
  {
    "path": "@commitlint/travis-cli/fixtures/commitlint.js",
    "content": "#!/usr/bin/env node\n\nconst args = process.argv;\nargs.shift(); // remove node\nconsole.log(\n\targs.map((item, index) => {\n\t\treturn index === 0 ? 'commitlint' : item;\n\t})\n);\n"
  },
  {
    "path": "@commitlint/travis-cli/fixtures/git.js",
    "content": "#!/usr/bin/env node\n\nconst args = process.argv;\nargs.shift(); // remove node\nconsole.log(\n\targs.map((item, index) => {\n\t\treturn index === 0 ? 'git' : item;\n\t})\n);\n"
  },
  {
    "path": "@commitlint/travis-cli/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@commitlint/travis-cli/package.json",
    "content": "{\n  \"name\": \"@commitlint/travis-cli\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Lint all relevant commits for a change or PR on Travis CI\",\n  \"main\": \"lib/cli.js\",\n  \"types\": \"lib/cli.d.ts\",\n  \"files\": [\n    \"lib/\",\n    \"cli.js\"\n  ],\n  \"bin\": {\n    \"commitlint-travis\": \"./cli.js\"\n  },\n  \"scripts\": {\n    \"deps\": \"dep-check\",\n    \"pkg\": \"pkg-check --skip-main\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/travis-cli\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"cli\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@commitlint/test\": \"^20.4.3\",\n    \"@commitlint/utils\": \"^20.0.0\"\n  },\n  \"dependencies\": {\n    \"@commitlint/cli\": \"^20.5.0\",\n    \"tinyexec\": \"^1.0.0\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/travis-cli/src/cli.test.ts",
    "content": "import { SpawnOptions } from \"node:child_process\";\n\nimport { test, expect } from \"vitest\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { git } from \"@commitlint/test\";\nimport { x } from \"tinyexec\";\n\nconst require = createRequire(import.meta.url);\n\nconst __dirname = path.resolve(fileURLToPath(import.meta.url), \"..\");\n\nconst bin = require.resolve(\"../cli.js\");\n\nconst TRAVIS_COMMITLINT_BIN = require.resolve(\"../fixtures/commitlint\");\nconst TRAVIS_COMMITLINT_GIT_BIN = require.resolve(\"../fixtures/git\");\n\nconst validBaseEnv = {\n\tTRAVIS: \"true\",\n\tCI: \"true\",\n\tTRAVIS_COMMIT: \"TRAVIS_COMMIT\",\n\tTRAVIS_COMMITLINT_BIN: TRAVIS_COMMITLINT_BIN,\n\tTRAVIS_COMMITLINT_GIT_BIN: TRAVIS_COMMITLINT_GIT_BIN,\n\tTRAVIS_COMMIT_RANGE: \"TRAVIS_COMMIT_A.TRAVIS_COMMIT_B\",\n\tTRAVIS_EVENT_TYPE: \"TRAVIS_EVENT_TYPE\",\n\tTRAVIS_REPO_SLUG: \"TRAVIS_REPO_SLUG\",\n\tTRAVIS_PULL_REQUEST_SLUG: \"TRAVIS_PULL_REQUEST_SLUG\",\n};\n\nconst cli = async (nodeOptions: SpawnOptions = {}, args: string[] = []) =>\n\tx(bin, args, { nodeOptions });\n\ntest(\"should throw when not on travis ci\", async () => {\n\tconst env = {\n\t\tCI: \"false\",\n\t\tTRAVIS: \"false\",\n\t};\n\n\tconst output = await cli({ env });\n\texpect(output.stderr).toContain(\n\t\t\"@commitlint/travis-cli is intended to be used on Travis CI\",\n\t);\n});\n\ntest(\"should throw when on travis ci, but env vars are missing\", async () => {\n\tconst env = {\n\t\tTRAVIS: \"true\",\n\t\tCI: \"true\",\n\t};\n\n\tconst output = await cli({ env });\n\texpect(output.stderr).toContain(\n\t\t\"TRAVIS_COMMIT, TRAVIS_COMMIT_RANGE, TRAVIS_EVENT_TYPE, TRAVIS_REPO_SLUG, TRAVIS_PULL_REQUEST_SLUG\",\n\t);\n});\n\ntest(\"should call git with expected args (test might fail locally)\", async () => {\n\tconst cwd = await git.clone(\n\t\t\"https://github.com/conventional-changelog/commitlint.git\",\n\t\t[\"--depth=10\"],\n\t\t__dirname,\n\t\tTRAVIS_COMMITLINT_GIT_BIN,\n\t);\n\n\tconst result = await cli({\n\t\tcwd,\n\t\tenv: validBaseEnv,\n\t});\n\n\tconst invocations = getInvocations(result.stdout);\n\n\texpect(invocations.length).toBe(3);\n\n\tconst [stash, branches, commitlint] = invocations;\n\n\texpect(stash).toEqual([\"git\", \"stash\", \"-k\", \"-u\", \"--quiet\"]);\n\texpect(branches).toEqual([\"git\", \"stash\", \"pop\", \"--quiet\"]);\n\texpect(commitlint).toEqual([\"commitlint\"]);\n});\n\ntest(\"should call git with expected args on pull_request (test might fail locally)\", async () => {\n\tconst cwd = await git.clone(\n\t\t\"https://github.com/conventional-changelog/commitlint.git\",\n\t\t[\"--depth=10\"],\n\t\t__dirname,\n\t\tTRAVIS_COMMITLINT_GIT_BIN,\n\t);\n\n\tconst result = await cli({\n\t\tcwd,\n\t\tenv: { ...validBaseEnv, TRAVIS_EVENT_TYPE: \"pull_request\" },\n\t});\n\tconst invocations = getInvocations(result.stdout);\n\texpect(invocations.length).toBe(3);\n\n\tconst [stash, branches, commitlint] = invocations;\n\n\texpect(stash).toEqual([\"git\", \"stash\", \"-k\", \"-u\", \"--quiet\"]);\n\texpect(branches).toEqual([\"git\", \"stash\", \"pop\", \"--quiet\"]);\n\texpect(commitlint).toEqual([\n\t\t\"commitlint\",\n\t\t\"--from\",\n\t\t\"TRAVIS_COMMIT_A\",\n\t\t\"--to\",\n\t\t\"TRAVIS_COMMIT_B\",\n\t]);\n});\n\ntest(\"should call git with extra expected args on pull_request (test might fail locally)\", async () => {\n\tconst cwd = await git.clone(\n\t\t\"https://github.com/conventional-changelog/commitlint.git\",\n\t\t[\"--depth=10\"],\n\t\t__dirname,\n\t\tTRAVIS_COMMITLINT_GIT_BIN,\n\t);\n\n\tconst result = await cli(\n\t\t{\n\t\t\tcwd,\n\t\t\tenv: { ...validBaseEnv, TRAVIS_EVENT_TYPE: \"pull_request\" },\n\t\t},\n\t\t[\"--config\", \"./config/commitlint.config.js\"],\n\t);\n\tconst invocations = getInvocations(result.stdout);\n\texpect(invocations.length).toBe(3);\n\n\tconst [stash, branches, commitlint] = invocations;\n\n\texpect(stash).toEqual([\"git\", \"stash\", \"-k\", \"-u\", \"--quiet\"]);\n\texpect(branches).toEqual([\"git\", \"stash\", \"pop\", \"--quiet\"]);\n\texpect(commitlint).toEqual([\n\t\t\"commitlint\",\n\t\t\"--from\",\n\t\t\"TRAVIS_COMMIT_A\",\n\t\t\"--to\",\n\t\t\"TRAVIS_COMMIT_B\",\n\t\t\"--config\",\n\t\t\"./config/commitlint.config.js\",\n\t]);\n});\n\nfunction getInvocations(stdout: string): string[][] {\n\tconst matches = stdout.match(/[^[\\]]+/g);\n\tconst raw = Array.isArray(matches) ? matches : [];\n\n\treturn raw\n\t\t.filter((invocation) => invocation !== \"\\n\")\n\t\t.map((invocation) =>\n\t\t\tinvocation\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((fragment) => fragment.trim())\n\t\t\t\t.map((fragment) => fragment.substring(1, fragment.length - 1))\n\t\t\t\t.filter(Boolean),\n\t\t);\n}\n"
  },
  {
    "path": "@commitlint/travis-cli/src/cli.ts",
    "content": "import { SpawnOptions } from \"node:child_process\";\n\nimport { createRequire } from \"node:module\";\n\nimport { x } from \"tinyexec\";\n\nconst require = createRequire(import.meta.url);\n\n// Allow to override used bins for testing purposes\nconst GIT = process.env.TRAVIS_COMMITLINT_GIT_BIN || \"git\";\nconst COMMITLINT =\n\tprocess.env.TRAVIS_COMMITLINT_BIN || require(\"@commitlint/cli\");\n\nconst REQUIRED = [\n\t\"TRAVIS_COMMIT\",\n\t\"TRAVIS_COMMIT_RANGE\",\n\t\"TRAVIS_EVENT_TYPE\",\n\t\"TRAVIS_REPO_SLUG\",\n\t\"TRAVIS_PULL_REQUEST_SLUG\",\n];\n\nconst COMMIT = process.env.TRAVIS_COMMIT || \"\";\nconst REPO_SLUG = process.env.TRAVIS_REPO_SLUG;\nconst PR_SLUG = process.env.TRAVIS_PULL_REQUEST_SLUG || REPO_SLUG;\nconst RANGE = process.env.TRAVIS_COMMIT_RANGE;\nconst IS_PR = process.env.TRAVIS_EVENT_TYPE === \"pull_request\";\n\nmain().catch((err) => {\n\tconsole.error(err);\n\tprocess.exit(1);\n});\n\nasync function main() {\n\tvalidate();\n\n\t// Stash changes in working copy if needed\n\tconst pop = await stash();\n\n\t// Make base and source available as dedicated remotes\n\tawait Promise.all([\n\t\t() => fetch({ name: \"base\", url: `https://github.com/${REPO_SLUG}.git` }),\n\t\tIS_PR\n\t\t\t? () =>\n\t\t\t\t\tfetch({ name: \"source\", url: `https://github.com/${PR_SLUG}.git` })\n\t\t\t: () => Promise.resolve(),\n\t]);\n\n\t// Restore stashed changes if any\n\tawait pop();\n\n\tconst args = process.argv.slice(2);\n\n\t// Lint all commits in TRAVIS_COMMIT_RANGE if available\n\tif (IS_PR && RANGE) {\n\t\tconst [start, end] = RANGE.split(\".\").filter(Boolean);\n\t\tawait lint([\"--from\", start, \"--to\", end, ...args]);\n\t} else {\n\t\tconst input = await log(COMMIT);\n\t\tawait lint(args, {}, input);\n\t}\n}\n\nasync function git(args: string[], nodeOptions: SpawnOptions = {}) {\n\treturn x(GIT, args, {\n\t\tnodeOptions: {\n\t\t\tstdio: \"inherit\",\n\t\t\t...nodeOptions,\n\t\t},\n\t});\n}\n\nasync function fetch({ name, url }: { name: string; url: string }) {\n\tawait git([\"remote\", \"add\", name, url]);\n\tawait git([\"fetch\", name, \"--quiet\"]);\n}\n\nasync function isClean() {\n\tconst result = await git([\"status\", \"--porcelain\"], {\n\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t});\n\treturn !(result.stdout && result.stdout.trim());\n}\n\nasync function lint(\n\targs: string[],\n\tnodeOptions: SpawnOptions = {},\n\tinput: string = \"\",\n) {\n\tconst result = x(COMMITLINT, args, {\n\t\tnodeOptions: {\n\t\t\tstdio: [\"pipe\", \"inherit\", \"inherit\"],\n\t\t\t...nodeOptions,\n\t\t},\n\t});\n\n\tresult.process?.stdin?.write(input);\n\tresult.process?.stdin?.end();\n\n\treturn result;\n}\n\nasync function log(hash: string) {\n\tconst result = await git([\"log\", \"-n\", \"1\", \"--pretty=format:%B\", hash], {\n\t\tstdio: \"pipe\",\n\t});\n\treturn result.stdout;\n}\n\nasync function stash() {\n\tif (await isClean()) {\n\t\treturn () => Promise.resolve();\n\t}\n\tawait git([\"stash\", \"-k\", \"-u\", \"--quiet\"]);\n\treturn () => git([\"stash\", \"pop\", \"--quiet\"]);\n}\n\nfunction validate() {\n\tif (process.env.CI !== \"true\" || process.env.TRAVIS !== \"true\") {\n\t\tthrow new Error(\n\t\t\t`@commitlint/travis-cli is intended to be used on Travis CI`,\n\t\t);\n\t}\n\n\tconst missing = REQUIRED.filter((envVar) => !(envVar in process.env));\n\n\tif (missing.length > 0) {\n\t\tconst stanza = missing.length > 1 ? \"they were not\" : \"it was not\";\n\t\tthrow new Error(\n\t\t\t`Expected ${missing.join(\", \")} to be defined globally, ${stanza}.`,\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "@commitlint/travis-cli/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"],\n  \"references\": [{ \"path\": \"../cli\" }]\n}\n"
  },
  {
    "path": "@commitlint/types/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n\n### Features\n\n* **cz-commitlint:** add exclamation mark support for breaking changes ([#4655](https://github.com/conventional-changelog/commitlint/issues/4655)) ([3b124a7](https://github.com/conventional-changelog/commitlint/commit/3b124a78000dc2ad353884b72db5ba0c78a642a3))\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n\n### Bug Fixes\n\n* **types:** allow context parameter in QualifiedRuleConfig functions ([#4636](https://github.com/conventional-changelog/commitlint/issues/4636)) ([17537ae](https://github.com/conventional-changelog/commitlint/commit/17537ae05f3402f3b196d5a8cb92ae7207af8ba5)), closes [#4357](https://github.com/conventional-changelog/commitlint/issues/4357)\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n\n### Bug Fixes\n\n* footer parser does not escape special chars for regex [#4560](https://github.com/conventional-changelog/commitlint/issues/4560) ([#4634](https://github.com/conventional-changelog/commitlint/issues/4634)) ([8ff7c7f](https://github.com/conventional-changelog/commitlint/commit/8ff7c7fcbc2db2b45910ecb5c01e9f1763060770))\n* **types:** incorrect types for rule options ([#4633](https://github.com/conventional-changelog/commitlint/issues/4633)) ([77b85f2](https://github.com/conventional-changelog/commitlint/commit/77b85f24d3858161d076078d333c96909e6136f8))\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n\n### Features\n\n* upgrade conventional commit packages [#4082](https://github.com/conventional-changelog/commitlint/issues/4082) ([#4597](https://github.com/conventional-changelog/commitlint/issues/4597)) ([3aaf0a6](https://github.com/conventional-changelog/commitlint/commit/3aaf0a603c4047d268d85207957c919f45b60e1f))\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n\n### Bug Fixes\n\n* **types:** add scope-delimiter-style types ([#4592](https://github.com/conventional-changelog/commitlint/issues/4592)) ([23c1f6e](https://github.com/conventional-changelog/commitlint/commit/23c1f6ef3ddfcc5316f429d51854929c39ea1103))\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n\n### Features\n\n* **cz-commitlint:** support customizable commit prompt with emojis ([#4540](https://github.com/conventional-changelog/commitlint/issues/4540)) ([803c05b](https://github.com/conventional-changelog/commitlint/commit/803c05b6d722676ed499585ed713d185d1670462))\n* **rules:** add breaking-change-exclamation-mark ([#4548](https://github.com/conventional-changelog/commitlint/issues/4548)) ([c4d419b](https://github.com/conventional-changelog/commitlint/commit/c4d419bc76aab72092f1ebd7c0922729a576b7a5)), closes [#4547](https://github.com/conventional-changelog/commitlint/issues/4547)\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n\n### Bug Fixes\n\n* mark `@types/conventional-commits-parser` as dep for `@commitlint/types` ([#3944](https://github.com/conventional-changelog/commitlint/issues/3944)) ([5a01f59](https://github.com/conventional-changelog/commitlint/commit/5a01f59661f0b908802728389631965eb8b49d47)), closes [#3929](https://github.com/conventional-changelog/commitlint/issues/3929) [#3942](https://github.com/conventional-changelog/commitlint/issues/3942)\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n\n### Features\n\n* **rules:** add header-trim rule ([#3199](https://github.com/conventional-changelog/commitlint/issues/3199)) ([#3871](https://github.com/conventional-changelog/commitlint/issues/3871)) ([331579a](https://github.com/conventional-changelog/commitlint/commit/331579a8796af901b5e5103c44fedf1cb3a2f661))\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/types\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n\n### Bug Fixes\n\n* **parse:** allow setting fieldPattern in parserOpts ([#3538](https://github.com/conventional-changelog/commitlint/issues/3538)) ([ea23c65](https://github.com/conventional-changelog/commitlint/commit/ea23c65702d619b92e338e9f589a147d62e48ffc))\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n**Note:** Version bump only for package @commitlint/types\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n**Note:** Version bump only for package @commitlint/types\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n### Features\n\n- **cz-commitlint:** support select scope with radio list by setting disableMultipleScopes ([#2911](https://github.com/conventional-changelog/commitlint/issues/2911)) ([9d8d73f](https://github.com/conventional-changelog/commitlint/commit/9d8d73f36e0c62c8cd9e3e913b66a5ca46ebf622)), closes [#2782](https://github.com/conventional-changelog/commitlint/issues/2782)\n- config validation ([#2412](https://github.com/conventional-changelog/commitlint/issues/2412)) ([c717202](https://github.com/conventional-changelog/commitlint/commit/c7172022097b11f46b33617e4a94d751243c1049)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n### BREAKING CHANGES\n\n- **cz-commitlint:** users who is using multiple scopes need to set enableMultipleScopes to true\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n### Bug Fixes\n\n- **types:** fix signature of QualifiedRuleConfig for async configurations ([#2868](https://github.com/conventional-changelog/commitlint/issues/2868)) ([#2869](https://github.com/conventional-changelog/commitlint/issues/2869)) ([c7f355b](https://github.com/conventional-changelog/commitlint/commit/c7f355b25e5baddab0b9559892f5ce4112e4f93a))\n\n### Features\n\n- simplify config resolution ([#2398](https://github.com/conventional-changelog/commitlint/issues/2398)) ([8a8384f](https://github.com/conventional-changelog/commitlint/commit/8a8384f3c18954447cb633e76a573e1db71a1440)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n- support multiple scopes and multiple cases & fix sentence-case is not consistent with commitlint/cli (#2806) ([2c71a7e](https://github.com/conventional-changelog/commitlint/commit/2c71a7e2965a2beff805982d37243b79a48c9360)), closes [#2806](https://github.com/conventional-changelog/commitlint/issues/2806) [#2782](https://github.com/conventional-changelog/commitlint/issues/2782)\n\n### BREAKING CHANGES\n\n- add prompt.settings configuration\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n### Bug Fixes\n\n- **types:** prompt messages key ([4825a52](https://github.com/conventional-changelog/commitlint/commit/4825a521e2c74d63a11920b48094fddc79001b3c))\n- **types:** prompt messages props optional ([0bd0592](https://github.com/conventional-changelog/commitlint/commit/0bd0592148ab4266fd76816b19d352e2cf947f8c))\n- **types:** user config prompt ([6d7a1c4](https://github.com/conventional-changelog/commitlint/commit/6d7a1c40e2f8a8ff22595e0e17f71f3702b0699c))\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n### Bug Fixes\n\n- **types:** adds TargetCaseType[] for CaseRuleConfig ([c3bef38](https://github.com/conventional-changelog/commitlint/commit/c3bef384ff1a3ec428ba7c86bc778c50a9e6eead))\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n### Features\n\n- **rules:** add `trailer-exists` rule ([#2578](https://github.com/conventional-changelog/commitlint/issues/2578)) ([cd3816d](https://github.com/conventional-changelog/commitlint/commit/cd3816d553762eae99e088689395c55afce0c6cc))\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n**Note:** Version bump only for package @commitlint/types\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n### Bug Fixes\n\n- **rules:** fix subject-full-stop rule config value type ([#2534](https://github.com/conventional-changelog/commitlint/issues/2534)) ([2ab3c57](https://github.com/conventional-changelog/commitlint/commit/2ab3c57b709ddad3fc98d768309ac4fdac8cb68a))\n- **types:** update chalk import ([#2535](https://github.com/conventional-changelog/commitlint/issues/2535)) ([89f9a6d](https://github.com/conventional-changelog/commitlint/commit/89f9a6d759f7296438e184a93c1f766aba1443ca))\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n**Note:** Version bump only for package @commitlint/types\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n### Bug Fixes\n\n- **load:** use `Rule | AsyncRule | SyncRule` as rule value type in `Plugin` ([#2146](https://github.com/conventional-changelog/commitlint/issues/2146)) ([75b67b8](https://github.com/conventional-changelog/commitlint/commit/75b67b8fb7fc4df21267b98f0c9daeeb1130b824))\n- **types:** correct chalkColor type ([#2420](https://github.com/conventional-changelog/commitlint/issues/2420)) ([ef8bdad](https://github.com/conventional-changelog/commitlint/commit/ef8bdad96c9ee7c3ad67f8280818c7f49c1df1fe))\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Features\n\n- **load:** allow specifying helpUrl via config ([#2180](https://github.com/conventional-changelog/commitlint/issues/2180)) ([d6795a3](https://github.com/conventional-changelog/commitlint/commit/d6795a3c4633ba6efd7a0fcff48339dc291cd832))\n- **rules:** add body-full-stop rule ([#2144](https://github.com/conventional-changelog/commitlint/issues/2144)) ([7767ca2](https://github.com/conventional-changelog/commitlint/commit/7767ca2591d10207c4abe7f3e5e6de503ac12a25))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/types\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/types\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n**Note:** Version bump only for package @commitlint/types\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Features\n\n- add local plugins support ([#1692](https://github.com/conventional-changelog/commitlint/issues/1692)) ([7b29c48](https://github.com/conventional-changelog/commitlint/commit/7b29c48321b513e091849fbb2cc2bf0e6ebb94a6))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/types\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Features\n\n- add async promise based rules methods into lint ([#976](https://github.com/conventional-changelog/commitlint/issues/976)) ([4443062](https://github.com/conventional-changelog/commitlint/commit/444306249b8a3d04524538f61edca8f6cc10d75f))\n"
  },
  {
    "path": "@commitlint/types/package.json",
    "content": "{\n  \"name\": \"@commitlint/types\",\n  \"type\": \"module\",\n  \"version\": \"20.5.0\",\n  \"description\": \"Shared types for commitlint packages\",\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"pkg\": \"pkg-check\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@commitlint/types\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"conventional-commits-parser\": \"^6.3.0\",\n    \"picocolors\": \"^1.1.1\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/utils\": \"^20.0.0\",\n    \"@types/conventional-commits-parser\": \"^5.0.2\"\n  },\n  \"gitHead\": \"e82f05a737626bb69979d14564f5ff601997f679\"\n}\n"
  },
  {
    "path": "@commitlint/types/src/ensure.ts",
    "content": "export type TargetCaseType =\n\t| \"camel-case\"\n\t| \"kebab-case\"\n\t| \"snake-case\"\n\t| \"pascal-case\"\n\t| \"start-case\"\n\t| \"upper-case\"\n\t| \"uppercase\"\n\t| \"sentence-case\"\n\t| \"sentencecase\"\n\t| \"lower-case\"\n\t| \"lowercase\"\n\t| \"lowerCase\";\n"
  },
  {
    "path": "@commitlint/types/src/format.ts",
    "content": "import type pc from \"picocolors\";\nimport { QualifiedRules } from \"./load.js\";\nimport { RuleConfigSeverity } from \"./rules.js\";\n\nexport type Formatter = (\n\treport: FormattableReport,\n\toptions: FormatOptions,\n) => string;\n\nexport interface FormattableProblem {\n\tlevel: RuleConfigSeverity;\n\tname: keyof QualifiedRules;\n\tmessage: string;\n}\n\nexport interface FormattableResult {\n\terrors?: FormattableProblem[];\n\twarnings?: FormattableProblem[];\n}\n\nexport interface WithInput {\n\tinput?: string;\n}\n\nexport interface FormattableReport {\n\tresults?: (FormattableResult & WithInput)[];\n}\n\n// Extract color function names from picocolors, excluding non-color properties\nexport type PicocolorsColor = Exclude<\n\tkeyof typeof pc,\n\t\"isColorSupported\" | \"createColors\"\n>;\n\n// Keep ChalkColor as an alias for backwards compatibility\nexport type ChalkColor = PicocolorsColor;\n\nexport interface FormatOptions {\n\tcolor?: boolean;\n\tsigns?: readonly [string, string, string];\n\tcolors?: readonly [PicocolorsColor, PicocolorsColor, PicocolorsColor];\n\tverbose?: boolean;\n\thelpUrl?: string;\n}\n"
  },
  {
    "path": "@commitlint/types/src/index.ts",
    "content": "export * from \"./ensure.js\";\nexport * from \"./format.js\";\nexport * from \"./is-ignored.js\";\nexport * from \"./lint.js\";\nexport * from \"./load.js\";\nexport * from \"./parse.js\";\nexport * from \"./prompt.js\";\nexport * from \"./rules.js\";\n"
  },
  {
    "path": "@commitlint/types/src/is-ignored.ts",
    "content": "export type Matcher = (commit: string) => boolean;\n\nexport interface IsIgnoredOptions {\n\tignores?: Matcher[];\n\tdefaults?: boolean;\n}\n"
  },
  {
    "path": "@commitlint/types/src/lint.ts",
    "content": "import type { ParserOptions as Options } from \"conventional-commits-parser\";\nimport { IsIgnoredOptions } from \"./is-ignored.js\";\nimport { PluginRecords } from \"./load.js\";\nimport { RuleConfigSeverity, RuleConfigTuple } from \"./rules.js\";\n\nexport type LintRuleConfig = Record<\n\tstring,\n\t| Readonly<[RuleConfigSeverity.Disabled]>\n\t| RuleConfigTuple<void>\n\t| RuleConfigTuple<unknown>\n>;\n\nexport interface LintOptions {\n\t/** If it should ignore the default commit messages (defaults to `true`) */\n\tdefaultIgnores?: IsIgnoredOptions[\"defaults\"];\n\t/** Additional commits to ignore, defined by ignore matchers  */\n\tignores?: IsIgnoredOptions[\"ignores\"];\n\t/** The parser configuration to use when linting the commit */\n\tparserOpts?: Options;\n\n\tplugins?: PluginRecords;\n\thelpUrl?: string;\n}\n\nexport interface LintOutcome {\n\t/** The linted commit, as string */\n\tinput: string;\n\t/** If the linted commit is considered valid */\n\tvalid: boolean;\n\t/** All errors, per rule, for the commit */\n\terrors: LintRuleOutcome[];\n\t/** All warnings, per rule, for the commit */\n\twarnings: LintRuleOutcome[];\n}\n\nexport interface LintRuleOutcome {\n\t/** If the commit is considered valid for the rule */\n\tvalid: boolean;\n\t/** The \"severity\" of the rule (1 = warning, 2 = error) */\n\tlevel: RuleConfigSeverity;\n\t/** The name of the rule */\n\tname: string;\n\t/** The message returned from the rule, if invalid */\n\tmessage: string;\n}\n"
  },
  {
    "path": "@commitlint/types/src/load.ts",
    "content": "import { UserPromptConfig } from \"./prompt.js\";\nimport {\n\tAsyncRule,\n\tRule,\n\tRuleConfigQuality,\n\tRulesConfig,\n\tSyncRule,\n} from \"./rules.js\";\n\nexport type PluginRecords = Record<string, Plugin>;\n\nexport interface Plugin {\n\trules: {\n\t\t[ruleName: string]: Rule | AsyncRule | SyncRule;\n\t};\n}\n\nexport interface LoadOptions {\n\tcwd?: string;\n\tfile?: string;\n}\n\nexport interface UserConfig {\n\textends?: string | string[];\n\tformatter?: string;\n\trules?: Partial<RulesConfig>;\n\tparserPreset?: string | ParserPreset | Promise<ParserPreset>;\n\tignores?: ((commit: string) => boolean)[];\n\tdefaultIgnores?: boolean;\n\tplugins?: (string | Plugin)[];\n\thelpUrl?: string;\n\tprompt?: UserPromptConfig;\n\t[key: string]: unknown;\n}\n\nexport type QualifiedRules = Partial<RulesConfig<RuleConfigQuality.Qualified>>;\n\nexport interface QualifiedConfig {\n\textends: string[];\n\tformatter: string;\n\trules: QualifiedRules;\n\tparserPreset?: ParserPreset;\n\tignores?: ((commit: string) => boolean)[];\n\tdefaultIgnores?: boolean;\n\tplugins: PluginRecords;\n\thelpUrl: string;\n\tprompt: UserPromptConfig;\n}\n\nexport interface ParserPreset {\n\tname?: string;\n\tpath?: string;\n\tparserOpts?: unknown;\n\tparser?: unknown;\n}\n"
  },
  {
    "path": "@commitlint/types/src/parse.ts",
    "content": "import type {\n\tCommit,\n\tParserOptions as Options,\n} from \"conventional-commits-parser\";\n\nexport type Parser = (message: string, options: Options) => Omit<Commit, \"raw\">;\n"
  },
  {
    "path": "@commitlint/types/src/prompt.ts",
    "content": "export type RuleField =\n\t| \"header\"\n\t| \"type\"\n\t| \"scope\"\n\t| \"subject\"\n\t| \"body\"\n\t| \"footer\";\n\nexport type PromptName =\n\t| RuleField\n\t| \"isBreaking\"\n\t| \"breakingBody\"\n\t| \"breaking\"\n\t| \"isIssueAffected\"\n\t| \"issuesBody\"\n\t| \"issues\";\n\nexport type PromptConfig = {\n\tsettings: {\n\t\tscopeEnumSeparator: string;\n\t\tenableMultipleScopes: boolean;\n\t\tuseExclamationMark: boolean;\n\t};\n\tmessages: PromptMessages;\n\tquestions: Partial<\n\t\tRecord<\n\t\t\tPromptName,\n\t\t\t{\n\t\t\t\tdescription?: string;\n\t\t\t\tmessages?: { [K: string]: string };\n\t\t\t\tenum?: {\n\t\t\t\t\t[enumName: string]: {\n\t\t\t\t\t\tdescription?: string;\n\t\t\t\t\t\ttitle?: string;\n\t\t\t\t\t\temoji?: string;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\temojiInHeader?: boolean;\n\t\t\t}\n\t\t>\n\t>;\n};\n\nexport type PromptMessages = {\n\tskip: string;\n\tmax: string;\n\tmin: string;\n\temptyWarning: string;\n\tupperLimitWarning: string;\n\tlowerLimitWarning: string;\n\t[_key: string]: string;\n};\n\nexport type UserPromptConfig = DeepPartial<PromptConfig>;\n\ntype DeepPartial<T> = {\n\t[P in keyof T]?: {\n\t\t[K in keyof T[P]]?: T[P][K];\n\t};\n};\n"
  },
  {
    "path": "@commitlint/types/src/rules.test-d.ts",
    "content": "/**\n * Tests for \"as const\" compatibility:\n * https://github.com/conventional-changelog/commitlint/pull/4633\n *\n * These are compile-time type checks (no runtime behavior). If a line fails to compile, the\n * associated type definition needs to be fixed.\n */\n\nimport { RuleConfigSeverity, type RulesConfig } from \"./index.js\";\n\nconst ERROR = RuleConfigSeverity.Error;\n\nconst _scopeEnumObject = [\n\tERROR,\n\t\"always\",\n\t{ scopes: [\"foo\", \"bar\"] as const },\n] as const;\nconst _scopeEnumObjectCheck: Partial<RulesConfig> = {\n\t\"scope-enum\": _scopeEnumObject,\n};\nvoid _scopeEnumObjectCheck;\n\n// Simple array form: regression check that the array-form enum config\n// remains assignable to RulesConfig when using `as const`.\nconst _scopeEnumSimple = [ERROR, \"always\", [\"foo\", \"baz\", \"baz\"]] as const;\nconst _scopeEnumSimpleCheck: Partial<RulesConfig> = {\n\t\"scope-enum\": _scopeEnumSimple,\n};\nvoid _scopeEnumSimpleCheck;\n\nconst _scopeCaseObject = [\n\tERROR,\n\t\"always\",\n\t{ cases: [\"camel-case\"] as const, delimiters: [\"-\"] as const },\n] as const;\nconst _scopeCaseObjectCheck: Partial<RulesConfig> = {\n\t\"scope-case\": _scopeCaseObject,\n};\nvoid _scopeCaseObjectCheck;\n\n// Simple array form: ensure CaseRuleConfig accepts readonly arrays.\nconst _scopeCaseSimple = [ERROR, \"always\", [\"camel-case\"]] as const;\nconst _scopeCaseSimpleCheck: Partial<RulesConfig> = {\n\t\"scope-case\": _scopeCaseSimple,\n};\nvoid _scopeCaseSimpleCheck;\n\n// Tests for context parameter support:\n// https://github.com/conventional-changelog/commitlint/issues/4357\n// Rule functions should accept an optional context parameter with cwd.\n\n// Sync function with context\nconst _syncWithCtx: Partial<RulesConfig> = {\n\t\"scope-enum\": (ctx) => [ERROR, \"always\", [\"foo\", ctx?.cwd || \"bar\"]],\n};\nvoid _syncWithCtx;\n\n// Async function with context\nconst _asyncWithCtx: Partial<RulesConfig> = {\n\t\"scope-enum\": async (ctx) => [ERROR, \"always\", [\"foo\", ctx?.cwd || \"bar\"]],\n};\nvoid _asyncWithCtx;\n\n// Function without context (backward compatibility)\nconst _funcNoCtx: Partial<RulesConfig> = {\n\t\"scope-enum\": () => [ERROR, \"always\", [\"foo\", \"bar\"]],\n};\nvoid _funcNoCtx;\n\n// Async function without context (backward compatibility)\nconst _asyncNoCtx: Partial<RulesConfig> = {\n\t\"scope-enum\": async () => [ERROR, \"always\", [\"foo\", \"bar\"]],\n};\nvoid _asyncNoCtx;\n"
  },
  {
    "path": "@commitlint/types/src/rules.ts",
    "content": "import type { Commit } from \"conventional-commits-parser\";\n\nimport { TargetCaseType } from \"./ensure.js\";\n\n/**\n * Rules match the input either as successful or failed.\n * For example, when `header-full-stop` detects a full stop and is set as \"always\"; it's true.\n * If the `header-full-stop` discovers a full stop but is set to \"never\"; it's false.\n */\nexport type RuleOutcome = Readonly<[boolean, string?]>;\n\n/**\n * Rules receive a parsed commit, condition, and possible additional settings through value.\n * All rules should provide the most sensible rule condition and value.\n */\nexport type RuleType = \"async\" | \"sync\" | \"either\";\n\nexport type BaseRule<Value = never, Type extends RuleType = \"either\"> = (\n\tparsed: Commit,\n\twhen?: RuleConfigCondition,\n\tvalue?: Value,\n) => Type extends \"either\"\n\t? RuleOutcome | Promise<RuleOutcome>\n\t: Type extends \"async\"\n\t\t? Promise<RuleOutcome>\n\t\t: Type extends \"sync\"\n\t\t\t? RuleOutcome\n\t\t\t: never;\n\nexport type Rule<Value = never> = BaseRule<Value, \"either\">;\nexport type AsyncRule<Value = never> = BaseRule<Value, \"async\">;\nexport type SyncRule<Value = never> = BaseRule<Value, \"sync\">;\n\n/**\n * Rules always have a severity.\n * Severity indicates what to do if the rule is found to be broken\n * 0 - Disable this rule\n * 1 - Warn for violations\n * 2 - Error for violations\n */\nexport enum RuleConfigSeverity {\n\tDisabled = 0,\n\tWarning = 1,\n\tError = 2,\n}\n\n/**\n * Rules always have a condition.\n * It can be either \"always\" (as tested), or \"never\" (as tested).\n * For example, `header-full-stop` can be enforced as \"always\" or \"never\".\n */\nexport type RuleConfigCondition = \"always\" | \"never\";\n\nexport type RuleConfigTuple<T> = T extends void\n\t?\n\t\t\t| Readonly<[RuleConfigSeverity.Disabled]>\n\t\t\t| Readonly<[RuleConfigSeverity, RuleConfigCondition]>\n\t:\n\t\t\t| Readonly<[RuleConfigSeverity.Disabled]>\n\t\t\t| Readonly<[RuleConfigSeverity, RuleConfigCondition, T]>;\n\nexport enum RuleConfigQuality {\n\tUser,\n\tQualified,\n}\n\nexport interface RuleConfigContext {\n\tcwd?: string;\n}\n\nexport type QualifiedRuleConfig<T> =\n\t| ((ctx?: RuleConfigContext) => RuleConfigTuple<T>)\n\t| ((ctx?: RuleConfigContext) => Promise<RuleConfigTuple<T>>)\n\t| RuleConfigTuple<T>;\n\nexport type RuleConfig<\n\tV = RuleConfigQuality.Qualified,\n\tT = void,\n> = V extends RuleConfigQuality.Qualified\n\t? RuleConfigTuple<T>\n\t: QualifiedRuleConfig<T>;\n\nexport type CaseRuleConfig<V = RuleConfigQuality.User> = RuleConfig<\n\tV,\n\tTargetCaseType | readonly TargetCaseType[]\n>;\nexport type LengthRuleConfig<V = RuleConfigQuality.User> = RuleConfig<\n\tV,\n\tnumber\n>;\nexport type EnumRuleConfig<V = RuleConfigQuality.User> = RuleConfig<\n\tV,\n\treadonly string[]\n>;\nexport type ObjectRuleConfig<\n\tV = RuleConfigQuality.User,\n\tT = Record<string, unknown>,\n> = RuleConfig<V, T>;\n\nexport type RulesConfig<V = RuleConfigQuality.User> = {\n\t\"body-case\": CaseRuleConfig<V>;\n\t\"body-empty\": RuleConfig<V>;\n\t\"body-full-stop\": RuleConfig<V, string>;\n\t\"body-leading-blank\": RuleConfig<V>;\n\t\"body-max-length\": LengthRuleConfig<V>;\n\t\"body-max-line-length\": LengthRuleConfig<V>;\n\t\"body-min-length\": LengthRuleConfig<V>;\n\t\"breaking-change-exclamation-mark\": CaseRuleConfig<V>;\n\t\"footer-empty\": RuleConfig<V>;\n\t\"footer-leading-blank\": RuleConfig<V>;\n\t\"footer-max-length\": LengthRuleConfig<V>;\n\t\"footer-max-line-length\": LengthRuleConfig<V>;\n\t\"footer-min-length\": LengthRuleConfig<V>;\n\t\"header-case\": CaseRuleConfig<V>;\n\t\"header-full-stop\": RuleConfig<V, string>;\n\t\"header-max-length\": LengthRuleConfig<V>;\n\t\"header-min-length\": LengthRuleConfig<V>;\n\t\"header-trim\": RuleConfig<V>;\n\t\"references-empty\": RuleConfig<V>;\n\t\"scope-case\":\n\t\t| CaseRuleConfig<V>\n\t\t| ObjectRuleConfig<\n\t\t\t\tV,\n\t\t\t\t{ cases: readonly TargetCaseType[]; delimiters?: readonly string[] }\n\t\t  >;\n\t\"scope-delimiter-style\": EnumRuleConfig<V>;\n\t\"scope-empty\": RuleConfig<V>;\n\t\"scope-enum\":\n\t\t| EnumRuleConfig<V>\n\t\t| ObjectRuleConfig<\n\t\t\t\tV,\n\t\t\t\t{ scopes: readonly string[]; delimiters?: readonly string[] }\n\t\t  >;\n\t\"scope-max-length\": LengthRuleConfig<V>;\n\t\"scope-min-length\": LengthRuleConfig<V>;\n\t\"signed-off-by\": RuleConfig<V, string>;\n\t\"subject-case\": CaseRuleConfig<V>;\n\t\"subject-empty\": RuleConfig<V>;\n\t\"subject-full-stop\": RuleConfig<V, string>;\n\t\"subject-max-length\": LengthRuleConfig<V>;\n\t\"subject-min-length\": LengthRuleConfig<V>;\n\t\"trailer-exists\": RuleConfig<V, string>;\n\t\"type-case\": CaseRuleConfig<V>;\n\t\"type-empty\": RuleConfig<V>;\n\t\"type-enum\": EnumRuleConfig<V>;\n\t\"type-max-length\": LengthRuleConfig<V>;\n\t\"type-min-length\": LengthRuleConfig<V>;\n\t// Plugins may add their custom rules\n\t[key: string]: AnyRuleConfig<V>;\n};\n\nexport type AnyRuleConfig<V> = RuleConfig<V, unknown> | RuleConfig<V, void>;\n"
  },
  {
    "path": "@commitlint/types/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src\"],\n  \"exclude\": [\"./src/**/*.test-d.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@packages/test/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n**Note:** Version bump only for package @commitlint/test\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n\n### Features\n\n* upgrade conventional commit packages [#4082](https://github.com/conventional-changelog/commitlint/issues/4082) ([#4597](https://github.com/conventional-changelog/commitlint/issues/4597)) ([3aaf0a6](https://github.com/conventional-changelog/commitlint/commit/3aaf0a603c4047d268d85207957c919f45b60e1f))\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/test\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n\n### Bug Fixes\n\n* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299))\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/test\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/test\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n\n### Bug Fixes\n\n* update dependency @types/fs-extra to v11 ([#3494](https://github.com/conventional-changelog/commitlint/issues/3494)) ([8f553c7](https://github.com/conventional-changelog/commitlint/commit/8f553c7603e3ee0f435d878e396eec899a213de8))\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n### Bug Fixes\n\n- update dependency fs-extra to v11 ([#3460](https://github.com/conventional-changelog/commitlint/issues/3460)) ([a437923](https://github.com/conventional-changelog/commitlint/commit/a43792388e0d9707da770b26592c5e31553384a1))\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n**Note:** Version bump only for package @commitlint/test\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/test\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n### Tests\n\n- **config-lerna-scopes:** reuse npm bootstrap to simplify tests ([#2479](https://github.com/conventional-changelog/commitlint/issues/2479)) ([9a7a43a](https://github.com/conventional-changelog/commitlint/commit/9a7a43aa8a7eca18f2fe05c78d27dcb1a128930c)), closes [#2447](https://github.com/conventional-changelog/commitlint/issues/2447)\n\n### BREAKING CHANGES\n\n- **config-lerna-scopes:** upgrade to lerna v4\n\nCo-authored-by: Renovate Bot <bot@renovateapp.com>\nCo-authored-by: escapedcat <github@htmlcss.de>\n\n- test(config-lerna-scopes): reuse npm bootstrap to simplify tests\n\n- test(config-lerna-scopes): reuse npm bootstrap to simplify tests\n\n- test: fix issue after merge\n\n- test: one more fix after merge\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>\nCo-authored-by: Renovate Bot <bot@renovateapp.com>\nCo-authored-by: escapedcat <github@htmlcss.de>\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/test\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n**Note:** Version bump only for package @commitlint/test\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n### Bug Fixes\n\n- update dependency fs-extra to v10 ([#2575](https://github.com/conventional-changelog/commitlint/issues/2575)) ([d47d2b5](https://github.com/conventional-changelog/commitlint/commit/d47d2b595b980adadd4fb8ff198c1914caeff18f))\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n**Note:** Version bump only for package @commitlint/test\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/test\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- update dependency execa to v5 ([#2341](https://github.com/conventional-changelog/commitlint/issues/2341)) ([f349df9](https://github.com/conventional-changelog/commitlint/commit/f349df90f08096a9bcad46b5e55b411aac327a24))\n- update dependency pkg-dir to v5 ([#2168](https://github.com/conventional-changelog/commitlint/issues/2168)) ([b9d1c84](https://github.com/conventional-changelog/commitlint/commit/b9d1c8462950303a7695f248849dd9f6a58b5a9a))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n- refactor!: drop support for lerna v2 ([59667b3](https://github.com/conventional-changelog/commitlint/commit/59667b376118323b1312d3d1084b9178918f3d23))\n\n### Bug Fixes\n\n- update dependency @types/fs-extra to ^9.0.1 ([#2088](https://github.com/conventional-changelog/commitlint/issues/2088)) ([cb1028e](https://github.com/conventional-changelog/commitlint/commit/cb1028ef2700d86991c69a1e2ad391bc1bdc9d90))\n\n### BREAKING CHANGES\n\n- remove lerna v2 support and tests\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency execa to v4 ([#1936](https://github.com/conventional-changelog/commitlint/issues/1936)) ([8efb441](https://github.com/conventional-changelog/commitlint/commit/8efb44193058d286f7325327a6d33936b273ec91))\n- update dependency fs-extra to v9 ([#1018](https://github.com/conventional-changelog/commitlint/issues/1018)) ([2df49fa](https://github.com/conventional-changelog/commitlint/commit/2df49fac907993ae78199a1012e918b0e2ff5621))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/test\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n### Bug Fixes\n\n- mark internal packages as private [#972](https://github.com/conventional-changelog/commitlint/issues/972) ([#1970](https://github.com/conventional-changelog/commitlint/issues/1970)) ([2351124](https://github.com/conventional-changelog/commitlint/commit/23511248b2b4020ee87d04a838c7ce31e094c128))\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency tmp to v0.2.1 ([#1817](https://github.com/conventional-changelog/commitlint/issues/1817)) ([0ff72f4](https://github.com/conventional-changelog/commitlint/commit/0ff72f41bd48b3dd37f881f6fb11477d8f643735))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/test\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/test\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/test\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"5.2.6\"></a>\n\n## [5.2.6](https://github.com/conventional-changelog/commitlint/compare/v5.2.5...v5.2.6) (2017-12-21)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"5.2.0\"></a>\n\n# [5.2.0](https://github.com/conventional-changelog/commitlint/compare/v5.1.3...v5.2.0) (2017-11-30)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Bug Fixes\n\n- update dependency concurrently to v3.5.1 ([#147](https://github.com/conventional-changelog/commitlint/issues/147)) ([a809d0f](https://github.com/conventional-changelog/commitlint/commit/a809d0f))\n\n### Features\n\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n### Bug Fixes\n\n- **core:** fall back to globally installed config if available ([#127](https://github.com/conventional-changelog/commitlint/issues/127)) ([8612eb3](https://github.com/conventional-changelog/commitlint/commit/8612eb3))\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n### Bug Fixes\n\n- **core:** consider config outside of current git repo ([f7234b6](https://github.com/conventional-changelog/commitlint/commit/f7234b6))\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package @commitlint/test\n\n<a name=\"4.1.1\"></a>\n\n## [4.1.1](https://github.com/conventional-changelog/commitlint/compare/v4.1.0...v4.1.1) (2017-10-09)\n\n**Note:** Version bump only for package @commitlint/test\n"
  },
  {
    "path": "@packages/test/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@packages/test/package.json",
    "content": "{\n  \"name\": \"@commitlint/test\",\n  \"type\": \"module\",\n  \"version\": \"20.4.3\",\n  \"description\": \"test utilities for @commitlint\",\n  \"private\": true,\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@packages/test\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"cli\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@types/fs-extra\": \"^11.0.3\",\n    \"@types/tmp\": \"^0.2.5\",\n    \"fs-extra\": \"^11.3.4\",\n    \"pkg-dir\": \"^8.0.0\",\n    \"resolve-pkg\": \"^2.0.0\",\n    \"tinyexec\": \"^1.0.0\",\n    \"tmp\": \"^0.2.1\"\n  },\n  \"gitHead\": \"71f0194f33943954a8dac1c458be47e5049717cd\"\n}\n"
  },
  {
    "path": "@packages/test/src/fix.ts",
    "content": "import path from \"node:path\";\n\nimport fs from \"fs-extra\";\nimport { packageDirectory as pkgDir } from \"pkg-dir\";\nimport tmp from \"tmp\";\n\nexport async function bootstrap(fixture?: string, directory?: string) {\n\tconst tmpDir = tmp.dirSync({\n\t\tkeep: false,\n\t\tunsafeCleanup: true,\n\t});\n\n\tif (typeof fixture !== \"undefined\") {\n\t\tconst packageDir = await pkgDir({ cwd: directory });\n\t\tif (!packageDir) {\n\t\t\tthrow new Error(`ENOENT, no such file or directory '${packageDir}'`);\n\t\t}\n\n\t\tawait fs.copy(path.join(packageDir, fixture), tmpDir.name);\n\t}\n\n\treturn tmpDir.name;\n}\n"
  },
  {
    "path": "@packages/test/src/git.ts",
    "content": "import { x } from \"tinyexec\";\n\nimport * as fix from \"./fix.js\";\n\nexport async function bootstrap(fixture?: string, directory?: string) {\n\tconst cwd = await fix.bootstrap(fixture, directory);\n\n\tawait init(cwd);\n\treturn cwd;\n}\n\nexport async function clone(\n\tsource: string,\n\targs: string[],\n\tdirectory?: string,\n\tgitCommand = \"git\",\n) {\n\tconst cwd = await fix.bootstrap(undefined, directory);\n\n\tawait x(gitCommand, [\"clone\", ...args, source, cwd]);\n\tawait setup(cwd, gitCommand);\n\treturn cwd;\n}\n\nexport async function init(cwd: string) {\n\tawait x(\"git\", [\"init\", cwd]);\n\tawait setup(cwd);\n\treturn cwd;\n}\n\nasync function setup(cwd: string, gitCommand = \"git\") {\n\ttry {\n\t\tawait x(gitCommand, [\"config\", \"user.name\", \"ava\"], {\n\t\t\tnodeOptions: { cwd },\n\t\t});\n\t\tawait x(gitCommand, [\"config\", \"user.email\", \"test@example.com\"], {\n\t\t\tnodeOptions: { cwd },\n\t\t});\n\t\tawait x(gitCommand, [\"config\", \"commit.gpgsign\", \"false\"], {\n\t\t\tnodeOptions: { cwd },\n\t\t});\n\t} catch (err: any) {\n\t\tif (typeof err === \"object\" && typeof err.message === \"object\") {\n\t\t\tconsole.warn(`git config in ${cwd} failed`, err.message);\n\t\t} else {\n\t\t\tconsole.error(\"An unknown error occurred setting up the git environment\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "@packages/test/src/index.test.ts",
    "content": "import { test, expect } from \"vitest\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport fs from \"fs-extra\";\n\nimport * as u from \"./index.js\";\n\ntest(\"exports a git namespace\", () => {\n\texpect(typeof u.git).toBe(\"object\");\n});\n\ntest(\"git namespace has bootstrap\", () => {\n\texpect(typeof u.git.bootstrap).toBe(\"function\");\n});\n\ntest(\"git namespace has clone\", () => {\n\texpect(typeof u.git.clone).toBe(\"function\");\n});\n\ntest(\"expect to create tmp directory\", async () => {\n\tconst directory = await u.git.bootstrap();\n\texpect(directory).toContain(\"tmp-\");\n\texpect(directory).toContain(os.tmpdir());\n});\n\ntest(\"expect to create tmp from directory from src\", async () => {\n\tconst directory = await u.git.bootstrap(\".github\");\n\texpect(directory).toContain(\"tmp-\");\n\texpect(directory).toContain(os.tmpdir());\n\texpect(fs.existsSync(directory)).toBeTruthy();\n\n\tconst indexFile = path.join(directory, \"PULL_REQUEST_TEMPLATE.md\");\n\texpect(fs.existsSync(indexFile)).toBeTruthy();\n});\n"
  },
  {
    "path": "@packages/test/src/index.ts",
    "content": "import * as fix from \"./fix.js\";\nimport * as git from \"./git.js\";\nimport * as npm from \"./npm.js\";\n\nexport { fix, git, npm };\n"
  },
  {
    "path": "@packages/test/src/npm.ts",
    "content": "import path from \"node:path\";\nimport { createRequire } from \"node:module\";\n\nimport fs from \"fs-extra\";\nimport resolvePkg from \"resolve-pkg\";\n\nimport * as git from \"./git.js\";\n\nconst require = createRequire(import.meta.url);\n\nexport async function installModules(cwd: string) {\n\tconst manifestPath = path.join(cwd, \"package.json\");\n\tconst targetModulesPath = path.join(cwd, \"node_modules\");\n\n\tif (await fs.pathExists(manifestPath)) {\n\t\tconst { dependencies = {}, devDependencies = {} } =\n\t\t\tawait fs.readJson(manifestPath);\n\t\tconst deps = Object.keys({ ...dependencies, ...devDependencies });\n\t\tawait Promise.all(\n\t\t\tdeps.map(async (dependency: any) => {\n\t\t\t\tlet sourcePath = resolvePkg(dependency);\n\n\t\t\t\tif (!sourcePath) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst entry = require.resolve(dependency);\n\t\t\t\t\t\tconst sourceModulesPath = findParentPath(entry, \"node_modules\");\n\t\t\t\t\t\tif (sourceModulesPath) {\n\t\t\t\t\t\t\tconst rel = path.relative(sourceModulesPath, entry);\n\t\t\t\t\t\t\tconst segments = rel.split(path.sep);\n\t\t\t\t\t\t\tif (segments[0].startsWith(\"@\")) {\n\t\t\t\t\t\t\t\tsourcePath = path.join(\n\t\t\t\t\t\t\t\t\tsourceModulesPath,\n\t\t\t\t\t\t\t\t\tsegments[0],\n\t\t\t\t\t\t\t\t\tsegments[1],\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsourcePath = path.join(sourceModulesPath, segments[0]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\t// Only silently ignore expected MODULE_NOT_FOUND errors\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\te &&\n\t\t\t\t\t\t\ttypeof e === \"object\" &&\n\t\t\t\t\t\t\t\"code\" in e &&\n\t\t\t\t\t\t\t(e as any).code === \"MODULE_NOT_FOUND\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Expected: package not found via require.resolve\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\"Unexpected error while resolving dependency:\",\n\t\t\t\t\t\t\t\tdependency,\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!sourcePath) {\n\t\t\t\t\tthrow new Error(`Could not resolve dependency ${dependency}`);\n\t\t\t\t}\n\n\t\t\t\tconst sourceModulesPath = findParentPath(sourcePath, \"node_modules\");\n\n\t\t\t\tif (!sourceModulesPath) {\n\t\t\t\t\tthrow new Error(`Could not determine node_modules for ${sourcePath}`);\n\t\t\t\t}\n\n\t\t\t\tconst relativePath = path.relative(sourceModulesPath, sourcePath);\n\t\t\t\tconst targetPath = path.join(targetModulesPath, relativePath);\n\n\t\t\t\tawait fs.mkdirp(path.join(targetPath, \"..\"));\n\t\t\t\tawait fs.symlink(sourcePath, targetPath);\n\t\t\t}),\n\t\t);\n\t}\n}\n\nexport async function bootstrap(fixture: string, directory?: string) {\n\tconst cwd = await git.bootstrap(fixture, directory);\n\tawait installModules(cwd);\n\treturn cwd;\n}\n\nfunction findParentPath(\n\tparentPath: string,\n\tdirname: string,\n): string | undefined {\n\tconst parts = parentPath.split(path.sep);\n\tconst idx = parts.lastIndexOf(dirname);\n\tif (idx >= 0) {\n\t\treturn parts.slice(0, idx + 1).join(path.sep);\n\t}\n\treturn undefined;\n}\n"
  },
  {
    "path": "@packages/test/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src/**/*.ts\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@packages/test-environment/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n**Note:** Version bump only for package vitest-environment-commitlint\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package vitest-environment-commitlint\n\n\n\n\n\n# [19.9.0](https://github.com/conventional-changelog/commitlint/compare/v19.8.1...v19.9.0) (2025-08-26)\n\n\n### Bug Fixes\n\n* 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))\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n**Note:** Version bump only for package vitest-environment-commitlint\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n\n* chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n\n### BREAKING CHANGES\n\n* drop node v12 support\n\n* chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n\n\n\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n\n* chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n\n### BREAKING CHANGES\n\n* minimum node version is 12\n\n\n\n\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n\n* refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n\n### BREAKING CHANGES\n\n* remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n* docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n\n\n\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n\n### Bug Fixes\n\n* mark internal packages as private [#972](https://github.com/conventional-changelog/commitlint/issues/972) ([#1970](https://github.com/conventional-changelog/commitlint/issues/1970)) ([2351124](https://github.com/conventional-changelog/commitlint/commit/23511248b2b4020ee87d04a838c7ce31e094c128))\n\n\n\n\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n\n### Bug Fixes\n\n* update dependency tmp to v0.2.1 ([#1817](https://github.com/conventional-changelog/commitlint/issues/1817)) ([0ff72f4](https://github.com/conventional-changelog/commitlint/commit/0ff72f41bd48b3dd37f881f6fb11477d8f643735))\n\n\n\n\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/test-environment\n\n\n\n\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n**Note:** Version bump only for package @commitlint/test-environment\n"
  },
  {
    "path": "@packages/test-environment/package.json",
    "content": "{\n  \"name\": \"vitest-environment-commitlint\",\n  \"type\": \"module\",\n  \"version\": \"20.4.2\",\n  \"description\": \"test environment for @commitlint\",\n  \"private\": true,\n  \"main\": \"lib/test-environment.js\",\n  \"types\": \"lib/test-environment.d.ts\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@packages/test-environment\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"test\",\n    \"cli\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@types/tmp\": \"^0.2.5\",\n    \"tmp\": \"^0.2.1\",\n    \"vitest\": \"~4.0.18\"\n  },\n  \"gitHead\": \"71f0194f33943954a8dac1c458be47e5049717cd\"\n}\n"
  },
  {
    "path": "@packages/test-environment/src/test-environment.ts",
    "content": "// https://github.com/raszi/node-tmp/issues/229\n\nimport type { Environment } from \"vitest/environments\";\nimport { builtinEnvironments } from \"vitest/environments\";\nimport tmp from \"tmp\";\n\nconst nodeEnv = builtinEnvironments.node;\n\nconst env: Environment = {\n\t...nodeEnv,\n\tname: \"commitlint\",\n\tviteEnvironment: \"node\",\n\tasync setup(global: object, options: Record<string, unknown>) {\n\t\tconst setupEnv = await nodeEnv.setup(global, options);\n\t\treturn {\n\t\t\t...setupEnv,\n\t\t\tteardown(global: unknown) {\n\t\t\t\ttmp.setGracefulCleanup();\n\t\t\t\treturn setupEnv.teardown(global);\n\t\t\t},\n\t\t};\n\t},\n};\n\nexport default env;\n"
  },
  {
    "path": "@packages/test-environment/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.shared.json\",\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"rootDir\": \"./src\",\n    \"outDir\": \"./lib\"\n  },\n  \"include\": [\"./src/**/*.ts\"],\n  \"exclude\": [\"./src/**/*.test.ts\", \"./lib/**/*\"]\n}\n"
  },
  {
    "path": "@packages/utils/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n**Note:** Version bump only for package @commitlint/utils\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n\n### Bug Fixes\n\n* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299))\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Performance Improvements\n\n* 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))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n**Note:** Version bump only for package @commitlint/utils\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n\n### Bug Fixes\n\n* update dependency tar-fs to v3.0.5 ([#3903](https://github.com/conventional-changelog/commitlint/issues/3903)) ([79d77c9](https://github.com/conventional-changelog/commitlint/commit/79d77c9ef8de5046106027fc7d80dfd77faeb3e5))\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n\n### Bug Fixes\n\n* **utils:** remove fs-extra usage ([#3804](https://github.com/conventional-changelog/commitlint/issues/3804)) ([92f2237](https://github.com/conventional-changelog/commitlint/commit/92f2237d66950d9cb92430bc082a86a5dbc86d3f))\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n\n### Bug Fixes\n\n* update dependency read-pkg to v9.0.1 ([#3777](https://github.com/conventional-changelog/commitlint/issues/3777)) ([88c4b8a](https://github.com/conventional-changelog/commitlint/commit/88c4b8a33dc2ebb63715018b3a0945d94cdfceeb))\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n\n### Bug Fixes\n\n* update dependency read-pkg to v9 ([#3734](https://github.com/conventional-changelog/commitlint/issues/3734)) ([722f518](https://github.com/conventional-changelog/commitlint/commit/722f5183e91186aa7e3912e8f3d0d7069f05ce8f))\n* update dependency tar-fs to v3 ([#3718](https://github.com/conventional-changelog/commitlint/issues/3718)) ([afb04dd](https://github.com/conventional-changelog/commitlint/commit/afb04dd0dc4d42094ae01f0733600c2f9d3abdfd))\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n\n### Bug Fixes\n\n* update dependency read-pkg to v8 ([#3717](https://github.com/conventional-changelog/commitlint/issues/3717)) ([326f497](https://github.com/conventional-changelog/commitlint/commit/326f4975dbc2f06dbe490ca04732441ad062e063))\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/utils\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n### Bug Fixes\n\n- update dependency fs-extra to v11 ([#3460](https://github.com/conventional-changelog/commitlint/issues/3460)) ([a437923](https://github.com/conventional-changelog/commitlint/commit/a43792388e0d9707da770b26592c5e31553384a1))\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n### Bug Fixes\n\n- update dependency read-pkg to v7.1.0 ([#3015](https://github.com/conventional-changelog/commitlint/issues/3015)) ([3b7b680](https://github.com/conventional-changelog/commitlint/commit/3b7b680ce4f5341d8816f3db036170b0cb28d33f))\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n**Note:** Version bump only for package @commitlint/utils\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/utils\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n**Note:** Version bump only for package @commitlint/utils\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n### Bug Fixes\n\n- update dependency read-pkg to v7 ([#2721](https://github.com/conventional-changelog/commitlint/issues/2721)) ([7d9a3b1](https://github.com/conventional-changelog/commitlint/commit/7d9a3b1f2ab41c598f4d23d96805f86a4d41ae09))\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n### Bug Fixes\n\n- update dependency fs-extra to v10 ([#2575](https://github.com/conventional-changelog/commitlint/issues/2575)) ([d47d2b5](https://github.com/conventional-changelog/commitlint/commit/d47d2b595b980adadd4fb8ff198c1914caeff18f))\n- update dependency yargs to v17 ([#2574](https://github.com/conventional-changelog/commitlint/issues/2574)) ([81c38dd](https://github.com/conventional-changelog/commitlint/commit/81c38ddf15f239b525f673b26b2ee6606f2ee8f6))\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n### Bug Fixes\n\n- update dependency read-pkg to v6 ([#2530](https://github.com/conventional-changelog/commitlint/issues/2530)) ([d38a2ad](https://github.com/conventional-changelog/commitlint/commit/d38a2adc07f4cd6dad48aadbb73f2f1d3740e689))\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n**Note:** Version bump only for package @commitlint/utils\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- **utils:** update code to allow it to be executed ([#982](https://github.com/conventional-changelog/commitlint/issues/982)) ([52696d0](https://github.com/conventional-changelog/commitlint/commit/52696d048317944aa0d638b8702df78f8756d44b))\n- update dependency execa to v5 ([#2341](https://github.com/conventional-changelog/commitlint/issues/2341)) ([f349df9](https://github.com/conventional-changelog/commitlint/commit/f349df90f08096a9bcad46b5e55b411aac327a24))\n- update dependency meow to v8 ([#2245](https://github.com/conventional-changelog/commitlint/issues/2245)) ([890961b](https://github.com/conventional-changelog/commitlint/commit/890961b52b1552c1bb2798db02915e28686983f0))\n- update dependency meow to v8.1.0 ([#2380](https://github.com/conventional-changelog/commitlint/issues/2380)) ([0fbadcf](https://github.com/conventional-changelog/commitlint/commit/0fbadcf1d45c2e97f1da9938b3b80c0b45eba18c))\n- update dependency tar-fs to v2.1.1 ([#2261](https://github.com/conventional-changelog/commitlint/issues/2261)) ([a04f24f](https://github.com/conventional-changelog/commitlint/commit/a04f24f00873209d6d96cd894450d17fdfe9ca58))\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n**Note:** Version bump only for package @commitlint/utils\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency execa to v4 ([#1936](https://github.com/conventional-changelog/commitlint/issues/1936)) ([8efb441](https://github.com/conventional-changelog/commitlint/commit/8efb44193058d286f7325327a6d33936b273ec91))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/utils\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n### Bug Fixes\n\n- mark internal packages as private [#972](https://github.com/conventional-changelog/commitlint/issues/972) ([#1970](https://github.com/conventional-changelog/commitlint/issues/1970)) ([2351124](https://github.com/conventional-changelog/commitlint/commit/23511248b2b4020ee87d04a838c7ce31e094c128))\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency tar-fs to v2.1.0 ([#1103](https://github.com/conventional-changelog/commitlint/issues/1103)) ([7882036](https://github.com/conventional-changelog/commitlint/commit/788203689ebf51343ccf2e6eab530e19f4faf122))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n**Note:** Version bump only for package @commitlint/utils\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n### Bug Fixes\n\n- **commitlint:** use new read pkg syntax ([#888](https://github.com/conventional-changelog/commitlint/issues/888)) ([6b3b9a9](https://github.com/conventional-changelog/commitlint/commit/6b3b9a9))\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n**Note:** Version bump only for package @commitlint/utils\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\n**Note:** Version bump only for package @commitlint/utils\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\n**Note:** Version bump only for package @commitlint/utils\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- store concatenated array to problems variable ([#551](https://github.com/conventional-changelog/commitlint/issues/551)) ([434a70f](https://github.com/conventional-changelog/commitlint/commit/434a70f))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n### Bug Fixes\n\n- remove faulty bin entry [#259](https://github.com/conventional-changelog/commitlint/issues/259) ([beafbc6](https://github.com/conventional-changelog/commitlint/commit/beafbc6))\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Features\n\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"4.2.1\"></a>\n\n## [4.2.1](https://github.com/conventional-changelog/commitlint/compare/v4.2.0...v4.2.1) (2017-10-18)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"4.2.0\"></a>\n\n# [4.2.0](https://github.com/conventional-changelog/commitlint/compare/v4.1.1...v4.2.0) (2017-10-14)\n\n**Note:** Version bump only for package @commitlint/utils\n\n<a name=\"3.0.3\"></a>\n\n## 3.0.3 (2017-07-16)\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Bug Fixes\n\n- **utils:** better cross-version support ([856f3da](https://github.com/conventional-changelog/commitlint/commit/856f3da))\n\n<a name=\"3.0.2\"></a>\n\n## 3.0.2 (2017-07-11)\n\n### Bug Fixes\n\n- **utils:** better cross-version support ([856f3da](https://github.com/conventional-changelog/commitlint/commit/856f3da))\n\n<a name=\"3.0.1\"></a>\n\n## 3.0.1 (2017-07-11)\n\n### Bug Fixes\n\n- **utils:** better cross-version support ([856f3da](https://github.com/conventional-changelog/commitlint/commit/856f3da))\n\n<a name=\"3.0.0\"></a>\n\n# 3.0.0 (2017-07-10)\n\n### Bug Fixes\n\n- **utils:** better cross-version support ([bc460c8](https://github.com/conventional-changelog/commitlint/commit/bc460c8))\n"
  },
  {
    "path": "@packages/utils/dep-check.js",
    "content": "#!/usr/bin/env node\nimport path from \"node:path\";\nimport { x } from \"tinyexec\";\n\nconst cwd = process.cwd();\n\nfunction main() {\n\treturn Promise.all([\n\t\tcheck([\"--missing\", \"--no-dev\", \".\"]),\n\t\tcheck([\"--extra\", \"--no-dev\", \".\"]),\n\t])\n\t\t.then((tasks) => [null, tasks.map((t) => t.stdout).join(\"\\n\")])\n\t\t.catch((err) => [err]);\n}\n\nfunction check(args) {\n\treturn x(\"dependency-check\", args, { nodeOptions: { cwd } });\n}\n\nmain().then((args) => {\n\tconst err = args[0];\n\tconst out = args[1];\n\tconsole.log(`Checking dependencies ${path.join(cwd, \"package.json\")}`);\n\tif (err) {\n\t\tconsole.error(err.stderr);\n\t\tprocess.exit(err.exitCode);\n\t}\n\tif (out) {\n\t\tconsole.log(out);\n\t\tprocess.exit(0);\n\t}\n});\n"
  },
  {
    "path": "@packages/utils/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "@packages/utils/package.json",
    "content": "{\n  \"name\": \"@commitlint/utils\",\n  \"type\": \"module\",\n  \"version\": \"20.0.0\",\n  \"description\": \"Development utilities for @commitlint\",\n  \"private\": true,\n  \"files\": [\n    \"dep-check.js\",\n    \"pkg-check.js\"\n  ],\n  \"bin\": {\n    \"dep-check\": \"./dep-check.js\",\n    \"pkg-check\": \"./pkg-check.js\"\n  },\n  \"scripts\": {\n    \"deps\": \"node dep-check.js\",\n    \"pkg\": \"node pkg-check.js --skip-main\"\n  },\n  \"engines\": {\n    \"node\": \">=v18\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\",\n    \"directory\": \"@packages/utils\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://commitlint.js.org/\",\n  \"keywords\": [\n    \"conventional-changelog\",\n    \"commitlint\",\n    \"cli\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@types/require-from-string\": \"^1.2.3\",\n    \"@types/tar-fs\": \"^2.0.4\",\n    \"@types/yargs\": \"^17.0.29\"\n  },\n  \"dependencies\": {\n    \"read-pkg\": \"^9.0.1\",\n    \"require-from-string\": \"^2.0.2\",\n    \"tar-fs\": \"^3.0.5\",\n    \"tinyexec\": \"^1.0.0\",\n    \"tmp\": \"^0.2.1\",\n    \"yargs\": \"^17.0.0\"\n  },\n  \"gitHead\": \"71f0194f33943954a8dac1c458be47e5049717cd\"\n}\n"
  },
  {
    "path": "@packages/utils/pkg-check.js",
    "content": "#!/usr/bin/env node\nimport path from \"node:path\";\nimport fs from \"node:fs\";\n\nimport readPkg from \"read-pkg\";\nimport requireFromString from \"require-from-string\";\nimport tar from \"tar-fs\";\nimport { x } from \"tinyexec\";\nimport tmp from \"tmp\";\nimport yargs from \"yargs\";\nimport zlib from \"node:zlib\";\n\ntmp.setGracefulCleanup();\n\nconst PRELUDE = `\nvar Module = require('node:module');\nvar originalLoader = Module._load\n\nModule._load = function(path, parent) {\n\tif (path.startsWith('.') || Module.builtinModules.includes(path)) {\n\t  return originalLoader.apply(this, arguments);\n\t}\n\tvar dummy = new Proxy({}, {\n\t\tget() {\n\t\t\treturn dummy;\n\t\t}\n\t});\n\treturn dummy;\n};\n`;\n\nfunction main(flags) {\n\tif (!Proxy) {\n\t\tconsole\n\t\t\t.warn(\"Skipping pkg-check, detected missing Proxy support\")\n\t\t\t.process.exit(0);\n\t}\n\n\tconst cwd = flags.cwd || process.cwd();\n\tconst skipImport =\n\t\ttypeof flags.skipImport === \"boolean\" ? flags.skipImport : false;\n\n\treturn readPkg({ cwd }).then((pkg) => {\n\t\treturn getTarballFiles(cwd, { write: !skipImport }).then((tarball) => {\n\t\t\treturn getPackageFiles(cwd).then((pkgFiles) => {\n\t\t\t\tlet problems = [];\n\n\t\t\t\tif (!flags.skipBin) {\n\t\t\t\t\tproblems = problems.concat(\n\t\t\t\t\t\tpkgFiles.bin\n\t\t\t\t\t\t\t.filter((binFile) => tarball.files.indexOf(binFile) === -1)\n\t\t\t\t\t\t\t.map((binFile) => ({\n\t\t\t\t\t\t\t\ttype: \"bin\",\n\t\t\t\t\t\t\t\tfile: binFile,\n\t\t\t\t\t\t\t\tmessage: `Required bin file ${binFile} not found for ${pkg.name}`,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!flags.skipMain && tarball.files.indexOf(pkgFiles.main) === -1) {\n\t\t\t\t\tproblems.push({\n\t\t\t\t\t\ttype: \"main\",\n\t\t\t\t\t\tfile: pkgFiles.main,\n\t\t\t\t\t\tmessage: `Required main file ${pkgFiles.main} not found for ${pkg.name}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (!flags.skipImport && !flags.skipMain) {\n\t\t\t\t\tconst importable = fileImportable(\n\t\t\t\t\t\tpath.join(tarball.dirname, pkgFiles.main),\n\t\t\t\t\t);\n\t\t\t\t\tif (!importable[1]) {\n\t\t\t\t\t\tproblems.push({\n\t\t\t\t\t\t\ttype: \"import\",\n\t\t\t\t\t\t\tfile: pkgFiles.main,\n\t\t\t\t\t\t\tmessage: `Error while importing ${pkgFiles.main}: ${importable[0].message}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tpkg: pkg,\n\t\t\t\t\tpkgFiles: pkgFiles,\n\t\t\t\t\tfiles: tarball.files,\n\t\t\t\t\tproblems: problems,\n\t\t\t\t};\n\t\t\t});\n\t\t});\n\t});\n}\n\nmain(\n\tyargs\n\t\t.options({\n\t\t\tcwd: {\n\t\t\t\tdescription: \"directory to execute in\",\n\t\t\t\ttype: \"string\",\n\t\t\t},\n\t\t\tskipMain: {\n\t\t\t\tdefault: false,\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdescription: \"Skip main checks\",\n\t\t\t},\n\t\t\tskipBin: {\n\t\t\t\tdefault: false,\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdescription: \"Skip bin checks\",\n\t\t\t},\n\t\t\tskipImport: {\n\t\t\t\tdefault: false,\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdescription: \"Skip import smoke test\",\n\t\t\t},\n\t\t})\n\t\t.scriptName(\"pkg-check\")\n\t\t.usage(\"pkg-check\\n\")\n\t\t.usage(\"Check if a package creates valid tarballs\")\n\t\t.example(\"$0\", \"\")\n\t\t.help()\n\t\t.version()\n\t\t.strict().argv,\n)\n\t.then((report) => {\n\t\tif (report.problems.length > 0) {\n\t\t\tconsole.log(\n\t\t\t\t`Found ${report.problems.length} problems while checking tarball for ${report.pkg.name}:`,\n\t\t\t);\n\n\t\t\treport.problems.forEach((problem) => {\n\t\t\t\tconsole.log(problem.message);\n\t\t\t});\n\n\t\t\tprocess.exit(1);\n\t\t}\n\t})\n\t.catch((err) => {\n\t\tsetTimeout(() => {\n\t\t\tthrow err;\n\t\t}, 0);\n\t});\n\nasync function getTarballFiles(source, options) {\n\tconst tmpDir = tmp.dirSync({\n\t\tkeep: false,\n\t\tunsafeCleanup: true,\n\t});\n\tconst cwd = tmpDir.name;\n\tconst tarball = path.join(cwd, \"test-archive.tgz\");\n\tawait x(\"yarn\", [\"pack\", \"--filename\", tarball], {\n\t\tnodeOptions: { cwd: source },\n\t});\n\n\treturn getArchiveFiles(tarball, options);\n}\n\nfunction getArchiveFiles(filePath, options) {\n\tconst write = typeof options.write === \"boolean\" ? options.write : true;\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst files = [];\n\t\tfs.createReadStream(filePath)\n\t\t\t.pipe(zlib.createGunzip())\n\t\t\t.pipe(\n\t\t\t\ttar.extract(path.dirname(filePath), {\n\t\t\t\t\tignore(_, header) {\n\t\t\t\t\t\tfiles.push(path.relative(\"package\", header.name));\n\t\t\t\t\t\treturn !write;\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.once(\"error\", (err) => reject(err))\n\t\t\t.once(\"finish\", () =>\n\t\t\t\tresolve({\n\t\t\t\t\tdirname: path.join(path.dirname(filePath), \"package\"),\n\t\t\t\t\tfiles: files,\n\t\t\t\t}),\n\t\t\t);\n\t});\n}\n\nfunction getPackageFiles(source) {\n\treturn readPkg(source).then((pkg) => {\n\t\treturn {\n\t\t\tmain: normalizeMainPath(pkg.main || \"./index.js\"),\n\t\t\tbin: getPkgBinFiles(pkg.bin),\n\t\t};\n\t});\n}\n\nfunction normalizeMainPath(mainPath) {\n\tconst norm = path.normalize(mainPath);\n\tif (norm[norm.length - 1] === path.sep) {\n\t\treturn `${norm}index.js`;\n\t}\n\treturn norm;\n}\n\nfunction getPkgBinFiles(bin) {\n\tif (!bin) {\n\t\treturn [];\n\t}\n\n\tif (typeof bin === \"string\") {\n\t\treturn [path.normalize(bin)];\n\t}\n\n\tif (typeof bin === \"object\") {\n\t\treturn Object.values(bin).map((b) => path.normalize(b));\n\t}\n}\n\nfunction fileImportable(file) {\n\ttry {\n\t\trequireFromString(\n\t\t\t`\n\t\t\t${PRELUDE}\n\t\t\t${fs.readFileSync(file)}\n\t\t`,\n\t\t\tfile,\n\t\t);\n\t\treturn [null, true];\n\t} catch (err) {\n\t\treturn [err, false];\n\t}\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n# [20.5.0](https://github.com/conventional-changelog/commitlint/compare/v20.4.4...v20.5.0) (2026-03-15)\n\n\n### Bug Fixes\n\n* **cli:** validate that --cwd directory exists before execution ([#4658](https://github.com/conventional-changelog/commitlint/issues/4658)) ([cf80f75](https://github.com/conventional-changelog/commitlint/commit/cf80f75745593f4f018cac301a91f23316c974fd)), closes [#4595](https://github.com/conventional-changelog/commitlint/issues/4595)\n* **load:** resolve async config exports in CJS projects ([#4659](https://github.com/conventional-changelog/commitlint/issues/4659)) ([fce263f](https://github.com/conventional-changelog/commitlint/commit/fce263f544977958f476d6f4c8539e5fab996198)), closes [#4557](https://github.com/conventional-changelog/commitlint/issues/4557)\n* **resolve-extends:** always resolve extended parser presets for proper merging ([#4647](https://github.com/conventional-changelog/commitlint/issues/4647)) ([e9ef76c](https://github.com/conventional-changelog/commitlint/commit/e9ef76caf44e77f22086910ce706bbe0c03b0ab5)), closes [#4640](https://github.com/conventional-changelog/commitlint/issues/4640)\n\n\n### Features\n\n* **cz-commitlint:** add exclamation mark support for breaking changes ([#4655](https://github.com/conventional-changelog/commitlint/issues/4655)) ([3b124a7](https://github.com/conventional-changelog/commitlint/commit/3b124a78000dc2ad353884b72db5ba0c78a642a3))\n\n\n\n\n\n## [20.4.4](https://github.com/conventional-changelog/commitlint/compare/v20.4.3...v20.4.4) (2026-03-12)\n\n\n### Bug Fixes\n\n* **is-ignored:** strip CI skip markers from release commits ([#4637](https://github.com/conventional-changelog/commitlint/issues/4637)) ([56a6fd0](https://github.com/conventional-changelog/commitlint/commit/56a6fd069dc8a46054ce23ddd388ce924ca499c2))\n* **read:** update git-raw-commits to v5 API ([#4638](https://github.com/conventional-changelog/commitlint/issues/4638)) ([bd6ab41](https://github.com/conventional-changelog/commitlint/commit/bd6ab41740210215d92bc10fa93184325bc970a6))\n* **types:** allow context parameter in QualifiedRuleConfig functions ([#4636](https://github.com/conventional-changelog/commitlint/issues/4636)) ([17537ae](https://github.com/conventional-changelog/commitlint/commit/17537ae05f3402f3b196d5a8cb92ae7207af8ba5)), closes [#4357](https://github.com/conventional-changelog/commitlint/issues/4357)\n\n\n\n\n\n## [20.4.3](https://github.com/conventional-changelog/commitlint/compare/v20.4.2...v20.4.3) (2026-03-03)\n\n\n### Bug Fixes\n\n* footer parser does not escape special chars for regex [#4560](https://github.com/conventional-changelog/commitlint/issues/4560) ([#4634](https://github.com/conventional-changelog/commitlint/issues/4634)) ([8ff7c7f](https://github.com/conventional-changelog/commitlint/commit/8ff7c7fcbc2db2b45910ecb5c01e9f1763060770))\n* npx usage [#613](https://github.com/conventional-changelog/commitlint/issues/613) ([#4630](https://github.com/conventional-changelog/commitlint/issues/4630)) ([1644f1e](https://github.com/conventional-changelog/commitlint/commit/1644f1e8f74a844547e44e3e7a76fabbb96775f8)), closes [#3](https://github.com/conventional-changelog/commitlint/issues/3) [#1](https://github.com/conventional-changelog/commitlint/issues/1) [#2](https://github.com/conventional-changelog/commitlint/issues/2) [#4](https://github.com/conventional-changelog/commitlint/issues/4) [#5](https://github.com/conventional-changelog/commitlint/issues/5) [#7](https://github.com/conventional-changelog/commitlint/issues/7) [#6](https://github.com/conventional-changelog/commitlint/issues/6)\n* **types:** incorrect types for rule options ([#4633](https://github.com/conventional-changelog/commitlint/issues/4633)) ([77b85f2](https://github.com/conventional-changelog/commitlint/commit/77b85f24d3858161d076078d333c96909e6136f8))\n\n\n\n\n\n## [20.4.2](https://github.com/conventional-changelog/commitlint/compare/v20.4.1...v20.4.2) (2026-02-19)\n\n\n### Bug Fixes\n\n* **config-nx-scopes:** add unique names to fixture projects ([#4622](https://github.com/conventional-changelog/commitlint/issues/4622)) ([5635cf0](https://github.com/conventional-changelog/commitlint/commit/5635cf0ab885005aa56f2917b9db5e9c2259722d))\n* **rules:** ignore cherry-picks in signed-off-by ([#4625](https://github.com/conventional-changelog/commitlint/issues/4625)) ([691a52d](https://github.com/conventional-changelog/commitlint/commit/691a52d4b0ba2ad8cd5a33f7fa35a901ca861009))\n\n\n\n\n\n## [20.4.1](https://github.com/conventional-changelog/commitlint/compare/v20.4.0...v20.4.1) (2026-02-02)\n\n\n### Reverts\n\n* replace all lodash string methods with kasi [#4602](https://github.com/conventional-changelog/commitlint/issues/4602) ([#4621](https://github.com/conventional-changelog/commitlint/issues/4621)) ([5326ab9](https://github.com/conventional-changelog/commitlint/commit/5326ab98a7c68f2f67c46c253f10c087d4570ddd)), closes [#4620](https://github.com/conventional-changelog/commitlint/issues/4620) [#4620](https://github.com/conventional-changelog/commitlint/issues/4620)\n\n\n\n\n\n# [20.4.0](https://github.com/conventional-changelog/commitlint/compare/v20.3.1...v20.4.0) (2026-01-30)\n\n\n### Features\n\n* upgrade conventional commit packages [#4082](https://github.com/conventional-changelog/commitlint/issues/4082) ([#4597](https://github.com/conventional-changelog/commitlint/issues/4597)) ([3aaf0a6](https://github.com/conventional-changelog/commitlint/commit/3aaf0a603c4047d268d85207957c919f45b60e1f))\n\n\n\n\n\n## [20.3.1](https://github.com/conventional-changelog/commitlint/compare/v20.3.0...v20.3.1) (2026-01-08)\n\n\n### Bug Fixes\n\n* **types:** add scope-delimiter-style types ([#4592](https://github.com/conventional-changelog/commitlint/issues/4592)) ([23c1f6e](https://github.com/conventional-changelog/commitlint/commit/23c1f6ef3ddfcc5316f429d51854929c39ea1103))\n\n\n\n\n\n# [20.3.0](https://github.com/conventional-changelog/commitlint/compare/v20.2.0...v20.3.0) (2026-01-01)\n\n\n### Features\n\n* add support for .mts config file ([#4581](https://github.com/conventional-changelog/commitlint/issues/4581)) ([66e05ab](https://github.com/conventional-changelog/commitlint/commit/66e05abc34dd33bed7b5d1830328bc8740b71eaa))\n* **rules:** add scope-delimiter-style ([#4580](https://github.com/conventional-changelog/commitlint/issues/4580)) ([fc4849a](https://github.com/conventional-changelog/commitlint/commit/fc4849a4b91f52821d23ad58ed0363369df56aa5))\n\n\n\n\n\n# [20.2.0](https://github.com/conventional-changelog/commitlint/compare/v20.1.0...v20.2.0) (2025-12-05)\n\n\n### Bug Fixes\n\n* update dependency glob to v11 [security] ([#4561](https://github.com/conventional-changelog/commitlint/issues/4561)) ([a89a08b](https://github.com/conventional-changelog/commitlint/commit/a89a08b2fd3c72a6cd09e00508fc2e972f27c64c))\n\n\n### Features\n\n* **cz-commitlint:** support customizable commit prompt with emojis ([#4540](https://github.com/conventional-changelog/commitlint/issues/4540)) ([803c05b](https://github.com/conventional-changelog/commitlint/commit/803c05b6d722676ed499585ed713d185d1670462))\n* **lint:** update ESLint configuration to use Vitest and remove Jest plugin ([#4542](https://github.com/conventional-changelog/commitlint/issues/4542)) ([63e7ad4](https://github.com/conventional-changelog/commitlint/commit/63e7ad4e47d36ce7c58e793e7c587378f3d01082))\n* **rules:** add breaking-change-exclamation-mark ([#4548](https://github.com/conventional-changelog/commitlint/issues/4548)) ([c4d419b](https://github.com/conventional-changelog/commitlint/commit/c4d419bc76aab72092f1ebd7c0922729a576b7a5)), closes [#4547](https://github.com/conventional-changelog/commitlint/issues/4547)\n\n\n\n\n\n# [20.1.0](https://github.com/conventional-changelog/commitlint/compare/v20.0.0...v20.1.0) (2025-09-30)\n\n\n### Bug Fixes\n\n* **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))\n\n\n### Features\n\n* **config-pnpm-scopes:** allow global scope ([#4553](https://github.com/conventional-changelog/commitlint/issues/4553)) ([e571970](https://github.com/conventional-changelog/commitlint/commit/e57197061447eb9ea74b8d81ab003ad3b4652be6))\n\n\n\n\n\n# [20.0.0](https://github.com/conventional-changelog/commitlint/compare/v19.9.1...v20.0.0) (2025-09-25)\n\n\n### Bug Fixes\n\n* 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))\n\n\n* 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)\n\n\n### BREAKING CHANGES\n\n* when lines contain URLs exceeding the maximum\nline length `body-max-line-length` will be ignored\n\n\n\n\n\n## [19.9.1](https://github.com/conventional-changelog/commitlint/compare/v19.9.0...v19.9.1) (2025-08-29)\n\n\n### Bug Fixes\n\n* 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))\n\n\n\n\n\n# [19.9.0](https://github.com/conventional-changelog/commitlint/compare/v19.8.1...v19.9.0) (2025-08-26)\n\n\n### Bug Fixes\n\n* 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))\n* 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))\n* 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))\n* 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))\n* 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))\n\n\n### Features\n\n* **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))\n\n\n### Reverts\n\n* 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)\n\n\n\n\n\n## [19.8.1](https://github.com/conventional-changelog/commitlint/compare/v19.8.0...v19.8.1) (2025-05-08)\n\n\n### Bug Fixes\n\n* update dependency tinyexec to v1 ([#4332](https://github.com/conventional-changelog/commitlint/issues/4332)) ([e49449f](https://github.com/conventional-changelog/commitlint/commit/e49449fa9452069cdbf194f94d536194d362a299))\n* 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))\n\n\n### Performance Improvements\n\n* **rules:** optimize header-trim ([#4363](https://github.com/conventional-changelog/commitlint/issues/4363)) ([b7e404b](https://github.com/conventional-changelog/commitlint/commit/b7e404bc036dbd3cbdffa38e85c833d10e52d68b))\n\n\n\n\n\n# [19.8.0](https://github.com/conventional-changelog/commitlint/compare/v19.7.1...v19.8.0) (2025-03-07)\n\n\n### Bug Fixes\n\n* **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))\n* 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))\n\n\n### Features\n\n* **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))\n\n\n### Performance Improvements\n\n* 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))\n\n\n### Reverts\n\n* 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)\n\n\n\n\n\n## [19.7.1](https://github.com/conventional-changelog/commitlint/compare/v19.7.0...v19.7.1) (2025-02-02)\n\n\n### Bug Fixes\n\n* **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))\n* 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))\n* 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))\n* 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))\n* 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))\n* 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))\n\n\n\n\n\n# [19.7.0](https://github.com/conventional-changelog/commitlint/compare/v19.6.1...v19.7.0) (2025-01-04)\n\n\n### Bug Fixes\n\n* 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))\n* 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))\n\n\n### Features\n\n* support lerna 7 and 8 ([#4221](https://github.com/conventional-changelog/commitlint/issues/4221)) ([3b8da63](https://github.com/conventional-changelog/commitlint/commit/3b8da63f50f868555a3f026a76e96cd8d20638de))\n\n\n\n\n\n## [19.6.1](https://github.com/conventional-changelog/commitlint/compare/v19.6.0...v19.6.1) (2024-12-15)\n\n\n### Bug Fixes\n\n* force bump for container usage ([#4200](https://github.com/conventional-changelog/commitlint/issues/4200)) ([21858df](https://github.com/conventional-changelog/commitlint/commit/21858dfa25acb5a1f244cdcba7ff20735fa5903f))\n\n\n\n\n\n# [19.6.0](https://github.com/conventional-changelog/commitlint/compare/v19.5.0...v19.6.0) (2024-11-19)\n\n\n### Bug Fixes\n\n* update dependency inquirer to v9.3.7 ([#4167](https://github.com/conventional-changelog/commitlint/issues/4167)) ([610a8f2](https://github.com/conventional-changelog/commitlint/commit/610a8f212af3329d48663f20324b14140028dccc))\n\n\n### Features\n\n* **is-ignored:** ignore reapply commits ([#4186](https://github.com/conventional-changelog/commitlint/issues/4186)) ([49ba56d](https://github.com/conventional-changelog/commitlint/commit/49ba56d9dd4c72e918005e6ca62f110a393b8f07))\n* support using delimiter in `scope-enum` ([#4161](https://github.com/conventional-changelog/commitlint/issues/4161)) ([f55521d](https://github.com/conventional-changelog/commitlint/commit/f55521dbb8ce0530ecb9557122689bba740fb2a5))\n\n\n\n\n\n# [19.5.0](https://github.com/conventional-changelog/commitlint/compare/v19.4.1...v19.5.0) (2024-09-11)\n\n\n### Features\n\n* **cli:** use special errorCode for missing rules/config [#4142](https://github.com/conventional-changelog/commitlint/issues/4142) ([#4143](https://github.com/conventional-changelog/commitlint/issues/4143)) ([d7070d8](https://github.com/conventional-changelog/commitlint/commit/d7070d8a4905da7834a018825b37d52c2dd29f62))\n\n\n\n\n\n## [19.4.1](https://github.com/conventional-changelog/commitlint/compare/v19.4.0...v19.4.1) (2024-08-28)\n\n\n### Bug Fixes\n\n* **rules:** handle blank commit message in signed-off-by check ([#4124](https://github.com/conventional-changelog/commitlint/issues/4124)) ([7ab4bab](https://github.com/conventional-changelog/commitlint/commit/7ab4bab31f4b19ddedd850e435398037437007b6))\n\n\n\n\n\n# [19.4.0](https://github.com/conventional-changelog/commitlint/compare/v19.3.1...v19.4.0) (2024-08-07)\n\n\n### Features\n\n* support command line options from a file ([#4109](https://github.com/conventional-changelog/commitlint/issues/4109)) ([a20e890](https://github.com/conventional-changelog/commitlint/commit/a20e890f6b6c8bacdc511d40cb41f29415bdd044))\n* support linting from the last tag ([#4110](https://github.com/conventional-changelog/commitlint/issues/4110)) ([4b204ec](https://github.com/conventional-changelog/commitlint/commit/4b204ecfb43dd6a00e24b51111aadbd78f9d58e1))\n\n\n\n\n\n## [19.3.1](https://github.com/conventional-changelog/commitlint/compare/v19.3.0...v19.3.1) (2024-05-13)\n\n\n### Bug Fixes\n\n* **prompt:** prompt does not respect [body-leading-blank] setting ([#4066](https://github.com/conventional-changelog/commitlint/issues/4066)) ([3f1f44d](https://github.com/conventional-changelog/commitlint/commit/3f1f44d9cbb93438d01cfd79f9b71659411e126d))\n* update dependency ajv to v8.13.0 ([#4057](https://github.com/conventional-changelog/commitlint/issues/4057)) ([4e5957f](https://github.com/conventional-changelog/commitlint/commit/4e5957fcb120fbf31c2bdc5c5affe35eb556d3dc))\n* update dependency import-meta-resolve to v4.1.0 ([#4055](https://github.com/conventional-changelog/commitlint/issues/4055)) ([6cd9d76](https://github.com/conventional-changelog/commitlint/commit/6cd9d76b4f7d867c6085a5f99eab9b6ad15ab789))\n* update dependency inquirer to v9.2.20 ([#4047](https://github.com/conventional-changelog/commitlint/issues/4047)) ([b2a75c8](https://github.com/conventional-changelog/commitlint/commit/b2a75c881b8fa69501d93c4d29118aeaf0c989cd))\n* update dependency semver to v7.6.2 ([#4080](https://github.com/conventional-changelog/commitlint/issues/4080)) ([de28f20](https://github.com/conventional-changelog/commitlint/commit/de28f209db4d8aba4eb6e57e9f1fc0517143398d))\n* update dependency tar-fs to v3.0.6 ([#4048](https://github.com/conventional-changelog/commitlint/issues/4048)) ([4003205](https://github.com/conventional-changelog/commitlint/commit/40032050570e4f5a8c8ab4f390cee7611a92935e))\n\n\n### Features\n\n* **container:** add arm64 build ([#4049](https://github.com/conventional-changelog/commitlint/issues/4049)) ([28bed3f](https://github.com/conventional-changelog/commitlint/commit/28bed3f8453bf12062b938aa0247e24d56f183d6)), closes [#3926](https://github.com/conventional-changelog/commitlint/issues/3926)\n\n\n\n\n\n# [19.3.0](https://github.com/conventional-changelog/commitlint/compare/v19.2.2...v19.3.0) (2024-04-23)\n\n\n### Bug Fixes\n\n* update dependency inquirer to v9.2.19 ([#4031](https://github.com/conventional-changelog/commitlint/issues/4031)) ([84126c1](https://github.com/conventional-changelog/commitlint/commit/84126c131a119b0704e0da5ae1707404fc6947b5))\n\n\n### Features\n\n* **container:** added @commitlint/config-nx-scopes for nx monorepos ([#3913](https://github.com/conventional-changelog/commitlint/issues/3913)) ([aa4df36](https://github.com/conventional-changelog/commitlint/commit/aa4df36b1d07e56230ff569aec5af727f1144aae))\n* **format:** print full commit message for valid commits if -V ([#4026](https://github.com/conventional-changelog/commitlint/issues/4026)) ([a7bbc49](https://github.com/conventional-changelog/commitlint/commit/a7bbc494e34885aba3f4b0c03b37d18ef2b8fbff))\n\n\n\n\n\n## [19.2.2](https://github.com/conventional-changelog/commitlint/compare/v19.2.1...v19.2.2) (2024-04-14)\n\n\n### Bug Fixes\n\n* **is-ignored:** ignore \"amend!\" commits ([#4024](https://github.com/conventional-changelog/commitlint/issues/4024)) ([90078f6](https://github.com/conventional-changelog/commitlint/commit/90078f6a58523e0bde386b9b6aa3c05e8b916653))\n* update dependency inquirer to v9.2.17 ([#3996](https://github.com/conventional-changelog/commitlint/issues/3996)) ([44d0fcc](https://github.com/conventional-changelog/commitlint/commit/44d0fccf0e40962e6dceaee92b23333d9746904b))\n* update dependency inquirer to v9.2.18 ([#4025](https://github.com/conventional-changelog/commitlint/issues/4025)) ([52d7edc](https://github.com/conventional-changelog/commitlint/commit/52d7edcbbb68e99542777067b2cc5fa33a848762))\n\n\n\n\n\n## [19.2.1](https://github.com/conventional-changelog/commitlint/compare/v19.2.0...v19.2.1) (2024-03-19)\n\n\n### Bug Fixes\n\n* **config-nx-scopes:** include file extension in nx imports ([#3979](https://github.com/conventional-changelog/commitlint/issues/3979)) ([583250b](https://github.com/conventional-changelog/commitlint/commit/583250b919cf1eb338de3e3f5c848fff611a6212))\n\n\n\n\n\n# [19.2.0](https://github.com/conventional-changelog/commitlint/compare/v19.1.0...v19.2.0) (2024-03-15)\n\n\n### Bug Fixes\n\n* update dependency inquirer to v9.2.16 ([#3972](https://github.com/conventional-changelog/commitlint/issues/3972)) ([ea1ab9c](https://github.com/conventional-changelog/commitlint/commit/ea1ab9cc8048a2b715473c878641d1e189daaf1c))\n\n\n### Features\n\n* **cli:** introduce new --last flag, to stop recommending HEAD~1 ([#3916](https://github.com/conventional-changelog/commitlint/issues/3916)) ([99f4f3f](https://github.com/conventional-changelog/commitlint/commit/99f4f3f4839190a2758083df7ba20b988e7b68a6))\n* **load:** update cosmiconfig to v9 to add support for `package.yaml` config ([#3976](https://github.com/conventional-changelog/commitlint/issues/3976)) ([94eab40](https://github.com/conventional-changelog/commitlint/commit/94eab40798e0c8d3945aa2b1e629669b231d8468))\n\n\n\n\n\n# [19.1.0](https://github.com/conventional-changelog/commitlint/compare/v19.0.3...v19.1.0) (2024-03-12)\n\n\n### Bug Fixes\n\n* add `main` and `types` keys in package.json ([#3953](https://github.com/conventional-changelog/commitlint/issues/3953)) ([7ddaad4](https://github.com/conventional-changelog/commitlint/commit/7ddaad4bc4e71afe89f25cc02d3e19beba1ce6cd))\n* add missing `conditions` param for `moduleResolve` ([#3962](https://github.com/conventional-changelog/commitlint/issues/3962)) ([67baff9](https://github.com/conventional-changelog/commitlint/commit/67baff9182854bbe184b6cf71f977920a05c27a3))\n* add missing cjs entry in package ([#3967](https://github.com/conventional-changelog/commitlint/issues/3967)) ([9cea6fd](https://github.com/conventional-changelog/commitlint/commit/9cea6fdb7b1bf7cfc9a86e882e2742379b4b6aec))\n* update dependency @pnpm/read-project-manifest to v5.0.11 ([#3932](https://github.com/conventional-changelog/commitlint/issues/3932)) ([2525d14](https://github.com/conventional-changelog/commitlint/commit/2525d14b8c0bad0ed155863059fa3549e76dd7d3))\n* update dependency tmp to v0.2.3 ([#3945](https://github.com/conventional-changelog/commitlint/issues/3945)) ([25bab59](https://github.com/conventional-changelog/commitlint/commit/25bab594ed04dbe2cc3cc5020b70d98d1d4e0f53))\n\n\n### Features\n\n* add CJS export for cz-commitlint ([#3963](https://github.com/conventional-changelog/commitlint/issues/3963)) ([6ae3c6a](https://github.com/conventional-changelog/commitlint/commit/6ae3c6a827de8622d827146ffb0984a9e62fe505)), closes [/github.com/conventional-changelog/commitlint/pull/3850#issuecomment-1984932236](https://github.com//github.com/conventional-changelog/commitlint/pull/3850/issues/issuecomment-1984932236) [#3949](https://github.com/conventional-changelog/commitlint/issues/3949)\n\n\n\n\n\n## [19.0.3](https://github.com/conventional-changelog/commitlint/compare/v19.0.2...v19.0.3) (2024-02-28)\n\n\n### Bug Fixes\n\n* mark `@types/conventional-commits-parser` as dep for `@commitlint/types` ([#3944](https://github.com/conventional-changelog/commitlint/issues/3944)) ([5a01f59](https://github.com/conventional-changelog/commitlint/commit/5a01f59661f0b908802728389631965eb8b49d47)), closes [#3929](https://github.com/conventional-changelog/commitlint/issues/3929) [#3942](https://github.com/conventional-changelog/commitlint/issues/3942)\n\n\n\n\n\n## [19.0.2](https://github.com/conventional-changelog/commitlint/compare/v19.0.1...v19.0.2) (2024-02-28)\n\n\n### Bug Fixes\n\n* fallback to `resolve-from` for Yarn P'n'P ([#3941](https://github.com/conventional-changelog/commitlint/issues/3941)) ([1eb9b5f](https://github.com/conventional-changelog/commitlint/commit/1eb9b5f29979d35f5840141523850a7402633378)), closes [#3936](https://github.com/conventional-changelog/commitlint/issues/3936)\n\n\n\n\n\n## [19.0.1](https://github.com/conventional-changelog/commitlint/compare/v19.0.0...v19.0.1) (2024-02-27)\n\n\n### Bug Fixes\n\n* drop `resolve-from`, `resolve-global` and `import-fresh`, resolve global packages correctly ([#3939](https://github.com/conventional-changelog/commitlint/issues/3939)) ([8793c63](https://github.com/conventional-changelog/commitlint/commit/8793c639c083c33714da0a29429b338776813d0c)), closes [#3938](https://github.com/conventional-changelog/commitlint/issues/3938)\n\n\n\n\n\n# [19.0.0](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v19.0.0) (2024-02-27)\n\n\n* feat!: migrate to pure ESM (#3850) ([3423735](https://github.com/conventional-changelog/commitlint/commit/342373559bdf7c783c4ef37ff05dc38a5f681159)), closes [#3850](https://github.com/conventional-changelog/commitlint/issues/3850)\n\n\n### Reverts\n\n* Revert \"chore: update tools version to v20\" ([53fc619](https://github.com/conventional-changelog/commitlint/commit/53fc6196b8d23b347a342a23c6757d757f547878))\n* Revert \"chore!: minimum node version v20\" ([2816783](https://github.com/conventional-changelog/commitlint/commit/2816783d00e7eb967de3ac9347c2fc43dc8b94fa))\n* Revert \"ci: add codeQuality job to run lint and format tasks (#3922)\" ([8bb94ca](https://github.com/conventional-changelog/commitlint/commit/8bb94ca7552b70a3c6d185a1ee8e87d745799e75)), closes [#3922](https://github.com/conventional-changelog/commitlint/issues/3922)\n* Revert \"ci: update node version to v20\" ([8a24546](https://github.com/conventional-changelog/commitlint/commit/8a2454661569890ee1dbe918fca3da758722fd38))\n\n\n### BREAKING CHANGES\n\n* migrate to pure ESM\n\n* feat: migrate to pure ESM\n\n* chore: update snapshot\n\n* fix: load `parserPreset` with another `await`\n\n* test: migrate to vitest\n\n* test: remove no replacement `--runInBand` test-ci script\n\n* chore: fix code reviews\n\n* refactor(load): rewrite resolve logic\n\n* fix(config-nx-scopes): fix syntax error\n\n* feat(resolve-extends): add resolveFrom and loadParserPreset\n\n* feat(load): use resolveFrom and loadParserPreset from resolve-extends\n\n* test: include only @commitlint/* packages src in coverage\n\n* test: explicit import vitest utilities\n\n* test: remove @jest/globals from dependencies\n\n* fix(resolve-extends): `resolveFrom` output should be platform aware\n\n* test: restore NO_COLOR to test script\n\n* chore: fix linting issues\n\n* fix: should use fileURLToPath instead of pathname for Windows compatibility\n\n* Apply suggestions from code review\n\n* fix: should reuse `cli` instead call `yargs()`\n\n* feat(cli): set terminalWidth as wrap to avoid work break on help\n\n* Update .eslintrc.cjs\n\n* feat: migrate @commitlint/config-conventional to pure ESM\n\n\n\n\n\n## [18.6.3](https://github.com/conventional-changelog/commitlint/compare/v18.6.2...v18.6.3) (2024-03-11)\n\n\n### Bug Fixes\n\n* add missing entry `wrapper.mjs` ([#3966](https://github.com/conventional-changelog/commitlint/issues/3966)) ([c2c3c7c](https://github.com/conventional-changelog/commitlint/commit/c2c3c7cdc05c07c185cc2c2635a06835352c4504)), closes [#3958](https://github.com/conventional-changelog/commitlint/issues/3958)\n\n\n\n\n\n## [18.6.2](https://github.com/conventional-changelog/commitlint/compare/v18.6.1...v18.6.2) (2024-02-14)\n\n\n### Bug Fixes\n\n* **config-conventional:** use default export ([#3911](https://github.com/conventional-changelog/commitlint/issues/3911)) ([bc48408](https://github.com/conventional-changelog/commitlint/commit/bc4840832f9484186d3281d13ab5e0b4f9f63113))\n\n\n\n\n\n## [18.6.1](https://github.com/conventional-changelog/commitlint/compare/v18.6.0...v18.6.1) (2024-02-13)\n\n\n### Bug Fixes\n\n* update dependency semver to v7.6.0 ([#3900](https://github.com/conventional-changelog/commitlint/issues/3900)) ([df33003](https://github.com/conventional-changelog/commitlint/commit/df33003dce77bc5ff48678cddf9401dffedaeb57))\n* update dependency tar-fs to v3.0.5 ([#3903](https://github.com/conventional-changelog/commitlint/issues/3903)) ([79d77c9](https://github.com/conventional-changelog/commitlint/commit/79d77c9ef8de5046106027fc7d80dfd77faeb3e5))\n\n\n\n\n\n# [18.6.0](https://github.com/conventional-changelog/commitlint/compare/v18.5.1...v18.6.0) (2024-01-25)\n\n\n### Features\n\n* **rules:** add header-trim rule ([#3199](https://github.com/conventional-changelog/commitlint/issues/3199)) ([#3871](https://github.com/conventional-changelog/commitlint/issues/3871)) ([331579a](https://github.com/conventional-changelog/commitlint/commit/331579a8796af901b5e5103c44fedf1cb3a2f661))\n\n\n\n\n\n## [18.5.1](https://github.com/conventional-changelog/commitlint/compare/v18.5.0...v18.5.1) (2024-01-22)\n\n\n### Bug Fixes\n\n* **config-nx-scopes:** replace import with require ([#3865](https://github.com/conventional-changelog/commitlint/issues/3865)) ([#3867](https://github.com/conventional-changelog/commitlint/issues/3867)) ([3ede3e0](https://github.com/conventional-changelog/commitlint/commit/3ede3e0e9d5af1302fff896aba049b487b90c0bf))\n\n\n\n\n\n# [18.5.0](https://github.com/conventional-changelog/commitlint/compare/v18.4.4...v18.5.0) (2024-01-22)\n\n\n### Bug Fixes\n\n* **config-nx-scopes:** restore compatibility with nx 17.2.0 and higher ([#3855](https://github.com/conventional-changelog/commitlint/issues/3855)) ([1e08a17](https://github.com/conventional-changelog/commitlint/commit/1e08a17eb354b40776be814e8d787eee44d5df2c)), closes [#3820](https://github.com/conventional-changelog/commitlint/issues/3820)\n\n\n### Features\n\n* **cli:** print-config now can be configured to print a json in stdout ([#3863](https://github.com/conventional-changelog/commitlint/issues/3863)) ([6381a2d](https://github.com/conventional-changelog/commitlint/commit/6381a2daa0d5d89ab2195998d63a9690a533d3f2)), closes [#3819](https://github.com/conventional-changelog/commitlint/issues/3819)\n\n\n\n\n\n## [18.4.4](https://github.com/conventional-changelog/commitlint/compare/v18.4.3...v18.4.4) (2024-01-04)\n\n\n### Bug Fixes\n\n* **@commitlint/load:** Remove unused `@types/node` dependency ([#3801](https://github.com/conventional-changelog/commitlint/issues/3801)) ([7b3f8b3](https://github.com/conventional-changelog/commitlint/commit/7b3f8b3fe106311682a2e8ad281dd9a4e42443c6))\n* **read:** remove fs-extra usage and use fs/promises ([#3803](https://github.com/conventional-changelog/commitlint/issues/3803)) ([714be66](https://github.com/conventional-changelog/commitlint/commit/714be668c104c554c66e866e53addd04944544f6))\n* subject-full-stop false positive when using ellipsis ([#3839](https://github.com/conventional-changelog/commitlint/issues/3839)) ([b4246d6](https://github.com/conventional-changelog/commitlint/commit/b4246d6428399177d43296dc8bec6714e664d037))\n* update dependency fs-extra to v11.2.0 ([#3799](https://github.com/conventional-changelog/commitlint/issues/3799)) ([abb4da2](https://github.com/conventional-changelog/commitlint/commit/abb4da2a389ad00800562194db1b6ba588623df4))\n* **utils:** remove fs-extra usage ([#3804](https://github.com/conventional-changelog/commitlint/issues/3804)) ([92f2237](https://github.com/conventional-changelog/commitlint/commit/92f2237d66950d9cb92430bc082a86a5dbc86d3f))\n\n\n\n\n\n## [18.4.3](https://github.com/conventional-changelog/commitlint/compare/v18.4.2...v18.4.3) (2023-11-21)\n\n\n### Bug Fixes\n\n* update dependency read-pkg to v9.0.1 ([#3777](https://github.com/conventional-changelog/commitlint/issues/3777)) ([88c4b8a](https://github.com/conventional-changelog/commitlint/commit/88c4b8a33dc2ebb63715018b3a0945d94cdfceeb))\n\n\n\n\n\n## [18.4.2](https://github.com/conventional-changelog/commitlint/compare/v18.4.1...v18.4.2) (2023-11-16)\n\n\n### Bug Fixes\n\n* update dependency @types/fs-extra to v11.0.4 ([#3767](https://github.com/conventional-changelog/commitlint/issues/3767)) ([f6c4696](https://github.com/conventional-changelog/commitlint/commit/f6c46962a7c77f86953f3a2285427caeeedc2472))\n* update dependency @types/tmp to v0.2.6 ([#3769](https://github.com/conventional-changelog/commitlint/issues/3769)) ([bc849bc](https://github.com/conventional-changelog/commitlint/commit/bc849bc0b123ec4a70e08449b7d010fdc6bcfdd7))\n\n\n\n\n\n## [18.4.1](https://github.com/conventional-changelog/commitlint/compare/v18.4.0...v18.4.1) (2023-11-12)\n\n\n### Bug Fixes\n\n* update cosmiconfig to specific version ([#3755](https://github.com/conventional-changelog/commitlint/issues/3755)) ([636b8b1](https://github.com/conventional-changelog/commitlint/commit/636b8b1338835b239ab0585e062bfe305fca4424))\n\n\n\n\n\n# [18.4.0](https://github.com/conventional-changelog/commitlint/compare/v18.3.0...v18.4.0) (2023-11-10)\n\n\n### Bug Fixes\n\n* update dependency fast-glob to v3.3.2 ([#3740](https://github.com/conventional-changelog/commitlint/issues/3740)) ([b3bf1f2](https://github.com/conventional-changelog/commitlint/commit/b3bf1f294bd8d3ee16950595a15c4467b75959bb))\n* update dependency read-pkg to v9 ([#3734](https://github.com/conventional-changelog/commitlint/issues/3734)) ([722f518](https://github.com/conventional-changelog/commitlint/commit/722f5183e91186aa7e3912e8f3d0d7069f05ce8f))\n* update dependency tar-fs to v3 ([#3718](https://github.com/conventional-changelog/commitlint/issues/3718)) ([afb04dd](https://github.com/conventional-changelog/commitlint/commit/afb04dd0dc4d42094ae01f0733600c2f9d3abdfd))\n\n\n### Features\n\n* bump cosmiconfig version and conditionally support mjs config ([#3747](https://github.com/conventional-changelog/commitlint/issues/3747)) ([a2b65fc](https://github.com/conventional-changelog/commitlint/commit/a2b65fc0cfee2259e197c291ea40ef2d076ab837))\n\n\n\n\n\n# [18.3.0](https://github.com/conventional-changelog/commitlint/compare/v18.2.0...v18.3.0) (2023-10-26)\n\n\n### Bug Fixes\n\n* update dependency @types/node to v18.18.7 ([#3726](https://github.com/conventional-changelog/commitlint/issues/3726)) ([dcc0424](https://github.com/conventional-changelog/commitlint/commit/dcc0424259d32874e4f97de768ec1b50028a90a6))\n\n\n### Features\n\n* **config-nx-scopes:** support latest nx version ([#3728](https://github.com/conventional-changelog/commitlint/issues/3728)) ([22e6f74](https://github.com/conventional-changelog/commitlint/commit/22e6f74e3cae74497162c8ae8f5d3888e3b19f6e))\n\n\n\n\n\n# [18.2.0](https://github.com/conventional-changelog/commitlint/compare/v18.1.0...v18.2.0) (2023-10-26)\n\n\n### Features\n\n* **load:** use cosmiconfig-typescript-loader v5 to remove ts-node dependency for @commitlint/load ([#3722](https://github.com/conventional-changelog/commitlint/issues/3722)) ([1ff49ea](https://github.com/conventional-changelog/commitlint/commit/1ff49ea14adb180eb54ec3d7479990b66ba26720))\n\n\n\n\n\n# [18.1.0](https://github.com/conventional-changelog/commitlint/compare/v18.0.0...v18.1.0) (2023-10-25)\n\n\n### Bug Fixes\n\n* update dependency read-pkg to v8 ([#3717](https://github.com/conventional-changelog/commitlint/issues/3717)) ([326f497](https://github.com/conventional-changelog/commitlint/commit/326f4975dbc2f06dbe490ca04732441ad062e063))\n\n\n### Features\n\n* [scope-enum] [scope-case] allow space after comma as scope delimiter ([#3577](https://github.com/conventional-changelog/commitlint/issues/3577)) ([13c4bfc](https://github.com/conventional-changelog/commitlint/commit/13c4bfc637dd6c66477fa1c8da821ed46af28c44)), closes [#3576](https://github.com/conventional-changelog/commitlint/issues/3576)\n\n\n\n\n\n# [18.0.0](https://github.com/conventional-changelog/commitlint/compare/v17.8.1...v18.0.0) (2023-10-20)\n\n\n* chore!: minimum node version v18 (#3644) ([5b4aeaf](https://github.com/conventional-changelog/commitlint/commit/5b4aeaf4f01c2726a7bc8631a23bb34c849baad2)), closes [#3644](https://github.com/conventional-changelog/commitlint/issues/3644)\n\n\n### BREAKING CHANGES\n\n* drop node v14 and v16 support\n\n* chore: remove unused types\n\n* docs: prepare node update and new release\n\n* chore!: minimum TS version v5\n* drop TS v4 support\n\n* ci: remove node v14/16 checks\n\n* chore: adjust node types to minimal supported version\n\n* chore!: further major versions of other deps\n* upgrade conventional-changelog-conventionalcommits, conventional-commits-parser, conventional-changelog-atom, \n\n* docs: simplify releases and remove roadmap\n\n\n\n\n\n## [17.8.1](https://github.com/conventional-changelog/commitlint/compare/v17.8.0...v17.8.1) (2023-10-20)\n\n**Note:** Version bump only for package @commitlint/root\n\n\n\n\n\n# [17.8.0](https://github.com/conventional-changelog/commitlint/compare/v17.7.2...v17.8.0) (2023-10-14)\n\n\n### Bug Fixes\n\n* chore(container): add pullrequest event to container build workflow trigger ([8e30bec](https://github.com/conventional-changelog/commitlint/commit/8e30bec280d1c4ed8c1c5a69a36ea72aa4bc46ec))\n* update dependency @types/fs-extra to v11.0.2 ([#3681](https://github.com/conventional-changelog/commitlint/issues/3681)) ([5c6f087](https://github.com/conventional-changelog/commitlint/commit/5c6f0873554546fcfff070dcd83f3f7b5080be3f))\n* update dependency @types/tmp to v0.2.4 ([#3682](https://github.com/conventional-changelog/commitlint/issues/3682)) ([f9d7029](https://github.com/conventional-changelog/commitlint/commit/f9d702907c45e262c169bb85b6102604a96b95e9))\n* update dependency cosmiconfig-typescript-loader to v4.4.0 ([#3688](https://github.com/conventional-changelog/commitlint/issues/3688)) ([4bcb0c6](https://github.com/conventional-changelog/commitlint/commit/4bcb0c665243ffae65aa6616b4b0ee2d65d91aec))\n\n\n### Features\n\n* lazy load cosmiconfig-typescript-loader ([#3694](https://github.com/conventional-changelog/commitlint/issues/3694)) ([b058c7c](https://github.com/conventional-changelog/commitlint/commit/b058c7cc49333e7898402fa55467ec097801ce25))\n\n\n\n\n\n## [17.7.2](https://github.com/conventional-changelog/commitlint/compare/v17.7.1...v17.7.2) (2023-09-28)\n\n\n### Bug Fixes\n\n* update dependency @types/node to v20.5.1 ([#3653](https://github.com/conventional-changelog/commitlint/issues/3653)) ([cd8b775](https://github.com/conventional-changelog/commitlint/commit/cd8b7750d3a15fbfd96e20196d53df064df6e138))\n\n\n\n\n\n## [17.7.1](https://github.com/conventional-changelog/commitlint/compare/v17.7.0...v17.7.1) (2023-08-10)\n\n\n### Reverts\n\n* Revert \"feat(load): use cosmiconfig-typescript-loader v5 to remove ts-node dependency for @commitlint/load (#3633)\" ([8e41897](https://github.com/conventional-changelog/commitlint/commit/8e41897a42c45988ff8c25576c4f13bb11d84c4e)), closes [#3633](https://github.com/conventional-changelog/commitlint/issues/3633)\n\n\n\n\n\n# [17.7.0](https://github.com/conventional-changelog/commitlint/compare/v17.6.7...v17.7.0) (2023-08-09)\n\n\n### Features\n\n* **load:** use cosmiconfig-typescript-loader v5 to remove ts-node dependency for @commitlint/load ([#3633](https://github.com/conventional-changelog/commitlint/issues/3633)) ([4aa46d7](https://github.com/conventional-changelog/commitlint/commit/4aa46d796ad74958f5569d3346b60a1f92c33892))\n\n\n### Reverts\n\n* eslint-config-prettier to v8 ([f279ff7](https://github.com/conventional-changelog/commitlint/commit/f279ff787bd908372813a04b756629467506f51e))\n* prettier to v2 to not break lerna v6 publish ([cd854cb](https://github.com/conventional-changelog/commitlint/commit/cd854cb73d93396c166bdfef442bc92b1833cc72))\n\n\n\n\n\n## [17.6.7](https://github.com/conventional-changelog/commitlint/compare/v17.6.6...v17.6.7) (2023-07-19)\n\n**Note:** Version bump only for package @commitlint/root\n\n\n\n\n\n## [17.6.6](https://github.com/conventional-changelog/commitlint/compare/v17.6.5...v17.6.6) (2023-06-24)\n\n**Note:** Version bump only for package @commitlint/root\n\n\n\n\n\n## [17.6.5](https://github.com/conventional-changelog/commitlint/compare/v17.6.4...v17.6.5) (2023-05-30)\n\n\n### Bug Fixes\n\n* add named export to @commitlint/parse ([#3614](https://github.com/conventional-changelog/commitlint/issues/3614)) ([2cd236b](https://github.com/conventional-changelog/commitlint/commit/2cd236b3065c69303c56833d120eb04c6fefc2c3))\n\n\n\n\n\n## [17.6.4](https://github.com/conventional-changelog/commitlint/compare/v17.6.3...v17.6.4) (2023-05-07)\n\n**Note:** Version bump only for package @commitlint/root\n\n\n\n\n\n## [17.6.3](https://github.com/conventional-changelog/commitlint/compare/v17.6.2...v17.6.3) (2023-05-04)\n\n\n### Bug Fixes\n\n* **config-lerna-scopes:** add missing dependency ([#3607](https://github.com/conventional-changelog/commitlint/issues/3607)) ([2fff094](https://github.com/conventional-changelog/commitlint/commit/2fff0943899161b2159a4acddc9237c6ab60c7a5))\n* update dependency semver to v7.5.0 ([#3604](https://github.com/conventional-changelog/commitlint/issues/3604)) ([01e35e0](https://github.com/conventional-changelog/commitlint/commit/01e35e06cf9123a0c367e0d0ac79988ec4334e6a))\n* update dependency yargs to v17.7.2 ([#3602](https://github.com/conventional-changelog/commitlint/issues/3602)) ([c1c7338](https://github.com/conventional-changelog/commitlint/commit/c1c73380710908f6e095f045c78c50928d56acdd))\n\n\n\n\n\n## [17.6.2](https://github.com/conventional-changelog/commitlint/compare/v17.6.1...v17.6.2) (2023-05-03)\n\n\n### Bug Fixes\n\n* lerna package.json resolution ([#3600](https://github.com/conventional-changelog/commitlint/issues/3600)) ([6c5cd53](https://github.com/conventional-changelog/commitlint/commit/6c5cd535679ac9448a127a57e309276e699cebb9))\n* update dependency cosmiconfig to v8.1.3 ([#3591](https://github.com/conventional-changelog/commitlint/issues/3591)) ([44b57a5](https://github.com/conventional-changelog/commitlint/commit/44b57a5022ede545a4d27146fd1a41110767c963))\n* update dependency fs-extra to v11.1.1 ([#3592](https://github.com/conventional-changelog/commitlint/issues/3592)) ([d6ec0d9](https://github.com/conventional-changelog/commitlint/commit/d6ec0d9295c66b51786e210e63dda2a5fa6b9d91))\n\n\n\n\n\n## [17.6.1](https://github.com/conventional-changelog/commitlint/compare/v17.6.0...v17.6.1) (2023-04-14)\n\n\n### Bug Fixes\n\n* **rules:** avoid processing strings with case-less Letter category symbols in `subject-case` ([#3586](https://github.com/conventional-changelog/commitlint/issues/3586)) ([70a4450](https://github.com/conventional-changelog/commitlint/commit/70a44501ac8459f0c1d2b200608b024585964637)), closes [#3585](https://github.com/conventional-changelog/commitlint/issues/3585)\n\n\n\n\n\n# [17.6.0](https://github.com/conventional-changelog/commitlint/compare/v17.5.1...v17.6.0) (2023-04-13)\n\n\n### Features\n\n* **rules:** expand Latin-only characters limitation for `subject-case` with Unicode support ([#3575](https://github.com/conventional-changelog/commitlint/issues/3575)) ([5f83423](https://github.com/conventional-changelog/commitlint/commit/5f8342355a856e5be7b8a7b851e1519d62678465))\n\n\n\n\n\n## [17.5.1](https://github.com/conventional-changelog/commitlint/compare/v17.5.0...v17.5.1) (2023-03-28)\n\n**Note:** Version bump only for package @commitlint/root\n\n\n\n\n\n# [17.5.0](https://github.com/conventional-changelog/commitlint/compare/v17.4.4...v17.5.0) (2023-03-22)\n\n\n### Bug Fixes\n\n* **config-pnpm-scopes:** refactor to remove peer dependencies ([#3564](https://github.com/conventional-changelog/commitlint/issues/3564)) ([f1f3bd5](https://github.com/conventional-changelog/commitlint/commit/f1f3bd5b7f33f7198719ed4aead3417e894a10ec)), closes [#3556](https://github.com/conventional-changelog/commitlint/issues/3556)\n* update dependency cosmiconfig to v8.1.0 ([#3548](https://github.com/conventional-changelog/commitlint/issues/3548)) ([7d01b2e](https://github.com/conventional-changelog/commitlint/commit/7d01b2e1801e1e409ce0c98c3388521804cc9b3d))\n* update dependency yargs to v17.7.0 ([#3542](https://github.com/conventional-changelog/commitlint/issues/3542)) ([f14990f](https://github.com/conventional-changelog/commitlint/commit/f14990f626f5a2713ac4aa508133cf1072993449))\n* update dependency yargs to v17.7.1 ([#3546](https://github.com/conventional-changelog/commitlint/issues/3546)) ([9f37c11](https://github.com/conventional-changelog/commitlint/commit/9f37c119ffb3d93d9cd3c473c4da8f23731be4d5))\n\n\n### Features\n\n* **GitHubCI:** add ([#3549](https://github.com/conventional-changelog/commitlint/issues/3549)) ([d973611](https://github.com/conventional-changelog/commitlint/commit/d9736110ac2558ca22719093cb0282899a2c1254))\n* support typescript 5.0 ([#3566](https://github.com/conventional-changelog/commitlint/issues/3566)) ([c0a27ff](https://github.com/conventional-changelog/commitlint/commit/c0a27ffa3dcaef296ef58ce37bd8ca0a9d315d6e))\n\n\n\n\n\n## [17.4.4](https://github.com/conventional-changelog/commitlint/compare/v17.4.3...v17.4.4) (2023-02-17)\n\n\n### Bug Fixes\n\n* **parse:** allow setting fieldPattern in parserOpts ([#3538](https://github.com/conventional-changelog/commitlint/issues/3538)) ([ea23c65](https://github.com/conventional-changelog/commitlint/commit/ea23c65702d619b92e338e9f589a147d62e48ffc))\n\n\n\n\n\n## [17.4.3](https://github.com/conventional-changelog/commitlint/compare/v17.4.2...v17.4.3) (2023-02-13)\n\n\n### Bug Fixes\n\n* subject-full-stop rule bugfix ([#3531](https://github.com/conventional-changelog/commitlint/issues/3531)) ([5d3d529](https://github.com/conventional-changelog/commitlint/commit/5d3d529a6a57baee1bfdaaf3f0c503dee009e152))\n* update dependency minimist to v1.2.8 ([#3532](https://github.com/conventional-changelog/commitlint/issues/3532)) ([1f57f98](https://github.com/conventional-changelog/commitlint/commit/1f57f98dfc5005c6e0f7c2bc3d44e387d26eba57))\n\n\n\n\n\n## [17.4.2](https://github.com/conventional-changelog/commitlint/compare/v17.4.1...v17.4.2) (2023-01-12)\n\n\n### Bug Fixes\n\n* **load:** fixes a bug when a ts commitlint config is compiled twice ([#3499](https://github.com/conventional-changelog/commitlint/issues/3499)) ([dc2c899](https://github.com/conventional-changelog/commitlint/commit/dc2c899b5d7e4e7a7be79901b28e46da9f519211))\n* update dependency @types/fs-extra to v11 ([#3494](https://github.com/conventional-changelog/commitlint/issues/3494)) ([8f553c7](https://github.com/conventional-changelog/commitlint/commit/8f553c7603e3ee0f435d878e396eec899a213de8))\n* update dependency @types/fs-extra to v11.0.1 ([#3496](https://github.com/conventional-changelog/commitlint/issues/3496)) ([f9a013c](https://github.com/conventional-changelog/commitlint/commit/f9a013c89f5644d4917fb3ce94755a2600073ca4))\n\n\n\n\n\n## [17.4.1](https://github.com/conventional-changelog/commitlint/compare/v17.4.0...v17.4.1) (2023-01-09)\n\n**Note:** Version bump only for package @commitlint/root\n\n\n\n\n\n# [17.4.0](https://github.com/conventional-changelog/commitlint/compare/v17.3.0...v17.4.0) (2023-01-04)\n\n### Bug Fixes\n\n- stop truncating the body in presence of dashes ([#3476](https://github.com/conventional-changelog/commitlint/issues/3476)) ([02a61be](https://github.com/conventional-changelog/commitlint/commit/02a61befad13a348866fce30b15caa67a8360d9c))\n- update dependency ajv to v8.11.2 ([#3440](https://github.com/conventional-changelog/commitlint/issues/3440)) ([7829151](https://github.com/conventional-changelog/commitlint/commit/78291515d5083341946c600edfb9302f3409cdce))\n- update dependency ajv to v8.12.0 ([#3482](https://github.com/conventional-changelog/commitlint/issues/3482)) ([0a53d97](https://github.com/conventional-changelog/commitlint/commit/0a53d97005c1a6d49e8b1dc0993633569bbd191c))\n- update dependency cosmiconfig to v8 ([#3459](https://github.com/conventional-changelog/commitlint/issues/3459)) ([ee732fe](https://github.com/conventional-changelog/commitlint/commit/ee732fe0ef2057bdae93b7c368392934ac0de3af))\n- update dependency cosmiconfig-typescript-loader to v4.3.0 ([#3448](https://github.com/conventional-changelog/commitlint/issues/3448)) ([86b632e](https://github.com/conventional-changelog/commitlint/commit/86b632e74ceffacc980737840ce75e0ccd308e2a))\n- update dependency fs-extra to v11 ([#3460](https://github.com/conventional-changelog/commitlint/issues/3460)) ([a437923](https://github.com/conventional-changelog/commitlint/commit/a43792388e0d9707da770b26592c5e31553384a1))\n- update dependency semver to v7.3.8 ([#3441](https://github.com/conventional-changelog/commitlint/issues/3441)) ([7599ad6](https://github.com/conventional-changelog/commitlint/commit/7599ad6ab622ecbb6efa9ddba7acc3bbf66db5b5))\n- update dependency typescript to v4.9.4 ([#3449](https://github.com/conventional-changelog/commitlint/issues/3449)) ([bf86c7d](https://github.com/conventional-changelog/commitlint/commit/bf86c7dddc34c70d552decc040b30049a002d6a2))\n- update dependency yargs to v17.6.2 ([#3450](https://github.com/conventional-changelog/commitlint/issues/3450)) ([8a43a05](https://github.com/conventional-changelog/commitlint/commit/8a43a05080340227cbaf85b00c8dbe64038d476b))\n\n### Features\n\n- support config .cts extension ([#3461](https://github.com/conventional-changelog/commitlint/issues/3461)) ([85ad18b](https://github.com/conventional-changelog/commitlint/commit/85ad18b8990567df516effcacbf04edbcbb6b6d7))\n\n# [17.3.0](https://github.com/conventional-changelog/commitlint/compare/v17.2.1...v17.3.0) (2022-11-21)\n\n### Features\n\n- **config-pnpm-scopes:** implement config-pnpm-scopes ([#3427](https://github.com/conventional-changelog/commitlint/issues/3427)) ([ca3ae8b](https://github.com/conventional-changelog/commitlint/commit/ca3ae8b14271c62910d228a622bec20b1be8ed63))\n\n## [17.2.1](https://github.com/conventional-changelog/commitlint/compare/v17.2.0...v17.2.1) (2022-11-01)\n\n**Note:** Version bump only for package @commitlint/root\n\n# [17.2.0](https://github.com/conventional-changelog/commitlint/compare/v17.1.2...v17.2.0) (2022-10-31)\n\n### Bug Fixes\n\n- update dependency cosmiconfig-typescript-loader to v4.1.0 ([#3386](https://github.com/conventional-changelog/commitlint/issues/3386)) ([9abd75f](https://github.com/conventional-changelog/commitlint/commit/9abd75f83df6e5187b75a63200c5b68100a1cd6e))\n\n### Features\n\n- **cli:** add strict mode ([#3384](https://github.com/conventional-changelog/commitlint/issues/3384)) ([#3385](https://github.com/conventional-changelog/commitlint/issues/3385)) ([fdff2be](https://github.com/conventional-changelog/commitlint/commit/fdff2bee2d688698555de1cab904d0f5038075b1))\n- **config-nx-scopes:** add nx version ^15.0.0 as peerDependency ([#3416](https://github.com/conventional-changelog/commitlint/issues/3416)) ([f529a3f](https://github.com/conventional-changelog/commitlint/commit/f529a3f58e03d633bbd3949d397a38d9c993579b))\n\n## [17.1.2](https://github.com/conventional-changelog/commitlint/compare/v17.1.1...v17.1.2) (2022-08-29)\n\n### Bug Fixes\n\n- **load:** add ts-node as direct dependency ([#3351](https://github.com/conventional-changelog/commitlint/issues/3351)) ([3b66891](https://github.com/conventional-changelog/commitlint/commit/3b668911d8f9fd93e0f613842d5c0b7c3f24360a))\n- update dependency cosmiconfig-typescript-loader to v4 ([#3346](https://github.com/conventional-changelog/commitlint/issues/3346)) ([5a9d80f](https://github.com/conventional-changelog/commitlint/commit/5a9d80fba352deae1c2855792be4f8458a973431))\n\n## [17.1.1](https://github.com/conventional-changelog/commitlint/compare/v17.1.0...v17.1.1) (2022-08-27)\n\n### Bug Fixes\n\n- **load:** peer-dep version [#3345](https://github.com/conventional-changelog/commitlint/issues/3345) ([2dd7b50](https://github.com/conventional-changelog/commitlint/commit/2dd7b50c983e2720ad25c368e5a0f13b80ab7927))\n\n# [17.1.0](https://github.com/conventional-changelog/commitlint/compare/v17.0.3...v17.1.0) (2022-08-27)\n\n### Bug Fixes\n\n- update dependency cosmiconfig-typescript-loader to v3 ([#3253](https://github.com/conventional-changelog/commitlint/issues/3253)) ([4e87d14](https://github.com/conventional-changelog/commitlint/commit/4e87d1431df6d39990e5f56a579604b1b3268ce6))\n- update dependency cosmiconfig-typescript-loader to v3.1.1 ([#3282](https://github.com/conventional-changelog/commitlint/issues/3282)) ([550ab3d](https://github.com/conventional-changelog/commitlint/commit/550ab3d9a311378c2d4860778e9ff5c6cf239cad))\n- update dependency cosmiconfig-typescript-loader to v3.1.2 ([#3343](https://github.com/conventional-changelog/commitlint/issues/3343)) ([4213e9c](https://github.com/conventional-changelog/commitlint/commit/4213e9c4ed87dfb1997d03bbf22f4f2cd6fc4e2f))\n\n### Features\n\n- **commitlint:** add additional git log args ([#3334](https://github.com/conventional-changelog/commitlint/issues/3334)) ([229c65b](https://github.com/conventional-changelog/commitlint/commit/229c65b60f15c15da5f5b11deb555d1f557c673a))\n\n## [17.0.3](https://github.com/conventional-changelog/commitlint/compare/v17.0.2...v17.0.3) (2022-06-25)\n\n### Bug Fixes\n\n- update dependency cosmiconfig-typescript-loader to v2.0.2 ([#3250](https://github.com/conventional-changelog/commitlint/issues/3250)) ([dfe69b0](https://github.com/conventional-changelog/commitlint/commit/dfe69b0bfa0da2c6201630f043b97983b0111d14))\n\n## [17.0.2](https://github.com/conventional-changelog/commitlint/compare/v17.0.1...v17.0.2) (2022-06-01)\n\n### Bug Fixes\n\n- update dependency conventional-changelog-conventionalcommits to v5 ([#3201](https://github.com/conventional-changelog/commitlint/issues/3201)) ([c20fd19](https://github.com/conventional-changelog/commitlint/commit/c20fd1952ed02df987165d96e4cef650c7fbaa4b))\n- update dependency cosmiconfig-typescript-loader to v2.0.1 ([#3202](https://github.com/conventional-changelog/commitlint/issues/3202)) ([9cf4b71](https://github.com/conventional-changelog/commitlint/commit/9cf4b71fc8785165c189de91d46eb5e2667bd1d4))\n\n## [17.0.1](https://github.com/conventional-changelog/commitlint/compare/v17.0.0...v17.0.1) (2022-05-25)\n\n### Bug Fixes\n\n- **cli:** use `core.commentChar` from git config with `--edit` flag ([#3191](https://github.com/conventional-changelog/commitlint/issues/3191)) ([e5fee05](https://github.com/conventional-changelog/commitlint/commit/e5fee05301ab7441b6091e4ee6fc095d26bbd589)), closes [#3190](https://github.com/conventional-changelog/commitlint/issues/3190) [#3190](https://github.com/conventional-changelog/commitlint/issues/3190) [#3190](https://github.com/conventional-changelog/commitlint/issues/3190)\n\n# [17.0.0](https://github.com/conventional-changelog/commitlint/compare/v16.3.0...v17.0.0) (2022-05-16)\n\n### Bug Fixes\n\n- update dependency yargs to v17.5.1 ([#3183](https://github.com/conventional-changelog/commitlint/issues/3183)) ([8db72f0](https://github.com/conventional-changelog/commitlint/commit/8db72f09e5e4e6a82e43246322cbd42d82d10bb6))\n\n- chore!: minimum node version v14 (#3128) ([ac5f9b4](https://github.com/conventional-changelog/commitlint/commit/ac5f9b47a9e3cd5c9d58b14da0feb426f06b1ef9)), closes [#3128](https://github.com/conventional-changelog/commitlint/issues/3128)\n\n### BREAKING CHANGES\n\n- drop node v12 support\n\n- chore: rename circleci windows job\n\nnode version is not defned by the name anyways (i think)\n\n# [16.3.0](https://github.com/conventional-changelog/commitlint/compare/v16.2.4...v16.3.0) (2022-05-14)\n\n### Bug Fixes\n\n- update dependency cosmiconfig-typescript-loader to v2 ([#3154](https://github.com/conventional-changelog/commitlint/issues/3154)) ([20122e8](https://github.com/conventional-changelog/commitlint/commit/20122e8d6e999b74eab3bab08a6d52cda3f13e37))\n- update dependency yargs to v17.5.0 ([#3171](https://github.com/conventional-changelog/commitlint/issues/3171)) ([0e6542b](https://github.com/conventional-changelog/commitlint/commit/0e6542bd0a0d193d0080809fc23031ad83b8e2d9))\n\n### Features\n\n- add ability to filter Nx projects in @commitlint/config-nx-scopes ([#3155](https://github.com/conventional-changelog/commitlint/issues/3155)) ([e595693](https://github.com/conventional-changelog/commitlint/commit/e595693eb9be51a874cff01580b883982083ba0e)), closes [#3152](https://github.com/conventional-changelog/commitlint/issues/3152)\n\n## [16.2.4](https://github.com/conventional-changelog/commitlint/compare/v16.2.3...v16.2.4) (2022-04-28)\n\n### Bug Fixes\n\n- **rules:** footer-leading-blank should work with body comments ([#3139](https://github.com/conventional-changelog/commitlint/issues/3139)) ([7dd88c9](https://github.com/conventional-changelog/commitlint/commit/7dd88c913cba9f444acc587c77210cb718c928c9))\n- update dependency cosmiconfig to v7.0.1 ([#3138](https://github.com/conventional-changelog/commitlint/issues/3138)) ([407837d](https://github.com/conventional-changelog/commitlint/commit/407837df9e5cfe3af06158a4684f95ff590000cb))\n- update dependency cosmiconfig-typescript-loader to v1.0.7 ([#3102](https://github.com/conventional-changelog/commitlint/issues/3102)) ([d0f2b3f](https://github.com/conventional-changelog/commitlint/commit/d0f2b3fe0f4b3bd2658efdde6d728bdacbc79557))\n- update dependency cosmiconfig-typescript-loader to v1.0.9 ([#3106](https://github.com/conventional-changelog/commitlint/issues/3106)) ([d91e70d](https://github.com/conventional-changelog/commitlint/commit/d91e70db61554e906851c66de1b4cb867eccb916))\n- update dependency fs-extra to v10.1.0 ([#3124](https://github.com/conventional-changelog/commitlint/issues/3124)) ([482613f](https://github.com/conventional-changelog/commitlint/commit/482613f4bf0de1d81a5ecda4ea9965165cd78120))\n- update dependency semver to v7.3.6 ([#3112](https://github.com/conventional-changelog/commitlint/issues/3112)) ([ad886fd](https://github.com/conventional-changelog/commitlint/commit/ad886fd7ea46bc2df346099f9d4f10defd51fe75))\n- update dependency semver to v7.3.7 ([#3119](https://github.com/conventional-changelog/commitlint/issues/3119)) ([c9c49b2](https://github.com/conventional-changelog/commitlint/commit/c9c49b2de935528d84a817de750cd65b8f765c48))\n- update dependency yargs to v17.4.0 ([#3080](https://github.com/conventional-changelog/commitlint/issues/3080)) ([1477d7c](https://github.com/conventional-changelog/commitlint/commit/1477d7c0de15000f0881329f177476082fee2067))\n- update dependency yargs to v17.4.1 ([#3116](https://github.com/conventional-changelog/commitlint/issues/3116)) ([69bf135](https://github.com/conventional-changelog/commitlint/commit/69bf135d69abb0e871ae7d1b6c76a5f343899edc))\n\n## [16.2.3](https://github.com/conventional-changelog/commitlint/compare/v16.2.2...v16.2.3) (2022-03-16)\n\n### Bug Fixes\n\n- update dependency @types/fs-extra to v9.0.13 ([#3054](https://github.com/conventional-changelog/commitlint/issues/3054)) ([4c7dd7c](https://github.com/conventional-changelog/commitlint/commit/4c7dd7c32f89f3187f9f655c8170d35b6be8f90a))\n- update dependency cosmiconfig-typescript-loader to v1.0.6 ([#3059](https://github.com/conventional-changelog/commitlint/issues/3059)) ([256e194](https://github.com/conventional-changelog/commitlint/commit/256e194cbe8ed773ed9d966fa06f9531a6bc4d37))\n- update dependency fs-extra to v10.0.1 ([#3041](https://github.com/conventional-changelog/commitlint/issues/3041)) ([1236c83](https://github.com/conventional-changelog/commitlint/commit/1236c8388bb9b684cdfe41577b90cc5eaa852a47))\n- update dependency git-raw-commits to v2.0.11 ([#3055](https://github.com/conventional-changelog/commitlint/issues/3055)) ([d5089f1](https://github.com/conventional-changelog/commitlint/commit/d5089f1ce211592bc9315c03ad79183f142b7f1b))\n\n## [16.2.2](https://github.com/conventional-changelog/commitlint/compare/v16.2.1...v16.2.2) (2022-02-14)\n\n**Note:** Version bump only for package @commitlint/root\n\n## [16.2.1](https://github.com/conventional-changelog/commitlint/compare/v16.2.0...v16.2.1) (2022-02-13)\n\n### Bug Fixes\n\n- update dependency cosmiconfig-typescript-loader to v1.0.5 ([#3020](https://github.com/conventional-changelog/commitlint/issues/3020)) ([2d431a6](https://github.com/conventional-changelog/commitlint/commit/2d431a60942fd615b4cce8f18a237c3fb6712223))\n- update dependency jest-environment-node to v27.5.0 ([#3012](https://github.com/conventional-changelog/commitlint/issues/3012)) ([a546128](https://github.com/conventional-changelog/commitlint/commit/a5461289cff8a7927bab9153af681afa7a039977))\n- update dependency jest-environment-node to v27.5.1 ([#3018](https://github.com/conventional-changelog/commitlint/issues/3018)) ([0cbf652](https://github.com/conventional-changelog/commitlint/commit/0cbf65269c1ca70b7a27c8bdee7e397ac6dba9b7))\n- update dependency read-pkg to v7.1.0 ([#3015](https://github.com/conventional-changelog/commitlint/issues/3015)) ([3b7b680](https://github.com/conventional-changelog/commitlint/commit/3b7b680ce4f5341d8816f3db036170b0cb28d33f))\n- **load:** satisfy @types/node peer dependency for cosmiconfig-loader-typescript ([#3008](https://github.com/conventional-changelog/commitlint/issues/3008)) ([338180c](https://github.com/conventional-changelog/commitlint/commit/338180c7174625cddd7a0ea2b9d2786fee375756)), closes [#3007](https://github.com/conventional-changelog/commitlint/issues/3007)\n\n# [16.2.0](https://github.com/conventional-changelog/commitlint/compare/v16.1.0...v16.2.0) (2022-01-25)\n\n### Bug Fixes\n\n- update dependency cosmiconfig-typescript-loader to v1.0.4 ([#2991](https://github.com/conventional-changelog/commitlint/issues/2991)) ([043a059](https://github.com/conventional-changelog/commitlint/commit/043a05922fb8139b57c78eb5034b77823b2139ba))\n\n### Features\n\n- add support for Nx monorepos via @commitlint/config-nx-scopes ([#2995](https://github.com/conventional-changelog/commitlint/issues/2995)) ([11879ad](https://github.com/conventional-changelog/commitlint/commit/11879adacbef3c939311b1ff597a7b894fcca0dc))\n\n# [16.1.0](https://github.com/conventional-changelog/commitlint/compare/v16.0.3...v16.1.0) (2022-01-20)\n\n### Features\n\n- **load:** accept functions as parser presets ([#2982](https://github.com/conventional-changelog/commitlint/issues/2982)) ([420e8d6](https://github.com/conventional-changelog/commitlint/commit/420e8d6a4d5663ade953272275a9e0fa7c5ddff0)), closes [#2964](https://github.com/conventional-changelog/commitlint/issues/2964) [#2964](https://github.com/conventional-changelog/commitlint/issues/2964)\n\n## [16.0.3](https://github.com/conventional-changelog/commitlint/compare/v16.0.2...v16.0.3) (2022-01-19)\n\n### Bug Fixes\n\n- commit body should be empty by default ([#2980](https://github.com/conventional-changelog/commitlint/issues/2980)) ([e6582e0](https://github.com/conventional-changelog/commitlint/commit/e6582e03608621e46f617a097b4880750ae85021))\n\n## [16.0.2](https://github.com/conventional-changelog/commitlint/compare/v16.0.1...v16.0.2) (2022-01-09)\n\n### Bug Fixes\n\n- update dependency conventional-changelog-conventionalcommits to v4.6.3 ([#2938](https://github.com/conventional-changelog/commitlint/issues/2938)) ([0231f4b](https://github.com/conventional-changelog/commitlint/commit/0231f4bd74d9c5a691ba3e25e92947127359528c))\n- update dependency conventional-commits-parser to v3.2.4 ([#2939](https://github.com/conventional-changelog/commitlint/issues/2939)) ([a484a9a](https://github.com/conventional-changelog/commitlint/commit/a484a9a65259861114deb2b37ee0b30d0058be2a))\n- update dependency cosmiconfig-typescript-loader to v1.0.3 ([#2956](https://github.com/conventional-changelog/commitlint/issues/2956)) ([cc6e6cd](https://github.com/conventional-changelog/commitlint/commit/cc6e6cdd53a4b609c8e0514a2035ce4f4a46a317))\n- update dependency jest-environment-node to v27.4.6 ([#2957](https://github.com/conventional-changelog/commitlint/issues/2957)) ([62a0867](https://github.com/conventional-changelog/commitlint/commit/62a0867ddbc771bf92395ccfd0d1f75ff9ea24ec))\n\n## [16.0.1](https://github.com/conventional-changelog/commitlint/compare/v16.0.0...v16.0.1) (2021-12-28)\n\n### Bug Fixes\n\n- update dependency @types/tmp to v0.2.3 ([#2928](https://github.com/conventional-changelog/commitlint/issues/2928)) ([8eeb1f4](https://github.com/conventional-changelog/commitlint/commit/8eeb1f436a91550295f5bc671e0d75fef7eedbd7))\n- update dependency conventional-changelog-conventionalcommits to v4.6.2 ([#2934](https://github.com/conventional-changelog/commitlint/issues/2934)) ([a239b9e](https://github.com/conventional-changelog/commitlint/commit/a239b9e7c4078d335182c9568e348680ca5fc569))\n- update dependency cosmiconfig-typescript-loader to v1.0.2 ([#2929](https://github.com/conventional-changelog/commitlint/issues/2929)) ([04cc88c](https://github.com/conventional-changelog/commitlint/commit/04cc88c0d985b5f03a2d1bdc7a1a94f4ef5c7019))\n- update dependency yargs to v17.3.1 ([#2935](https://github.com/conventional-changelog/commitlint/issues/2935)) ([8e099af](https://github.com/conventional-changelog/commitlint/commit/8e099afd794c8fc44c64b4cb817f197d2e80b12e))\n\n# [16.0.0](https://github.com/conventional-changelog/commitlint/compare/v15.0.0...v16.0.0) (2021-12-26)\n\n### Bug Fixes\n\n- **is-ignored:** ignore merge tag commit messages ([#2920](https://github.com/conventional-changelog/commitlint/issues/2920)) ([914782a](https://github.com/conventional-changelog/commitlint/commit/914782aad70d353baf4d9fbbf9824c0211241484))\n- update dependency @types/tmp to v0.2.2 ([#2903](https://github.com/conventional-changelog/commitlint/issues/2903)) ([d2f146c](https://github.com/conventional-changelog/commitlint/commit/d2f146c6d8bcafa96d13341433aebaa2712a2feb))\n- update dependency conventional-commits-parser to v3.2.3 ([#2904](https://github.com/conventional-changelog/commitlint/issues/2904)) ([3a98d3c](https://github.com/conventional-changelog/commitlint/commit/3a98d3c49eae1001ed25bcadaa209f8a4cb32e91))\n- **cz-commitlint:** combine commit body with issuesBody/breakingBody when body has an empty string ([#2915](https://github.com/conventional-changelog/commitlint/issues/2915)) ([a038b41](https://github.com/conventional-changelog/commitlint/commit/a038b419f7f1d2073977ec1e6fe59ffcbba38931))\n- **docs:** minor changes to guides ([#2913](https://github.com/conventional-changelog/commitlint/issues/2913)) ([499efd1](https://github.com/conventional-changelog/commitlint/commit/499efd17927ca26e9dcdae58e4cc0772b45bbea8))\n- update dependency conventional-changelog-conventionalcommits to v4.6.1 ([#2906](https://github.com/conventional-changelog/commitlint/issues/2906)) ([1d1ccfa](https://github.com/conventional-changelog/commitlint/commit/1d1ccfab358b7dbd6448f8d74d0ae39eaddb3189))\n- update dependency cosmiconfig to v7.0.1 ([#2905](https://github.com/conventional-changelog/commitlint/issues/2905)) ([2c33c98](https://github.com/conventional-changelog/commitlint/commit/2c33c98693627888f2246b34e00941417c6ef932))\n- update dependency jest-environment-node to v27.4.2 ([#2907](https://github.com/conventional-changelog/commitlint/issues/2907)) ([c3b29ba](https://github.com/conventional-changelog/commitlint/commit/c3b29ba15a13fa3f2510a8bb153a1f90ee8ee583))\n- update dependency yargs to v17.3.0 ([#2908](https://github.com/conventional-changelog/commitlint/issues/2908)) ([a387494](https://github.com/conventional-changelog/commitlint/commit/a38749443130400b9d289d3d50042271bff44a28))\n\n### Features\n\n- **config-rush-scopes:** add config for rush monorepo ([#2878](https://github.com/conventional-changelog/commitlint/issues/2878)) ([befa677](https://github.com/conventional-changelog/commitlint/commit/befa677c3c2bed38085a62da161366784d971906))\n- **cz-commitlint:** support select scope with radio list by setting disableMultipleScopes ([#2911](https://github.com/conventional-changelog/commitlint/issues/2911)) ([9d8d73f](https://github.com/conventional-changelog/commitlint/commit/9d8d73f36e0c62c8cd9e3e913b66a5ca46ebf622)), closes [#2782](https://github.com/conventional-changelog/commitlint/issues/2782)\n- config validation ([#2412](https://github.com/conventional-changelog/commitlint/issues/2412)) ([c717202](https://github.com/conventional-changelog/commitlint/commit/c7172022097b11f46b33617e4a94d751243c1049)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n### BREAKING CHANGES\n\n- **cz-commitlint:** users who is using multiple scopes need to set enableMultipleScopes to true\n\n# [15.0.0](https://github.com/conventional-changelog/commitlint/compare/v14.2.0...v15.0.0) (2021-11-17)\n\n### Bug Fixes\n\n- **prompt:** correct import kind in prompt package ([#2852](https://github.com/conventional-changelog/commitlint/issues/2852)) ([45bf394](https://github.com/conventional-changelog/commitlint/commit/45bf394b34cef78011c2e0a1a7d0cc0d2bab41ae))\n- **prompt:** correct version of internal dependencies in prompt package [#2697](https://github.com/conventional-changelog/commitlint/issues/2697) ([#2851](https://github.com/conventional-changelog/commitlint/issues/2851)) ([b1155ca](https://github.com/conventional-changelog/commitlint/commit/b1155cae766aba7e93bc42c69c9ea7f47c1c16d4))\n- **types:** fix signature of QualifiedRuleConfig for async configurations ([#2868](https://github.com/conventional-changelog/commitlint/issues/2868)) ([#2869](https://github.com/conventional-changelog/commitlint/issues/2869)) ([c7f355b](https://github.com/conventional-changelog/commitlint/commit/c7f355b25e5baddab0b9559892f5ce4112e4f93a))\n\n### Features\n\n- simplify config resolution ([#2398](https://github.com/conventional-changelog/commitlint/issues/2398)) ([8a8384f](https://github.com/conventional-changelog/commitlint/commit/8a8384f3c18954447cb633e76a573e1db71a1440)), closes [#327](https://github.com/conventional-changelog/commitlint/issues/327)\n\n### Tests\n\n- **config-lerna-scopes:** reuse npm bootstrap to simplify tests ([#2479](https://github.com/conventional-changelog/commitlint/issues/2479)) ([9a7a43a](https://github.com/conventional-changelog/commitlint/commit/9a7a43aa8a7eca18f2fe05c78d27dcb1a128930c)), closes [#2447](https://github.com/conventional-changelog/commitlint/issues/2447)\n\n### BREAKING CHANGES\n\n- **config-lerna-scopes:** upgrade to lerna v4\n\nCo-authored-by: Renovate Bot <bot@renovateapp.com>\nCo-authored-by: escapedcat <github@htmlcss.de>\n\n- test(config-lerna-scopes): reuse npm bootstrap to simplify tests\n\n- test(config-lerna-scopes): reuse npm bootstrap to simplify tests\n\n- test: fix issue after merge\n\n- test: one more fix after merge\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>\nCo-authored-by: Renovate Bot <bot@renovateapp.com>\nCo-authored-by: escapedcat <github@htmlcss.de>\n\n## [8.3.6](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v8.3.6) (2021-11-17)\n\n**Note:** Version bump only for package @commitlint/root\n\nchore: update lodash to 4.17.21\nSECURITY: CVE-2021-23337 in package lodash https://nvd.nist.gov/vuln/detail/CVE-2021-23337\n\n# [14.2.0](https://github.com/conventional-changelog/commitlint/compare/v14.1.0...v14.2.0) (2021-11-06)\n\n### Features\n\n- **prompt:** rewrite codebase to use inquirer - UPDATED with current master ([#2697](https://github.com/conventional-changelog/commitlint/issues/2697)) ([5105f43](https://github.com/conventional-changelog/commitlint/commit/5105f43ea8093bce82fe4703c4c14a8210721924))\n\n# [14.1.0](https://github.com/conventional-changelog/commitlint/compare/v14.0.0...v14.1.0) (2021-11-01)\n\n### Features\n\n- extend helpUrl from shareable config ([#2846](https://github.com/conventional-changelog/commitlint/issues/2846)) ([d7e2e2b](https://github.com/conventional-changelog/commitlint/commit/d7e2e2b943be383f99f4000b6b6bed0eab03bfcf))\n- **load:** add support for `.commitlintrc.cjs` and `commitlint.config.cjs` files ([#2797](https://github.com/conventional-changelog/commitlint/issues/2797)) ([fabb495](https://github.com/conventional-changelog/commitlint/commit/fabb49509730609276ff9ef6357536c95a1f6bb1))\n\n# [14.0.0](https://github.com/conventional-changelog/commitlint/compare/v13.2.1...v14.0.0) (2021-10-26)\n\n- support multiple scopes and multiple cases & fix sentence-case is not consistent with commitlint/cli (#2806) ([2c71a7e](https://github.com/conventional-changelog/commitlint/commit/2c71a7e2965a2beff805982d37243b79a48c9360)), closes [#2806](https://github.com/conventional-changelog/commitlint/issues/2806) [#2782](https://github.com/conventional-changelog/commitlint/issues/2782)\n\n### BREAKING CHANGES\n\n- add prompt.settings configuration\n\n## [13.2.1](https://github.com/conventional-changelog/commitlint/compare/v13.2.0...v13.2.1) (2021-10-09)\n\n### Bug Fixes\n\n- **load:** added a direct dependency on typescript ([#2785](https://github.com/conventional-changelog/commitlint/issues/2785)) ([9c17f8d](https://github.com/conventional-changelog/commitlint/commit/9c17f8d423404b484f72df41358a18bd90014ecd)), closes [EndemolShineGroup/cosmiconfig-typescript-loader#147](https://github.com/EndemolShineGroup/cosmiconfig-typescript-loader/issues/147) [#2779](https://github.com/conventional-changelog/commitlint/issues/2779)\n\n# [13.2.0](https://github.com/conventional-changelog/commitlint/compare/v13.1.0...v13.2.0) (2021-09-28)\n\n### Bug Fixes\n\n- **parse:** enforce secure version of `conventional-commits-parser` ([#2776](https://github.com/conventional-changelog/commitlint/issues/2776)) ([a351801](https://github.com/conventional-changelog/commitlint/commit/a3518012ae11bc00a43a12b8ce935f3ffd2d04ef))\n- update dependency read-pkg to v7 ([#2721](https://github.com/conventional-changelog/commitlint/issues/2721)) ([7d9a3b1](https://github.com/conventional-changelog/commitlint/commit/7d9a3b1f2ab41c598f4d23d96805f86a4d41ae09))\n- **types:** prompt messages key ([4825a52](https://github.com/conventional-changelog/commitlint/commit/4825a521e2c74d63a11920b48094fddc79001b3c))\n- **types:** prompt messages props optional ([0bd0592](https://github.com/conventional-changelog/commitlint/commit/0bd0592148ab4266fd76816b19d352e2cf947f8c))\n- **types:** user config prompt ([6d7a1c4](https://github.com/conventional-changelog/commitlint/commit/6d7a1c40e2f8a8ff22595e0e17f71f3702b0699c))\n\n### Features\n\n- **load:** add cosmiconfig typescript loader ([b65aced](https://github.com/conventional-changelog/commitlint/commit/b65acedc3334a859811762539ec8716de3e73f85))\n\n# [13.1.0](https://github.com/conventional-changelog/commitlint/compare/v13.0.0...v13.1.0) (2021-07-24)\n\n### Bug Fixes\n\n- **cz-commitlint:** fix minor formatting issues ([99d8881](https://github.com/conventional-changelog/commitlint/commit/99d8881d0d951deded6d9e31bbb279d04101549b))\n- **types:** adds TargetCaseType[] for CaseRuleConfig ([c3bef38](https://github.com/conventional-changelog/commitlint/commit/c3bef384ff1a3ec428ba7c86bc778c50a9e6eead))\n- update dependency import-from to v4 ([#2629](https://github.com/conventional-changelog/commitlint/issues/2629)) ([5bcb604](https://github.com/conventional-changelog/commitlint/commit/5bcb60456cd9d4c8f0f0bae21ca7c3d1c73943ca))\n- **cli:** remove hard coded comment char with linting `COMMIT_EDIT_MSG` ([#2618](https://github.com/conventional-changelog/commitlint/issues/2618)) ([5badf6d](https://github.com/conventional-changelog/commitlint/commit/5badf6dc08116ed3557e6c780e55764b4f07ca67)), closes [#2351](https://github.com/conventional-changelog/commitlint/issues/2351)\n\n### Features\n\n- **rules:** allow body-case to accept an array of cases ([5383c9e](https://github.com/conventional-changelog/commitlint/commit/5383c9edcd9a351ea1c33ed49f47afed9b1cde6b)), closes [#2631](https://github.com/conventional-changelog/commitlint/issues/2631)\n\n# [13.0.0](https://github.com/conventional-changelog/commitlint/compare/v12.1.4...v13.0.0) (2021-05-24)\n\n### Bug Fixes\n\n- update dependency chalk to v4.1.1 ([#2608](https://github.com/conventional-changelog/commitlint/issues/2608)) ([f41b123](https://github.com/conventional-changelog/commitlint/commit/f41b1237c7f7b2ff23b87643939569276d77b304))\n- update dependency yargs to v17.0.1 ([#2609](https://github.com/conventional-changelog/commitlint/issues/2609)) ([afbfd10](https://github.com/conventional-changelog/commitlint/commit/afbfd10592579c544d8e2c313f2c2baef68990f8))\n\n### Features\n\n- add subject-exclamation-mark rule to improve error messages ([#2593](https://github.com/conventional-changelog/commitlint/issues/2593)) ([be701bd](https://github.com/conventional-changelog/commitlint/commit/be701bdb1de4e667b7a872767244285c4fa4fda4))\n- **rules:** add `trailer-exists` rule ([#2578](https://github.com/conventional-changelog/commitlint/issues/2578)) ([cd3816d](https://github.com/conventional-changelog/commitlint/commit/cd3816d553762eae99e088689395c55afce0c6cc))\n\n- chore!: remove node 10 support (#2596) ([4db4ba1](https://github.com/conventional-changelog/commitlint/commit/4db4ba1b0b312410a0f62100a93a80c246a6c410)), closes [#2596](https://github.com/conventional-changelog/commitlint/issues/2596)\n\n### BREAKING CHANGES\n\n- minimum node version is 12\n\n## [12.1.3](https://github.com/conventional-changelog/commitlint/compare/v12.1.2...v12.1.3) (2021-05-12)\n\n### Bug Fixes\n\n- update dependency fs-extra to v10 ([#2575](https://github.com/conventional-changelog/commitlint/issues/2575)) ([d47d2b5](https://github.com/conventional-changelog/commitlint/commit/d47d2b595b980adadd4fb8ff198c1914caeff18f))\n- update dependency yargs to v17 ([#2574](https://github.com/conventional-changelog/commitlint/issues/2574)) ([81c38dd](https://github.com/conventional-changelog/commitlint/commit/81c38ddf15f239b525f673b26b2ee6606f2ee8f6))\n\n## [12.1.2](https://github.com/conventional-changelog/commitlint/compare/v12.1.1...v12.1.2) (2021-04-29)\n\n### Bug Fixes\n\n- **rules:** fix subject-full-stop rule config value type ([#2534](https://github.com/conventional-changelog/commitlint/issues/2534)) ([2ab3c57](https://github.com/conventional-changelog/commitlint/commit/2ab3c57b709ddad3fc98d768309ac4fdac8cb68a))\n- **types:** update chalk import ([#2535](https://github.com/conventional-changelog/commitlint/issues/2535)) ([89f9a6d](https://github.com/conventional-changelog/commitlint/commit/89f9a6d759f7296438e184a93c1f766aba1443ca))\n\n## [12.1.1](https://github.com/conventional-changelog/commitlint/compare/v12.1.0...v12.1.1) (2021-04-02)\n\n### Bug Fixes\n\n- update dependency read-pkg to v6 ([#2530](https://github.com/conventional-changelog/commitlint/issues/2530)) ([d38a2ad](https://github.com/conventional-changelog/commitlint/commit/d38a2adc07f4cd6dad48aadbb73f2f1d3740e689))\n- **config-lerna-scopes:** ignore packages without names ([#2514](https://github.com/conventional-changelog/commitlint/issues/2514)) ([df3bf71](https://github.com/conventional-changelog/commitlint/commit/df3bf71ab36a085ef35a1491025c0d2e2b92ff77))\n- update dependency semver to v7.3.5 ([#2519](https://github.com/conventional-changelog/commitlint/issues/2519)) ([5113f22](https://github.com/conventional-changelog/commitlint/commit/5113f22c620e7b187fd558e5befa541b448ea18b))\n- **prompt:** modify the entry point to pass commitizen's function check ([#2501](https://github.com/conventional-changelog/commitlint/issues/2501)) ([0173fb7](https://github.com/conventional-changelog/commitlint/commit/0173fb7cc01dc8442ed88a0ab8feec20c955deee)), closes [/github.com/conventional-changelog/commitlint/issues/2486#issuecomment-791682272](https://github.com//github.com/conventional-changelog/commitlint/issues/2486/issues/issuecomment-791682272) [/github.com/conventional-changelog/commitlint/issues/2486#issuecomment-791682272](https://github.com//github.com/conventional-changelog/commitlint/issues/2486/issues/issuecomment-791682272)\n\n# [12.1.0](https://github.com/conventional-changelog/commitlint/compare/v12.0.1...v12.1.0) (2021-03-06)\n\n### Features\n\n- **config-lerna-scopes:** keep supporting lerna v3 ([51b0f4a](https://github.com/conventional-changelog/commitlint/commit/51b0f4a56f111c61419247755b1404b4e20d3a09))\n\n## [12.0.1](https://github.com/conventional-changelog/commitlint/compare/v12.0.0...v12.0.1) (2021-02-23)\n\n### Bug Fixes\n\n- update dependency conventional-commits-parser to v3.2.1 ([#2459](https://github.com/conventional-changelog/commitlint/issues/2459)) ([8bcc4f0](https://github.com/conventional-changelog/commitlint/commit/8bcc4f0b5ff8e0e2ae8ce960ccd1a4021c8e6cbb))\n- **load:** use `Rule | AsyncRule | SyncRule` as rule value type in `Plugin` ([#2146](https://github.com/conventional-changelog/commitlint/issues/2146)) ([75b67b8](https://github.com/conventional-changelog/commitlint/commit/75b67b8fb7fc4df21267b98f0c9daeeb1130b824))\n- **types:** correct chalkColor type ([#2420](https://github.com/conventional-changelog/commitlint/issues/2420)) ([ef8bdad](https://github.com/conventional-changelog/commitlint/commit/ef8bdad96c9ee7c3ad67f8280818c7f49c1df1fe))\n- update dependency throat to v6 ([#2417](https://github.com/conventional-changelog/commitlint/issues/2417)) ([6f7db1b](https://github.com/conventional-changelog/commitlint/commit/6f7db1b39c48561b84a4fce9623fb045c5467fe8))\n\n# [12.0.0](https://github.com/conventional-changelog/commitlint/compare/v11.0.0...v12.0.0) (2021-01-18)\n\n### Bug Fixes\n\n- remove unnecessary react babel transforms ([#2399](https://github.com/conventional-changelog/commitlint/issues/2399)) ([78f02fd](https://github.com/conventional-changelog/commitlint/commit/78f02fdb69c811b5ac38a7d018502aeeb785be04))\n- **utils:** update code to allow it to be executed ([#982](https://github.com/conventional-changelog/commitlint/issues/982)) ([52696d0](https://github.com/conventional-changelog/commitlint/commit/52696d048317944aa0d638b8702df78f8756d44b))\n- update dependency @types/fs-extra to v9.0.2 ([#2250](https://github.com/conventional-changelog/commitlint/issues/2250)) ([a10fa0b](https://github.com/conventional-changelog/commitlint/commit/a10fa0b580bdb09fd713beac78721cc5d579c67c))\n- update dependency @types/fs-extra to v9.0.5 ([#2360](https://github.com/conventional-changelog/commitlint/issues/2360)) ([3266712](https://github.com/conventional-changelog/commitlint/commit/3266712039e7ad6a13ed2d3097c28902b73cb701))\n- update dependency conventional-changelog-angular to v5.0.12 ([#2361](https://github.com/conventional-changelog/commitlint/issues/2361)) ([5766b39](https://github.com/conventional-changelog/commitlint/commit/5766b39b4ffb22452259827f131a2e7871637205))\n- update dependency conventional-changelog-conventionalcommits to v4.4.0 ([#2115](https://github.com/conventional-changelog/commitlint/issues/2115)) ([bccc9f5](https://github.com/conventional-changelog/commitlint/commit/bccc9f53df26b98bf51e4183d54ca66c45a51857))\n- update dependency conventional-changelog-conventionalcommits to v4.5.0 ([#2362](https://github.com/conventional-changelog/commitlint/issues/2362)) ([01c78bf](https://github.com/conventional-changelog/commitlint/commit/01c78bff6451befbc52294047c665326bc4eb9b9))\n- update dependency execa to v4.1.0 ([#2251](https://github.com/conventional-changelog/commitlint/issues/2251)) ([b5743dd](https://github.com/conventional-changelog/commitlint/commit/b5743dd1e49bbe7eac03f34bc38c59df5fbaf2a0))\n- update dependency execa to v5 ([#2341](https://github.com/conventional-changelog/commitlint/issues/2341)) ([f349df9](https://github.com/conventional-changelog/commitlint/commit/f349df90f08096a9bcad46b5e55b411aac327a24))\n- update dependency git-raw-commits to v2.0.7 ([#2116](https://github.com/conventional-changelog/commitlint/issues/2116)) ([ef969f3](https://github.com/conventional-changelog/commitlint/commit/ef969f375df170d6bdaadad205333352e01bb24d))\n- update dependency git-raw-commits to v2.0.8 ([#2364](https://github.com/conventional-changelog/commitlint/issues/2364)) ([3371715](https://github.com/conventional-changelog/commitlint/commit/3371715871d0381190635bd392780b16dd55e0c7))\n- update dependency meow to v8 ([#2245](https://github.com/conventional-changelog/commitlint/issues/2245)) ([890961b](https://github.com/conventional-changelog/commitlint/commit/890961b52b1552c1bb2798db02915e28686983f0))\n- update dependency meow to v8.1.0 ([#2380](https://github.com/conventional-changelog/commitlint/issues/2380)) ([0fbadcf](https://github.com/conventional-changelog/commitlint/commit/0fbadcf1d45c2e97f1da9938b3b80c0b45eba18c))\n- update dependency pkg-dir to v5 ([#2168](https://github.com/conventional-changelog/commitlint/issues/2168)) ([b9d1c84](https://github.com/conventional-changelog/commitlint/commit/b9d1c8462950303a7695f248849dd9f6a58b5a9a))\n- update dependency semver to v7.3.4 ([#2336](https://github.com/conventional-changelog/commitlint/issues/2336)) ([790b61a](https://github.com/conventional-changelog/commitlint/commit/790b61afa668d0eab80bbe49db58d3d5d29bb16e))\n- update dependency tar-fs to v2.1.1 ([#2261](https://github.com/conventional-changelog/commitlint/issues/2261)) ([a04f24f](https://github.com/conventional-changelog/commitlint/commit/a04f24f00873209d6d96cd894450d17fdfe9ca58))\n- **is-ignored:** ignore azure devops messages ([#2230](https://github.com/conventional-changelog/commitlint/issues/2230)) ([fe29ce7](https://github.com/conventional-changelog/commitlint/commit/fe29ce76bd87d5b42048228fbf0f47cc8d5411ec))\n- update dependency yargs to v16 ([204f36d](https://github.com/conventional-changelog/commitlint/commit/204f36d0a522afaf3a88739b401aea15ffa0b891))\n- update dependency yargs to v16.1.0 ([#2252](https://github.com/conventional-changelog/commitlint/issues/2252)) ([6478d07](https://github.com/conventional-changelog/commitlint/commit/6478d07afe0fe1736cf1aef1618c7d90d60d9117))\n- **resolve-extends:** `extends` field should be resolved from left to right ([#2070](https://github.com/conventional-changelog/commitlint/issues/2070)) ([c0a86f5](https://github.com/conventional-changelog/commitlint/commit/c0a86f5b5ed6ef071acef4baf38e7fc549fbec37))\n\n### Features\n\n- **cli:** implement print-config cli flag ([#2391](https://github.com/conventional-changelog/commitlint/issues/2391)) ([8626883](https://github.com/conventional-changelog/commitlint/commit/86268833946dea9dcf1c15459456cd4427d17835))\n- **config-lerna-scopes:** support yarn workspaces ([#2149](https://github.com/conventional-changelog/commitlint/issues/2149)) ([b244246](https://github.com/conventional-changelog/commitlint/commit/b2442469afe3b11c20b0101be7656ced43fab366))\n- **load:** allow specifying helpUrl via config ([#2180](https://github.com/conventional-changelog/commitlint/issues/2180)) ([d6795a3](https://github.com/conventional-changelog/commitlint/commit/d6795a3c4633ba6efd7a0fcff48339dc291cd832))\n- **rules:** add body-full-stop rule ([#2144](https://github.com/conventional-changelog/commitlint/issues/2144)) ([7767ca2](https://github.com/conventional-changelog/commitlint/commit/7767ca2591d10207c4abe7f3e5e6de503ac12a25))\n\n### BREAKING CHANGES\n\n- **resolve-extends:** The order of the `extends` resolution is changed from right-to-left to left-to-right\n\n# [11.0.0](https://github.com/conventional-changelog/commitlint/compare/v10.0.0...v11.0.0) (2020-09-05)\n\n### Bug Fixes\n\n- **cli:** remove default value from edit option [#2065](https://github.com/conventional-changelog/commitlint/issues/2065) ([3d4116d](https://github.com/conventional-changelog/commitlint/commit/3d4116d044a2f5149a9c9c1d9fa35abf5e232479))\n- **rules:** ignore comments in `signed-off-by` ([#2098](https://github.com/conventional-changelog/commitlint/issues/2098)) ([b610bcd](https://github.com/conventional-changelog/commitlint/commit/b610bcd15215cc5f14fb6de07914ed595cc3047b))\n- update dependency @types/fs-extra to ^9.0.1 ([#2088](https://github.com/conventional-changelog/commitlint/issues/2088)) ([cb1028e](https://github.com/conventional-changelog/commitlint/commit/cb1028ef2700d86991c69a1e2ad391bc1bdc9d90))\n\n- refactor!: drop support for lerna v2 ([59667b3](https://github.com/conventional-changelog/commitlint/commit/59667b376118323b1312d3d1084b9178918f3d23))\n\n### BREAKING CHANGES\n\n- remove lerna v2 support and tests\n\n# [10.0.0](https://github.com/conventional-changelog/commitlint/compare/v9.1.2...v10.0.0) (2020-08-16)\n\n### Bug Fixes\n\n- update dependency ([#1993](https://github.com/conventional-changelog/commitlint/issues/1993)) ([32667e8](https://github.com/conventional-changelog/commitlint/commit/32667e8aa665cf94fe669ba048ad7abaf6abac6e))\n- update dependency cosmiconfig to v7 ([#2044](https://github.com/conventional-changelog/commitlint/issues/2044)) ([f4db933](https://github.com/conventional-changelog/commitlint/commit/f4db93324698ea39528be0d2692151546c2b5517))\n- update dependency execa to v4 ([#1936](https://github.com/conventional-changelog/commitlint/issues/1936)) ([8efb441](https://github.com/conventional-changelog/commitlint/commit/8efb44193058d286f7325327a6d33936b273ec91))\n- update dependency find-up to v5 ([#2060](https://github.com/conventional-changelog/commitlint/issues/2060)) ([25d42f4](https://github.com/conventional-changelog/commitlint/commit/25d42f4179396bdfbfc622a401d8ca8877102286))\n- update dependency fs-extra to v9 ([#1018](https://github.com/conventional-changelog/commitlint/issues/1018)) ([2df49fa](https://github.com/conventional-changelog/commitlint/commit/2df49fac907993ae78199a1012e918b0e2ff5621))\n- update dependency get-stdin to v8 ([#1938](https://github.com/conventional-changelog/commitlint/issues/1938)) ([f94a5c8](https://github.com/conventional-changelog/commitlint/commit/f94a5c82861523aa1cf407ffe062f99ecbbfb4e4))\n\n- refactor!: drop support for node 8 (#1999) ([751f39f](https://github.com/conventional-changelog/commitlint/commit/751f39f284ef232574a176c3c11b1982ee544166)), closes [#1999](https://github.com/conventional-changelog/commitlint/issues/1999)\n\n### BREAKING CHANGES\n\n- remove node 8 from circle-ci checks\n\nalso remove node 13 because we do not support experimental versions\n\n- docs: update node v10 to latest LTS 10 version\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\nCo-authored-by: Cedric van Putten <me@bycedric.com>\n\n## [9.1.2](https://github.com/conventional-changelog/commitlint/compare/v9.1.1...v9.1.2) (2020-07-13)\n\n**Note:** Version bump only for package @commitlint/root\n\n## [9.1.1](https://github.com/conventional-changelog/commitlint/compare/v9.1.0...v9.1.1) (2020-06-30)\n\n### Bug Fixes\n\n- **load:** resolve plugins from extended configs ([#1976](https://github.com/conventional-changelog/commitlint/issues/1976)) ([d0f0eb9](https://github.com/conventional-changelog/commitlint/commit/d0f0eb9fde7efc2dff7a3aad190ded14303d3079))\n- mark internal packages as private [#972](https://github.com/conventional-changelog/commitlint/issues/972) ([#1970](https://github.com/conventional-changelog/commitlint/issues/1970)) ([2351124](https://github.com/conventional-changelog/commitlint/commit/23511248b2b4020ee87d04a838c7ce31e094c128))\n\n# [9.1.0](https://github.com/conventional-changelog/commitlint/compare/v9.0.1...v9.1.0) (2020-06-21)\n\n### Bug Fixes\n\n- update dependency chalk to v4 ([#1275](https://github.com/conventional-changelog/commitlint/issues/1275)) ([a5d8fa1](https://github.com/conventional-changelog/commitlint/commit/a5d8fa118e8221361f14f5fd2b21d7aaad008a27))\n- update dependency conventional-changelog-conventionalcommits to v4.3.0 ([#1816](https://github.com/conventional-changelog/commitlint/issues/1816)) ([f99aeda](https://github.com/conventional-changelog/commitlint/commit/f99aeda068aabdb250e2c9819da7229a695154b9))\n- update dependency regenerator-runtime to v0.13.5 ([#1017](https://github.com/conventional-changelog/commitlint/issues/1017)) ([9c4fdf1](https://github.com/conventional-changelog/commitlint/commit/9c4fdf1b5f42677422532dad655af9aed9b43881))\n- update dependency semver to v7.3.2 ([#1369](https://github.com/conventional-changelog/commitlint/issues/1369)) ([3c09722](https://github.com/conventional-changelog/commitlint/commit/3c09722d2db85a94cd1f4bf25c6b4251b2c41bbb))\n- update dependency tar-fs to v2.1.0 ([#1103](https://github.com/conventional-changelog/commitlint/issues/1103)) ([7882036](https://github.com/conventional-changelog/commitlint/commit/788203689ebf51343ccf2e6eab530e19f4faf122))\n- update dependency tmp to v0.2.1 ([#1817](https://github.com/conventional-changelog/commitlint/issues/1817)) ([0ff72f4](https://github.com/conventional-changelog/commitlint/commit/0ff72f41bd48b3dd37f881f6fb11477d8f643735))\n\n### Features\n\n- add local plugins support ([#1692](https://github.com/conventional-changelog/commitlint/issues/1692)) ([7b29c48](https://github.com/conventional-changelog/commitlint/commit/7b29c48321b513e091849fbb2cc2bf0e6ebb94a6))\n- enable multiple scopes in scope-enum and scope-case rules ([#901](https://github.com/conventional-changelog/commitlint/issues/901)) ([73632ce](https://github.com/conventional-changelog/commitlint/commit/73632cec299d5c3a980d07037c08633c843a8555))\n\n## [9.0.1](https://github.com/conventional-changelog/commitlint/compare/v9.0.0...v9.0.1) (2020-05-26)\n\n### Bug Fixes\n\n- add missing @babel/runtime dep [#1738](https://github.com/conventional-changelog/commitlint/issues/1738) ([#1754](https://github.com/conventional-changelog/commitlint/issues/1754)) ([09afcd6](https://github.com/conventional-changelog/commitlint/commit/09afcd647a2c1d00538cf1c970e3790d936111f8))\n\n# [9.0.0](https://github.com/conventional-changelog/commitlint/compare/v8.3.5...v9.0.0) (2020-05-21)\n\n### Bug Fixes\n\n- **cli:** add missing regenerator-runtime to dependencies ([#919](https://github.com/conventional-changelog/commitlint/issues/919)) ([ee5eac9](https://github.com/conventional-changelog/commitlint/commit/ee5eac98fa97ba5ba17030c8d2705aee5c7f3a3a))\n- [#840](https://github.com/conventional-changelog/commitlint/issues/840) add caret to lodash versions ([#843](https://github.com/conventional-changelog/commitlint/issues/843)) ([ffc0bac](https://github.com/conventional-changelog/commitlint/commit/ffc0bac26993acb2ab6a8fa51065f93c92b0d644))\n- drop support for 'improvement' type ([#899](https://github.com/conventional-changelog/commitlint/issues/899)) ([b27ab08](https://github.com/conventional-changelog/commitlint/commit/b27ab08544373cfb72a4808756e2e8126ea96a97))\n- **config-lerna-scopes:** correct lerna in peerDependencies ([#980](https://github.com/conventional-changelog/commitlint/issues/980)) ([f88f00d](https://github.com/conventional-changelog/commitlint/commit/f88f00d5d3d0a247b5635b50248bbb942b1ec962))\n- ignore empty commit messages [#615](https://github.com/conventional-changelog/commitlint/issues/615) ([#676](https://github.com/conventional-changelog/commitlint/issues/676)) ([c3eb1a7](https://github.com/conventional-changelog/commitlint/commit/c3eb1a76e08213d7ce1f200e35f8d5d6de18982a))\n- incorrect use of when in getForcedCaseFn ([#993](https://github.com/conventional-changelog/commitlint/issues/993)) ([34c11b8](https://github.com/conventional-changelog/commitlint/commit/34c11b8f3f233eca51866274a10d35231e8eb3d4))\n- update dependency semver to v7.1.3 ([#995](https://github.com/conventional-changelog/commitlint/issues/995)) ([4ee307a](https://github.com/conventional-changelog/commitlint/commit/4ee307a1f8c861ae5d8a038560d166c5d00ea8ba))\n\n### Features\n\n- add async promise based rules methods into lint ([#976](https://github.com/conventional-changelog/commitlint/issues/976)) ([4443062](https://github.com/conventional-changelog/commitlint/commit/444306249b8a3d04524538f61edca8f6cc10d75f))\n- add possibility to extend from string ([#865](https://github.com/conventional-changelog/commitlint/issues/865)) ([056c6fe](https://github.com/conventional-changelog/commitlint/commit/056c6fef346b4e84f8b1f93038a9461a7cbd9beb))\n- passdown argv to lint command ([#891](https://github.com/conventional-changelog/commitlint/issues/891)) ([c49a57c](https://github.com/conventional-changelog/commitlint/commit/c49a57c77767b8213d565df3a8bbcd7369f36641))\n- **config-conventional:** footer/body-max-line ([#436](https://github.com/conventional-changelog/commitlint/issues/436)) ([8b394c9](https://github.com/conventional-changelog/commitlint/commit/8b394c94ffe37322d734bd4944add4a6cb2a4689))\n- **config-conventional:** increase header-max-length to 100 ([#860](https://github.com/conventional-changelog/commitlint/issues/860)) ([ff11998](https://github.com/conventional-changelog/commitlint/commit/ff11998e0cf6fcd4f03bc18ab27b1bdd6bf21906)), closes [#859](https://github.com/conventional-changelog/commitlint/issues/859)\n\n### BREAKING CHANGES\n\n- 'improvement' type will now be rejected by this config.\n\n## [8.3.5](https://github.com/conventional-changelog/commitlint/compare/v8.3.4...v8.3.5) (2020-01-15)\n\n### Bug Fixes\n\n- **is-ignored:** move types to dev dependencies ([#897](https://github.com/conventional-changelog/commitlint/issues/897)) ([aabc549](https://github.com/conventional-changelog/commitlint/commit/aabc549))\n- **resolve-extends:** move node types to dev dependencies ([#883](https://github.com/conventional-changelog/commitlint/issues/883)) ([b131a18](https://github.com/conventional-changelog/commitlint/commit/b131a18)), closes [#874](https://github.com/conventional-changelog/commitlint/issues/874)\n\n## [8.3.4](https://github.com/conventional-changelog/commitlint/compare/v8.3.3...v8.3.4) (2020-01-03)\n\n### Bug Fixes\n\n- **commitlint:** use new read pkg syntax ([#888](https://github.com/conventional-changelog/commitlint/issues/888)) ([6b3b9a9](https://github.com/conventional-changelog/commitlint/commit/6b3b9a9))\n\n## [8.3.1](https://github.com/conventional-changelog/commitlint/compare/v8.3.0...v8.3.1) (2019-10-16)\n\n### Bug Fixes\n\n- **load:** resolve nested parser preset factories ([#831](https://github.com/conventional-changelog/commitlint/issues/831)) ([73a7df7](https://github.com/conventional-changelog/commitlint/commit/73a7df7))\n\n# [8.3.0](https://github.com/conventional-changelog/commitlint/compare/v8.2.0...v8.3.0) (2019-10-16)\n\n### Features\n\n- **cli:** add helpurl flag ([#789](https://github.com/conventional-changelog/commitlint/issues/789)) ([75cef4e](https://github.com/conventional-changelog/commitlint/commit/75cef4e))\n- **config-conventional:** use parser with short breaking change support ([#821](https://github.com/conventional-changelog/commitlint/issues/821)) ([4b5300a](https://github.com/conventional-changelog/commitlint/commit/4b5300a))\n- **resolve-extends:** accept absolute path in extends ([#825](https://github.com/conventional-changelog/commitlint/issues/825)) ([ecac29f](https://github.com/conventional-changelog/commitlint/commit/ecac29f))\n\n# [8.2.0](https://github.com/conventional-changelog/commitlint/compare/v8.1.0...v8.2.0) (2019-09-16)\n\nThis release is versioned as minor change because some of the core components are rewritten to TypeScript. It's part of the full port to TypeScript, currently in progress at [#659](https://github.com/conventional-changelog/commitlint/issues/659).\n\n### Bug Fixes\n\n- pass defaultIgnores from configuration in @commitlint/cli ([#771](https://github.com/conventional-changelog/commitlint/issues/771)) ([a259014](https://github.com/conventional-changelog/commitlint/commit/a259014))\n\n# [8.1.0](https://github.com/conventional-changelog/commitlint/compare/v8.0.0...v8.1.0) (2019-07-15)\n\nThis release is versioned as minor change because some of the core components are rewritten to TypeScript. It's part of the full port to TypeScript, currently in progress at [#659](https://github.com/conventional-changelog/commitlint/issues/659).\n\n### Bug Fixes\n\n- add explicit dependency on chalk ([#687](https://github.com/conventional-changelog/commitlint/issues/687)) ([9075844](https://github.com/conventional-changelog/commitlint/commit/9075844))\n- pass ignores from configuration in @commitlint/cli ([#668](https://github.com/conventional-changelog/commitlint/issues/668)) ([da99aaa](https://github.com/conventional-changelog/commitlint/commit/da99aaa))\n\n# [8.0.0](https://github.com/conventional-changelog/commitlint/compare/v7.6.2...v8.0.0)\n\n### Breaking Changes\n\n- fix: avoid excessive help text #606 (#637)\n  The commitlint default formatter is now silent for reports without warnings or errors.\n  Scripts relying on the success output of commitlint can restore the former output by specifying the --verbose flag.\n\n## [7.6.2](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.2)\n\n- Republish packages with out of sync artifacts\n\n## [7.6.1](https://github.com/conventional-changelog/commitlint/compare/v7.6.0...v7.6.1) (2019-05-09)\n\n### Bug Fixes\n\n- ensure format() is available as commonjs default export [#645](https://github.com/conventional-changelog/commitlint/issues/645) ([ec3da92](https://github.com/conventional-changelog/commitlint/commit/ec3da92))\n- handle absolute config paths correctly [#647](https://github.com/conventional-changelog/commitlint/issues/647) ([49b3a77](https://github.com/conventional-changelog/commitlint/commit/49b3a77))\n\n# [7.6.0](https://github.com/conventional-changelog/commitlint/compare/v7.5.2...v7.6.0) (2019-05-06)\n\n### Bug Fixes\n\n- add @lerna/project to repository dependencies ([#598](https://github.com/conventional-changelog/commitlint/issues/598)) ([56f03ee](https://github.com/conventional-changelog/commitlint/commit/56f03ee))\n- address security warnings for dev dependencies ([3e0d824](https://github.com/conventional-changelog/commitlint/commit/3e0d824))\n- avoid excessive help text [#606](https://github.com/conventional-changelog/commitlint/issues/606) ([#637](https://github.com/conventional-changelog/commitlint/issues/637)) ([8f3c3b1](https://github.com/conventional-changelog/commitlint/commit/8f3c3b1))\n- don't merge array properties with custom opts ([#616](https://github.com/conventional-changelog/commitlint/issues/616)) ([f321647](https://github.com/conventional-changelog/commitlint/commit/f321647)), closes [#594](https://github.com/conventional-changelog/commitlint/issues/594)\n- remove unneeded dev dependency ([6ccaf79](https://github.com/conventional-changelog/commitlint/commit/6ccaf79))\n- update cosmiconfig to safe >=5 [#599](https://github.com/conventional-changelog/commitlint/issues/599) ([f186fcb](https://github.com/conventional-changelog/commitlint/commit/f186fcb))\n- use sander.readFile correctly ([#448](https://github.com/conventional-changelog/commitlint/issues/448)) ([#630](https://github.com/conventional-changelog/commitlint/issues/630)) ([8e47985](https://github.com/conventional-changelog/commitlint/commit/8e47985))\n\n### Features\n\n- **resolve-extends:** accept short scoped package names in extends ([#597](https://github.com/conventional-changelog/commitlint/issues/597)) ([ba90e8e](https://github.com/conventional-changelog/commitlint/commit/ba90e8e))\n- adds support for plugins ([#228](https://github.com/conventional-changelog/commitlint/issues/228)) ([#588](https://github.com/conventional-changelog/commitlint/issues/588)) ([cea4564](https://github.com/conventional-changelog/commitlint/commit/cea4564))\n- config based is-ignored overrides ([#595](https://github.com/conventional-changelog/commitlint/issues/595)) ([2434d71](https://github.com/conventional-changelog/commitlint/commit/2434d71))\n\n## [7.5.2](https://github.com/conventional-changelog/commitlint/compare/v7.5.1...v7.5.2) (2019-02-11)\n\n### Bug Fixes\n\n- failing sentence-case for subjects with slashes ([#574](https://github.com/conventional-changelog/commitlint/issues/574)) ([48a8602](https://github.com/conventional-changelog/commitlint/commit/48a8602))\n- **cli:** replace old links with new organisation links ([#578](https://github.com/conventional-changelog/commitlint/issues/578)) ([4075903](https://github.com/conventional-changelog/commitlint/commit/4075903))\n\n## [7.5.1](https://github.com/conventional-changelog/commitlint/compare/v7.5.0...v7.5.1) (2019-02-09)\n\n### Bug Fixes\n\n- **is-ignored:** ignore bitbuckets automatic merge ([#573](https://github.com/conventional-changelog/commitlint/issues/573)) ([e5bdc5c](https://github.com/conventional-changelog/commitlint/commit/e5bdc5c))\n\n<a name=\"7.5.0\"></a>\n\n# [7.5.0](https://github.com/conventional-changelog/commitlint/compare/v7.4.0...v7.5.0) (2019-01-31)\n\n### Bug Fixes\n\n- `sentence-case` allow upper-case characters in first word ([#531](https://github.com/conventional-changelog/commitlint/issues/531)) ([5a6a4a8](https://github.com/conventional-changelog/commitlint/commit/5a6a4a8)), closes [#211](https://github.com/conventional-changelog/commitlint/issues/211)\n- **resolve-extends:** override array on extending rules ([#470](https://github.com/conventional-changelog/commitlint/issues/470)) ([#539](https://github.com/conventional-changelog/commitlint/issues/539)) ([b35000c](https://github.com/conventional-changelog/commitlint/commit/b35000c))\n- all broken website references ([#564](https://github.com/conventional-changelog/commitlint/issues/564)) ([82eeb5a](https://github.com/conventional-changelog/commitlint/commit/82eeb5a))\n- cleanup message for input with no config ([#519](https://github.com/conventional-changelog/commitlint/issues/519)) ([7d9e760](https://github.com/conventional-changelog/commitlint/commit/7d9e760))\n- **cli:** avoid linebreak in empty input ([#523](https://github.com/conventional-changelog/commitlint/issues/523)) ([3141882](https://github.com/conventional-changelog/commitlint/commit/3141882))\n- mark optional parameter with undefined ([#553](https://github.com/conventional-changelog/commitlint/issues/553)) ([6720284](https://github.com/conventional-changelog/commitlint/commit/6720284))\n- replace all repository references with conventional changelog ([#561](https://github.com/conventional-changelog/commitlint/issues/561)) ([6c3afcd](https://github.com/conventional-changelog/commitlint/commit/6c3afcd))\n- replace all website references with conventional changelog ([#563](https://github.com/conventional-changelog/commitlint/issues/563)) ([6b86fb1](https://github.com/conventional-changelog/commitlint/commit/6b86fb1))\n- replace old require-uncached with import-fresh ([#533](https://github.com/conventional-changelog/commitlint/issues/533)) ([b636e8c](https://github.com/conventional-changelog/commitlint/commit/b636e8c))\n- resolve path to commit message for git submodules ([83b1a47](https://github.com/conventional-changelog/commitlint/commit/83b1a47))\n- slash in scope [#291](https://github.com/conventional-changelog/commitlint/issues/291) ([#529](https://github.com/conventional-changelog/commitlint/issues/529)) ([b2b63e5](https://github.com/conventional-changelog/commitlint/commit/b2b63e5))\n- store concatenated array to problems variable ([#551](https://github.com/conventional-changelog/commitlint/issues/551)) ([434a70f](https://github.com/conventional-changelog/commitlint/commit/434a70f))\n\n### Features\n\n- add support for git submodules ([cc575fa](https://github.com/conventional-changelog/commitlint/commit/cc575fa))\n- **rule-header-length:** show current header length ([6d61c4f](https://github.com/conventional-changelog/commitlint/commit/6d61c4f))\n\n<a name=\"7.4.0\"></a>\n\n# [7.4.0](https://github.com/conventional-changelog/commitlint/compare/v7.3.2...v7.4.0) (2019-01-27)\n\n### Bug Fixes\n\n- correction to need help link ([#540](https://github.com/conventional-changelog/commitlint/issues/540)) ([fa6168a](https://github.com/conventional-changelog/commitlint/commit/fa6168a))\n\n### Features\n\n- **rules:** create header-case and header-full-stop rules ([#547](https://github.com/conventional-changelog/commitlint/issues/547)) ([4c36cbd](https://github.com/conventional-changelog/commitlint/commit/4c36cbd))\n\n<a name=\"7.3.2\"></a>\n\n## [7.3.2](https://github.com/conventional-changelog/commitlint/compare/v7.3.1...v7.3.2) (2019-01-15)\n\n### Bug Fixes\n\n- move loadsh to dependencies ([1bb66a4](https://github.com/conventional-changelog/commitlint/commit/1bb66a4))\n\n<a name=\"7.3.1\"></a>\n\n## [7.3.1](https://github.com/conventional-changelog/commitlint/compare/v7.3.0...v7.3.1) (2019-01-11)\n\n**Note:** Version bump only for package @commitlint/root\n\n<a name=\"7.3.0\"></a>\n\n# [7.3.0](https://github.com/conventional-changelog/commitlint/compare/v7.2.1...v7.3.0) (2019-01-11)\n\n### Bug Fixes\n\n- **format:** add new line to result ([#518](https://github.com/conventional-changelog/commitlint/issues/518)) ([f1d443b](https://github.com/conventional-changelog/commitlint/commit/f1d443b)), closes [#504](https://github.com/conventional-changelog/commitlint/issues/504)\n- add fallback with husky git params to deprecation handling ([#498](https://github.com/conventional-changelog/commitlint/issues/498)) ([5a34b8c](https://github.com/conventional-changelog/commitlint/commit/5a34b8c))\n- avoid truncated output on macOS ([#503](https://github.com/conventional-changelog/commitlint/issues/503)) ([3192368](https://github.com/conventional-changelog/commitlint/commit/3192368))\n- fall back to conventional commit-parser settings for missing keys ([#496](https://github.com/conventional-changelog/commitlint/issues/496)) ([831a141](https://github.com/conventional-changelog/commitlint/commit/831a141)), closes [#399](https://github.com/conventional-changelog/commitlint/issues/399)\n- respect String.protoype.repeat API contract ([f27e7ac](https://github.com/conventional-changelog/commitlint/commit/f27e7ac))\n- update to security-patched dependency versions ([97c033b](https://github.com/conventional-changelog/commitlint/commit/97c033b))\n- use correct label for failing empty subjects ([#481](https://github.com/conventional-changelog/commitlint/issues/481)) ([2e7e34d](https://github.com/conventional-changelog/commitlint/commit/2e7e34d)), closes [#476](https://github.com/conventional-changelog/commitlint/issues/476)\n\n### Features\n\n- check stage before entering prompt ([#495](https://github.com/conventional-changelog/commitlint/issues/495)) ([3b3667a](https://github.com/conventional-changelog/commitlint/commit/3b3667a)), closes [#51](https://github.com/conventional-changelog/commitlint/issues/51) [#51](https://github.com/conventional-changelog/commitlint/issues/51)\n- warn on empty config ([#491](https://github.com/conventional-changelog/commitlint/issues/491)) ([b6bd36e](https://github.com/conventional-changelog/commitlint/commit/b6bd36e)), closes [#107](https://github.com/conventional-changelog/commitlint/issues/107) [#107](https://github.com/conventional-changelog/commitlint/issues/107)\n\n<a name=\"7.2.1\"></a>\n\n## [7.2.1](https://github.com/conventional-changelog/commitlint/compare/v7.2.0...v7.2.1) (2018-10-11)\n\n### Bug Fixes\n\n- improve format module resolving ([#464](https://github.com/conventional-changelog/commitlint/issues/464)) ([baed8b1](https://github.com/conventional-changelog/commitlint/commit/baed8b1))\n\n<a name=\"7.2.0\"></a>\n\n# [7.2.0](https://github.com/conventional-changelog/commitlint/compare/v7.1.2...v7.2.0) (2018-10-05)\n\n### Bug Fixes\n\n- **rules:** include possible body offset in footer leading blank ([ff0111a](https://github.com/conventional-changelog/commitlint/commit/ff0111a))\n- handle case rules for numerics correctly ([cadcfed](https://github.com/conventional-changelog/commitlint/commit/cadcfed))\n- ignore merge messages with text after newline ([b32bc93](https://github.com/conventional-changelog/commitlint/commit/b32bc93))\n- use grouped regex to ignore merge commits ([#439](https://github.com/conventional-changelog/commitlint/issues/439)) ([905e9d5](https://github.com/conventional-changelog/commitlint/commit/905e9d5))\n\n### Features\n\n- **cli:** add format option for report output ([1ecf097](https://github.com/conventional-changelog/commitlint/commit/1ecf097))\n- **load:** add formatter option with default value ([b0e63d9](https://github.com/conventional-changelog/commitlint/commit/b0e63d9))\n\n<a name=\"7.1.2\"></a>\n\n## [7.1.2](https://github.com/conventional-changelog/commitlint/compare/v7.1.1...v7.1.2) (2018-09-04)\n\n**Note:** Version bump only for package @commitlint/root\n\n<a name=\"7.1.0\"></a>\n\n# [7.1.0](https://github.com/conventional-changelog/commitlint/compare/v7.0.1...v7.1.0) (2018-08-29)\n\n### Features\n\n- **wildcards:** add new wildcard patterns [#315](https://github.com/conventional-changelog/commitlint/issues/315) ([e9ea17f](https://github.com/conventional-changelog/commitlint/commit/e9ea17f))\n- add max line length to body/footer ([542f50e](https://github.com/conventional-changelog/commitlint/commit/542f50e))\n\n<a name=\"6.2.0\"></a>\n\n# [6.2.0](https://github.com/conventional-changelog/commitlint/compare/v6.1.3...v6.2.0) (2018-05-01)\n\n### Features\n\n- print commit message when the message is invalid ([86c34f1](https://github.com/conventional-changelog/commitlint/commit/86c34f1)), closes [#222](https://github.com/conventional-changelog/commitlint/issues/222)\n- **rules:** support array for scope-case and type-case ([#312](https://github.com/conventional-changelog/commitlint/issues/312)) ([1f46b9f](https://github.com/conventional-changelog/commitlint/commit/1f46b9f)), closes [#307](https://github.com/conventional-changelog/commitlint/issues/307)\n\n<a name=\"6.1.1\"></a>\n\n## [6.1.1](https://github.com/conventional-changelog/commitlint/compare/v6.1.0...v6.1.1) (2018-02-22)\n\n### Bug Fixes\n\n- **ensure:** ignore word delimiters for case matching [#291](https://github.com/conventional-changelog/commitlint/issues/291) ([fa69299](https://github.com/conventional-changelog/commitlint/commit/fa69299))\n\n<a name=\"6.1.0\"></a>\n\n# [6.1.0](https://github.com/conventional-changelog/commitlint/compare/v6.0.5...v6.1.0) (2018-02-03)\n\n### Bug Fixes\n\n- **parse:** default to angular preset for empty parserOpts ([#265](https://github.com/conventional-changelog/commitlint/issues/265)) ([ccb03b4](https://github.com/conventional-changelog/commitlint/commit/ccb03b4)), closes [#262](https://github.com/conventional-changelog/commitlint/issues/262)\n\n### Features\n\n- add \"--config\" option ([#261](https://github.com/conventional-changelog/commitlint/issues/261)) ([2c03ec6](https://github.com/conventional-changelog/commitlint/commit/2c03ec6))\n\n<a name=\"6.0.5\"></a>\n\n## [6.0.5](https://github.com/conventional-changelog/commitlint/compare/v6.0.4...v6.0.5) (2018-01-31)\n\n### Bug Fixes\n\n- remove utils from prod dependencies ([4fb858a](https://github.com/conventional-changelog/commitlint/commit/4fb858a))\n\n<a name=\"6.0.4\"></a>\n\n## [6.0.4](https://github.com/conventional-changelog/commitlint/compare/v6.0.3...v6.0.4) (2018-01-31)\n\n### Bug Fixes\n\n- remove faulty bin entry [#259](https://github.com/conventional-changelog/commitlint/issues/259) ([beafbc6](https://github.com/conventional-changelog/commitlint/commit/beafbc6))\n\n<a name=\"6.0.3\"></a>\n\n## [6.0.3](https://github.com/conventional-changelog/commitlint/compare/v6.0.2...v6.0.3) (2018-01-31)\n\n### Bug Fixes\n\n- update dependency cosmiconfig to ^4.0.0 ([#234](https://github.com/conventional-changelog/commitlint/issues/234)) ([7f94ac5](https://github.com/conventional-changelog/commitlint/commit/7f94ac5))\n- update dependency semver to v5.5.0 ([#236](https://github.com/conventional-changelog/commitlint/issues/236)) ([6c52bd9](https://github.com/conventional-changelog/commitlint/commit/6c52bd9))\n\n<a name=\"6.0.2\"></a>\n\n## [6.0.2](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.2) (2018-01-12)\n\n### Bug Fixes\n\n- ignore branch merges with multiple newlines ([#227](https://github.com/conventional-changelog/commitlint/issues/227)) ([1f0c5ca](https://github.com/conventional-changelog/commitlint/commit/1f0c5ca))\n- remove typo in error message of type-case ([cb577cb](https://github.com/conventional-changelog/commitlint/commit/cb577cb))\n\n<a name=\"6.0.1\"></a>\n\n## [6.0.1](https://github.com/conventional-changelog/commitlint/compare/v6.0.0...v6.0.1) (2018-01-09)\n\n**Note:** Version bump only for package @commitlint/root\n\n<a name=\"6.0.0\"></a>\n\n# [6.0.0](https://github.com/conventional-changelog/commitlint/compare/v5.2.6...v6.0.0) (2018-01-09)\n\n### Bug Fixes\n\n- allow [0] shorthand ([84cf938](https://github.com/conventional-changelog/commitlint/commit/84cf938))\n- correctly resolve parserOpts [#115](https://github.com/conventional-changelog/commitlint/issues/115) [#95](https://github.com/conventional-changelog/commitlint/issues/95) ([1353dd5](https://github.com/conventional-changelog/commitlint/commit/1353dd5))\n- ignore branch merges with newlines ([#214](https://github.com/conventional-changelog/commitlint/issues/214)) ([c94c4dc](https://github.com/conventional-changelog/commitlint/commit/c94c4dc))\n- sanitize ensure.case [#211](https://github.com/conventional-changelog/commitlint/issues/211) ([#217](https://github.com/conventional-changelog/commitlint/issues/217)) ([03aeefc](https://github.com/conventional-changelog/commitlint/commit/03aeefc))\n\n### Styles\n\n- validate rule configuration ([edf7187](https://github.com/conventional-changelog/commitlint/commit/edf7187))\n\n### BREAKING CHANGES\n\n- Due to additional validation while reading\n  commitlint config, previously ignored rule\n  settings are now considered critical errors\n  when starting the CLI. The new behaviour is\n  designed to help developers find issues with\n  their configuration quicker.\n\n<a name=\"5.2.6\"></a>\n\n## [5.2.6](https://github.com/conventional-changelog/commitlint/compare/v5.2.5...v5.2.6) (2017-12-21)\n\n### Bug Fixes\n\n- ignore semver commits with chore type ([cdbb085](https://github.com/conventional-changelog/commitlint/commit/cdbb085)), closes [#198](https://github.com/conventional-changelog/commitlint/issues/198)\n\n<a name=\"5.2.5\"></a>\n\n## [5.2.5](https://github.com/conventional-changelog/commitlint/compare/v5.2.4...v5.2.5) (2017-12-08)\n\n### Bug Fixes\n\n- **core:** use correct report message [#192](https://github.com/conventional-changelog/commitlint/issues/192) ([e3a78bc](https://github.com/conventional-changelog/commitlint/commit/e3a78bc))\n\n<a name=\"5.2.4\"></a>\n\n## [5.2.4](https://github.com/conventional-changelog/commitlint/compare/v5.2.3...v5.2.4) (2017-12-08)\n\n**Note:** Version bump only for package @commitlint/root\n\n<a name=\"5.2.3\"></a>\n\n## [5.2.3](https://github.com/conventional-changelog/commitlint/compare/v5.2.2...v5.2.3) (2017-12-05)\n\n### Bug Fixes\n\n- **cli:** add support for GIT_PARAMS on windows ([c62bd41](https://github.com/conventional-changelog/commitlint/commit/c62bd41)), closes [#103](https://github.com/conventional-changelog/commitlint/issues/103) [#175](https://github.com/conventional-changelog/commitlint/issues/175)\n\n<a name=\"5.2.2\"></a>\n\n## [5.2.2](https://github.com/conventional-changelog/commitlint/compare/v5.2.1...v5.2.2) (2017-11-30)\n\n### Bug Fixes\n\n- **travis-cli:** read push commits directly ([9bc56c6](https://github.com/conventional-changelog/commitlint/commit/9bc56c6))\n\n<a name=\"5.2.1\"></a>\n\n## [5.2.1](https://github.com/conventional-changelog/commitlint/compare/v5.2.0...v5.2.1) (2017-11-30)\n\n### Bug Fixes\n\n- **travis-cli:** lint ranges only for pr builds ([85b201f](https://github.com/conventional-changelog/commitlint/commit/85b201f))\n\n<a name=\"5.2.0\"></a>\n\n# [5.2.0](https://github.com/conventional-changelog/commitlint/compare/v5.1.3...v5.2.0) (2017-11-30)\n\n### Bug Fixes\n\n- consider pull requests from forks ([4653c2c](https://github.com/conventional-changelog/commitlint/commit/4653c2c))\n\n### Features\n\n- **babel-preset-commitlint:** add jsx tranform ([#163](https://github.com/conventional-changelog/commitlint/issues/163)) ([5190241](https://github.com/conventional-changelog/commitlint/commit/5190241))\n\n<a name=\"5.1.3\"></a>\n\n## [5.1.3](https://github.com/conventional-changelog/commitlint/compare/v5.1.2...v5.1.3) (2017-11-24)\n\n### Bug Fixes\n\n- **config-conventional:** add missing applicable attribute to type-enum ([a8db0b1](https://github.com/conventional-changelog/commitlint/commit/a8db0b1))\n\n<a name=\"5.1.2\"></a>\n\n## [5.1.2](https://github.com/conventional-changelog/commitlint/compare/v5.1.1...v5.1.2) (2017-11-24)\n\n### Bug Fixes\n\n- **prompt:** apply forced cases properly ([3a569a7](https://github.com/conventional-changelog/commitlint/commit/3a569a7)), closes [#145](https://github.com/conventional-changelog/commitlint/issues/145)\n\n<a name=\"5.1.1\"></a>\n\n## [5.1.1](https://github.com/conventional-changelog/commitlint/compare/v5.1.0...v5.1.1) (2017-11-24)\n\n### Bug Fixes\n\n- set access for npm ([8aeaec2](https://github.com/conventional-changelog/commitlint/commit/8aeaec2))\n\n<a name=\"5.1.0\"></a>\n\n# [5.1.0](https://github.com/conventional-changelog/commitlint/compare/v5.0.2...v5.1.0) (2017-11-24)\n\n### Bug Fixes\n\n- update dependency concurrently to v3.5.1 ([#147](https://github.com/conventional-changelog/commitlint/issues/147)) ([a809d0f](https://github.com/conventional-changelog/commitlint/commit/a809d0f))\n- **config-conventional:** remove unneeded dependency ([d0e62fd](https://github.com/conventional-changelog/commitlint/commit/d0e62fd))\n\n### Features\n\n- **prompt:** add description for build, ci and revert ([#148](https://github.com/conventional-changelog/commitlint/issues/148)) ([ee6ec6e](https://github.com/conventional-changelog/commitlint/commit/ee6ec6e))\n- **travis-cli:** add reusable travis command line interface ([3e6e6a8](https://github.com/conventional-changelog/commitlint/commit/3e6e6a8))\n- add conventional-changelog package ([8bb0a85](https://github.com/conventional-changelog/commitlint/commit/8bb0a85))\n\n<a name=\"5.0.1\"></a>\n\n## [5.0.1](https://github.com/conventional-changelog/commitlint/compare/v5.0.0...v5.0.1) (2017-11-19)\n\n### Bug Fixes\n\n- **core:** fall back to globally installed config if available ([#127](https://github.com/conventional-changelog/commitlint/issues/127)) ([8612eb3](https://github.com/conventional-changelog/commitlint/commit/8612eb3))\n\n<a name=\"5.0.0\"></a>\n\n# [5.0.0](https://github.com/conventional-changelog/commitlint/compare/v4.3.0...v5.0.0) (2017-11-18)\n\n### Bug fixes\n\n- core: interprets array values for subject-case correctly\n\n### Features\n\n- config-angular: disallow subject with uppercase first character, #114\n- config-angular-type-enum: remove chore type\n\nBREAKING CHANGE\n\nTL;DR\n\n- chore is no longer a valid commit type\n- subject with leading capitalized letter are forbidden now\n\nAngular has removed the chore type from their\nconventions as of January 2017\n\nSee [angular/angular@dff6ee](https://github.com/angular/angular/commit/dff6ee32725197bdb81f3f63c5bd9805f2ed22bb#diff-6a3371457528722a734f3c51d9238c13L204)\nfor reference\n\nThis removes the previous chore type from the list\nof allowed types.\n\nProjects using the Angular commit convention will identify commits with chore type as faulty.\n\nAlso, formerly working commit messages are now considered problems:\n\n- type: SOME MESSAGE\n- type: SomeMessage\n- type: Some Message\n\n<a name=\"4.3.0\"></a>\n\n# [4.3.0](https://github.com/conventional-changelog/commitlint/compare/v4.2.2...v4.3.0) (2017-11-08)\n\n### Bug Fixes\n\n- **core:** deprecate nlp rules ([bbab1d8](https://github.com/conventional-changelog/commitlint/commit/bbab1d8)), closes [#54](https://github.com/conventional-changelog/commitlint/issues/54)\n- **core:** ignore comments ([f3beda1](https://github.com/conventional-changelog/commitlint/commit/f3beda1)), closes [#78](https://github.com/conventional-changelog/commitlint/issues/78)\n\n### Features\n\n- add references-empty rule ([4fc8d5d](https://github.com/conventional-changelog/commitlint/commit/4fc8d5d))\n"
  },
  {
    "path": "Dockerfile.ci",
    "content": "# syntax=docker/dockerfile:1\nFROM docker.io/library/node:18-alpine AS builder\nWORKDIR /src\nCOPY . ./\nRUN apk add --no-cache python3 py3-setuptools make g++ git\nRUN yarn install --frozen-lockfile --network-timeout 100000 && \\\n    yarn run build && \\\n    # Commit lint CLI packages\n    npm pack @commitlint/cli && \\\n    npm pack @commitlint/config-validator && \\\n    npm pack @commitlint/config-pnpm-scopes && \\\n    npm pack @commitlint/config-nx-scopes && \\\n    npm pack @commitlint/ensure && \\\n    npm pack @commitlint/execute-rule && \\\n    npm pack @commitlint/format && \\\n    npm pack @commitlint/is-ignored && \\\n    npm pack @commitlint/lint && \\\n    npm pack @commitlint/load && \\\n    npm pack @commitlint/message && \\\n    npm pack @commitlint/parse && \\\n    npm pack @commitlint/read && \\\n    npm pack @commitlint/resolve-extends && \\\n    npm pack @commitlint/rules && \\\n    npm pack @commitlint/to-lines && \\\n    npm pack @commitlint/top-level && \\\n    npm pack @commitlint/types && \\\n    # Default commitlint config\n    npm pack @commitlint/config-conventional\n\nFROM docker.io/library/node:18-alpine\nRUN apk add --no-cache git\nCOPY --from=builder /src/*.tgz ./\nRUN npm config set fetch-retry-mintimeout 20000 && \\\n    npm config set fetch-retry-maxtimeout 120000 && \\\n    npm install --no-audit -g *.tgz && \\\n    rm -rf *.tgz\nENTRYPOINT [\"commitlint\"]\n"
  },
  {
    "path": "Dockerfile.dev",
    "content": "# syntax=docker/dockerfile:1\nFROM brainpower/node-cubicle\n\nWORKDIR /root/repo\n\nADD . ./\nRUN yarn\nRUN yarn build\n"
  },
  {
    "path": "README.md",
    "content": "# [Get Started](https://commitlint.js.org/guides/getting-started) | [Website](https://commitlint.js.org)\n\n> Lint commit messages\n\n<p align=\"center\">\n  <img width=\"600\" src=\"docs/public/assets/commitlint.svg\">\n</p>\n\n> Demo generated with [svg-term-cli](https://github.com/marionebl/svg-term-cli)\n>\n> `cat docs/assets/commitlint.json | svg-term --out docs/public/assets/commitlint.svg --frame --profile=Seti --height=20 --width=80`\n\n[![npm latest][2]][3] [![node compatibility][13]][14] [![Github Actions][4]][5]\n\n- 🚓 Be a good `commitizen`\n- 📦 Share configuration via `npm`\n- 🤖 Tap into `conventional-changelog`\n\n## Contents\n\n- [Get Started | Website](#get-started--website)\n  - [Contents](#contents)\n  - [What is commitlint](#what-is-commitlint)\n    - [Benefits of using commitlint](#benefits-of-using-commitlint)\n  - [Getting started](#getting-started)\n  - [CLI](#cli)\n  - [Config](#config)\n  - [Shared configuration](#shared-configuration)\n  - [Documentation](#documentation)\n  - [API](#api)\n  - [Tools](#tools)\n  - [Roadmap](#roadmap)\n  - [Version Support and Releases](#version-support-and-releases)\n    - [Releases](#releases)\n  - [Related projects](#related-projects)\n  - [License](#license)\n  - [Development](#development)\n    - [Install and run](#install-and-run)\n\n---\n\n## What is commitlint\n\ncommitlint checks if your commit messages meet the [conventional commit format](https://conventionalcommits.org).\n\nIn general the pattern mostly looks like this:\n\n```sh\ntype(scope?): subject  #scope is optional; multiple scopes are supported (current delimiter options: \"/\", \"\\\" and \",\")\n```\n\nReal world examples can look like this:\n\n```text\nchore: run tests on travis ci\n```\n\n```text\nfix(server): send cors headers\n```\n\n```text\nfeat(blog): add comment section\n```\n\nCommon types according to [commitlint-config-conventional (based on the Angular convention)](https://github.com/conventional-changelog/commitlint/tree/master/@commitlint/config-conventional#type-enum) can be:\n\n- build\n- chore\n- ci\n- docs\n- feat\n- fix\n- perf\n- refactor\n- revert\n- style\n- test\n\nThese can be modified by [your own configuration](#config).\n\n### Benefits of using commitlint\n\n- [Why Use Conventional Commits?](https://www.conventionalcommits.org/en/v1.0.0-beta.2/#why-use-conventional-commits)\n- [\"The perks of committing with conventions\" (Talk slides)](https://slides.com/marionebl/the-perks-of-committing-with-conventions#/)\n\n## Getting started\n\n- [Local setup](https://commitlint.js.org/guides/local-setup) - Lint messages on commit with husky\n- [CI setup](https://commitlint.js.org/guides/ci-setup) - Lint messages during CI builds\n\n## CLI\n\n- Primary way to interact with commitlint.\n- `npm install --save-dev @commitlint/cli`\n- Packages: [cli](./@commitlint/cli)\n\n## Config\n\n- Configuration is picked up from:\n  - `.commitlintrc`\n  - `.commitlintrc.json`\n  - `.commitlintrc.yaml`\n  - `.commitlintrc.yml`\n  - `.commitlintrc.js`\n  - `.commitlintrc.cjs`\n  - `.commitlintrc.mjs`\n  - `.commitlintrc.ts`\n  - `.commitlintrc.cts`\n  - `.commitlintrc.mts`\n  - `commitlint.config.js`\n  - `commitlint.config.cjs`\n  - `commitlint.config.mjs`\n  - `commitlint.config.ts`\n  - `commitlint.config.cts`\n  - `commitlint.config.mts`\n  - `commitlint` field in `package.json`\n  - `commitlint` field in [`package.yaml`](https://github.com/pnpm/pnpm/pull/1799)\n- Packages: [cli](./@commitlint/cli), [core](./@commitlint/core)\n- See [Rules](./docs/reference/rules.md) for a complete list of possible rules\n- An example configuration can be found at [@commitlint/config-conventional](./@commitlint/config-conventional/src/index.ts)\n\n### Important note about Node 24+\n\nNode 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:\n\n- Add a `package.json` file, declaring your project as an ES6 module. This can be done easily by running `npm init es6`.\n- Rename the config file from `commitlint.config.js` to `commitlint.config.mjs`.\n\n## Shared configuration\n\nA number of shared configurations are available to install and use with `commitlint`:\n\n- [@commitlint/config-angular](./@commitlint/config-angular)\n- [@commitlint/config-conventional](./@commitlint/config-conventional)\n- [@commitlint/config-lerna-scopes](./@commitlint/config-lerna-scopes)\n- [@commitlint/config-nx-scopes](./@commitlint/config-nx-scopes)\n- [@commitlint/config-patternplate](./@commitlint/config-patternplate)\n- [@commitlint/config-workspace-scopes](./@commitlint/config-workspace-scopes)\n- [conventional-changelog-lint-config-atom](https://github.com/erikmueller/conventional-changelog-lint-config-atom)\n- [conventional-changelog-lint-config-canonical](https://github.com/gajus/conventional-changelog-lint-config-canonical)\n\n> ⚠️ If you want to publish your own shareable config then make sure it has a name aligning with the pattern `commitlint-config-emoji-log` or `commitlint-config-your-config-name` — then in extend all you have to write is `emoji-log` or `your-config-name`.\n\n## Documentation\n\nCheck the [main website](https://commitlint.js.org/).\n\n## API\n\n- Alternative, programmatic way to interact with `commitlint`\n- Packages:\n  - [format](./@commitlint/format) - Format commitlint reports\n  - [lint](./@commitlint/lint) - Lint a string against commitlint rules\n  - [load](./@commitlint/load) - Load shared commitlint configuration\n  - [read](./@commitlint/read) - Read commit messages from a specified range or last edit\n- See [API](./docs/api) for a complete list of methods and examples\n\n## Tools\n\n- [commitizen adapter](./@commitlint/prompt)\n- [prompt](./@commitlint/prompt-cli)\n\n## Roadmap\n\n`commitlint` is considered stable and is used in various projects as a development tool.\n\n> **Ideas**: [conventional-changelog/commitlint#94](https://github.com/conventional-changelog/commitlint/issues/94)\n\n## Version Support and Releases\n\n- Node.js [LTS](https://github.com/nodejs/LTS#lts-schedule) `>= 18`\n- git `>= 2.13.2`\n\n### Releases\n\nSecurity patches will be applied to versions which are not yet EOL.\\\nFeatures will only be applied to the current main version.\n\n| Release                                                                          | Initial release |\n| -------------------------------------------------------------------------------- | --------------- |\n| [v19](https://github.com/conventional-changelog/commitlint/releases/tag/v19.0.0) | 02/2024         |\n| [v18](https://github.com/conventional-changelog/commitlint/releases/tag/v18.0.0) | 10/2023         |\n\nEOL is usually after around a year.\n\nWe're not a sponsored OSS project. Therefore we can't promise that we will release patch versions for older releases in a timely manner.\\\nIf you are stuck on an older version and need a security patch we're happy if you can provide a PR.\n\n## Related projects\n\n- [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog)\n  Generate a changelog from conventional commit history\n- [commitizen](https://github.com/commitizen/cz-cli)\n  Simple commit conventions for internet citizens\n- [create-semantic-module](https://github.com/jlegrone/create-semantic-module)\n  CLI for quickly integrating commitizen and commitlint in new or existing projects\n\n## License\n\nCopyright by @marionebl. All `commitlint` packages are released under the MIT license.\n\n## Development\n\n`commitlint` is developed in a mono repository.\n\n### Install and run\n\n```sh\ngit clone git@github.com:conventional-changelog/commitlint.git\ncd commitlint\nyarn\nyarn run build # run build tasks\nyarn start # run tests, again on change\nyarn run commitlint # run CLI\n```\n\nFor more information on how to contribute please take a look at our [contribution guide](./.github/CONTRIBUTING.md).\n\n[0]: https://img.shields.io/badge/stability-stable-green.svg?style=flat-square\n[1]: https://nodejs.org/api/documentation.html#documentation_stability_index\n[2]: https://img.shields.io/npm/v/@commitlint/cli.svg?style=flat-square\n[3]: https://npmjs.org/package/@commitlint/cli\n[4]: https://github.com/conventional-changelog/commitlint/actions/workflows/CI.yml/badge.svg\n[5]: https://github.com/conventional-changelog/commitlint/actions/workflows/CI.yml\n[8]: https://img.shields.io/badge/stability-experimental-orange.svg?style=flat-square\n[9]: https://nodejs.org/api/documentation.html#documentation_stability_index\n[10]: https://img.shields.io/npm/v/@commitlint/cli/next.svg?style=flat-square\n[13]: https://img.shields.io/node/v/@commitlint/cli.svg\n[14]: https://nodejs.org/en/about/previous-releases\n"
  },
  {
    "path": "compose.yaml",
    "content": "services:\n  commitlint:\n    build:\n      context: .\n      dockerfile: Dockerfile.dev\n    image: marionebl/commitlint-cubicle\n    ports:\n      - \"8443:8443\"\n    environment:\n      SSH_AUTH_SOCK: /.ssh-agent/socket\n      SSH_AUTH_PROXY_SOCK: /.ssh-agent/proxy-socket\n    volumes:\n      - .:/root/repo\n      - $SSH_AUTH_SOCK:/.ssh-agent/socket\n    command: code-server --no-auth /root/repo\n"
  },
  {
    "path": "docs/.nojekyll",
    "content": ""
  },
  {
    "path": "docs/.vitepress/config.ts",
    "content": "import { defineConfig } from \"vitepress\";\nimport { tabsMarkdownPlugin } from \"vitepress-plugin-tabs\";\n\n// https://vitepress.dev/reference/site-config\nexport default defineConfig({\n\ttitle: \"commitlint\",\n\tdescription: \"Lint commit messages\",\n\n\thead: [\n\t\t[\"link\", { rel: \"icon\", type: \"image/png\", href: \"/assets/icon.png\" }],\n\t],\n\n\tthemeConfig: {\n\t\t// https://vitepress.dev/reference/default-theme-config\n\t\teditLink: {\n\t\t\tpattern:\n\t\t\t\t\"https://github.com/conventional-changelog/commitlint/edit/master/docs/:path\",\n\t\t},\n\n\t\tlogo: \"/assets/icon.png\",\n\n\t\tnav: [\n\t\t\t{ text: \"Home\", link: \"/\" },\n\t\t\t{ text: \"Guides\", link: \"/guides/getting-started\" },\n\t\t\t{ text: \"Reference\", link: \"/reference/configuration\" },\n\t\t],\n\n\t\tsidebar: [\n\t\t\t{\n\t\t\t\ttext: \"Guides\",\n\t\t\t\tbase: \"/guides\",\n\t\t\t\titems: [\n\t\t\t\t\t{ text: \"Getting started\", link: \"/getting-started\" },\n\t\t\t\t\t{ text: \"Local setup\", link: \"/local-setup\" },\n\t\t\t\t\t{ text: \"CI setup\", link: \"/ci-setup\" },\n\t\t\t\t\t{ text: \"Use prompt\", link: \"/use-prompt\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: \"Reference\",\n\t\t\t\tbase: \"/reference\",\n\t\t\t\titems: [\n\t\t\t\t\t{ text: \"CLI\", link: \"/cli\" },\n\t\t\t\t\t{ text: \"Configuration\", link: \"/configuration\" },\n\t\t\t\t\t{ text: \"Rules configuration\", link: \"/rules-configuration\" },\n\t\t\t\t\t{ text: \"Rules\", link: \"/rules\" },\n\t\t\t\t\t{ text: \"Plugins\", link: \"/plugins\" },\n\t\t\t\t\t{ text: \"Prompt\", link: \"/prompt\" },\n\t\t\t\t\t{ text: \"Examples\", link: \"/examples\" },\n\t\t\t\t\t{ text: \"Community projects\", link: \"/community-projects\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: \"API\",\n\t\t\t\tbase: \"/api\",\n\t\t\t\tcollapsed: true,\n\t\t\t\titems: [\n\t\t\t\t\t{ text: \"@commitlint/load\", link: \"/load\" },\n\t\t\t\t\t{ text: \"@commitlint/read\", link: \"/read\" },\n\t\t\t\t\t{ text: \"@commitlint/lint\", link: \"/lint\" },\n\t\t\t\t\t{ text: \"@commitlint/format\", link: \"/format\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: \"Concepts\",\n\t\t\t\tbase: \"/concepts\",\n\t\t\t\tcollapsed: true,\n\t\t\t\titems: [\n\t\t\t\t\t{ text: \"Commit-conventions\", link: \"/commit-conventions\" },\n\t\t\t\t\t{ text: \"Shareable config\", link: \"/shareable-config\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: \"Support\",\n\t\t\t\tbase: \"/support\",\n\t\t\t\tcollapsed: true,\n\t\t\t\titems: [\n\t\t\t\t\t{ text: \"Troubleshooting\", link: \"/troubleshooting\" },\n\t\t\t\t\t{ text: \"Releases\", link: \"/releases\" },\n\t\t\t\t\t{ text: \"Upgrade commitlint\", link: \"/upgrade\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttext: \"Attributions\",\n\t\t\t\tlink: \"/attributions\",\n\t\t\t},\n\t\t],\n\n\t\tsocialLinks: [\n\t\t\t{\n\t\t\t\ticon: \"github\",\n\t\t\t\tlink: \"https://github.com/conventional-changelog/commitlint\",\n\t\t\t},\n\t\t],\n\n\t\tsearch: {\n\t\t\tprovider: \"local\",\n\t\t},\n\t},\n\n\tmarkdown: {\n\t\tconfig(md) {\n\t\t\tmd.use(tabsMarkdownPlugin);\n\t\t},\n\t},\n});\n"
  },
  {
    "path": "docs/.vitepress/theme/index.ts",
    "content": "// .vitepress/theme/index.ts\nimport type { Theme } from \"vitepress\";\nimport DefaultTheme from \"vitepress/theme\";\nimport { enhanceAppWithTabs } from \"vitepress-plugin-tabs/client\";\n\nexport default {\n\textends: DefaultTheme,\n\tenhanceApp({ app }) {\n\t\tenhanceAppWithTabs(app);\n\t},\n} satisfies Theme;\n"
  },
  {
    "path": "docs/CNAME",
    "content": "commitlint.js.org"
  },
  {
    "path": "docs/api/format.md",
    "content": "# @commitlint/format\n\nFormat commitlint reports\n\n## Install\n\n```sh\nnpm install --save @commitlint/format\n```\n\n## Signature\n\n```ts\ntype Problem = {\n  /*\n   * Level of the problem hint | warning | error\n   */\n  level: 0 | 1 | 2;\n  /*\n   * Name of the problem to annotate the message with\n   */\n  name: string;\n  /*\n   * Message to print\n   */\n  message: string;\n}\n\ntype Report = {\n  results: ReportResult[];\n}\n\ntype ReportResult = {\n  errors: Problem[];\n  warnings: Problem[];\n}\n\ntype formatOptions = {\n  /**\n   * Color the output\n   **/\n  color: boolean = true;\n\n  /**\n   * Signs to use as decoration for messages with severity 0, 1, 2\n   **/\n  signs: readonly [string; string; string] = [' ', '⚠', '✖'];\n\n  /**\n   * Colors to use for messages with severity 0, 1, 2\n   **/\n  colors: readonly [string; string; string] = ['white', 'yellow', 'red'];\n\n  /**\n   * Print summary and inputs for reports without problems\n   **/\n  verbose: boolean = false;\n\n  /**\n   * URL to print as help for reports with problems\n   **/\n  helpUrl: string;\n}\n\nformat(report?: Report = {}, options?: formatOptions = {}) => string[];\n```\n\n## Import\n\n```js\nimport format from \"@commitlint/format\";\n```\n\n## Examples\n\n### Empty usage (no error founds with colors)\n\n```js\nformat();\n/* => \n[ \n  '\\u001b[1m\\u001b[32m✔\\u001b[39m   found 0 problems, 0 warnings\\u001b[22m' \n] \n*/\n```\n\n### Without colors\n\n```js\nformat(\n  {\n    results: [\n      {\n        warnings: [\n          {\n            level: 0,\n            name: \"some-hint\",\n            message: \"This will not show up as it has level 0\",\n          },\n          {\n            level: 1,\n            name: \"some-warning\",\n            message: \"This will show up yellow as it has level 1\",\n          },\n        ],\n        errors: [\n          {\n            level: 2,\n            name: \"some-error\",\n            message: \"This will show up red as it has level 2\",\n          },\n        ],\n      },\n    ],\n  },\n  {\n    color: false,\n  },\n);\n/* => \n[\n  '✖   This will show up red as it has level 2 [some-error]',\n  '    This will not show up as it has level 0 [some-hint]',\n  '⚠   This will show up yellow as it has level 1 [some-warning]',\n  '✖   found 1 problems, 2 warnings'\n] \n*/\n```\n"
  },
  {
    "path": "docs/api/lint.md",
    "content": "# @commitlint/lint\n\nLint a string against commitlint rules\n\n## Install\n\n```sh\nnpm install --save @commitlint/lint\n```\n\n## Signature\n\n```ts\ntype RuleLevel = 0 | 1 | 2;\ntype RuleCondition = 'always' | 'never';\ntype RuleOption = any;\ntype PrimitiveRule = [RuleLevel, RuleCondition, RuleOption?];\ntype AsyncRule = Promise<PrimitiveRule>;\ntype FunctionRule = () => PrimitiveRule;\ntype AsyncFunctionRule = () => Promise<PrimitiveRule>;\ntype Rule = PrimitiveRule | FunctionRule | AsyncFunctionRule;\n\ntype Problem = {\n  level: number;\n  valid: boolean;\n  name: string;\n  message: string;\n}\n\ntype Report = {\n  valid: boolean;\n  errors: Problem[];\n  warnings: Problem[];\n}\n\ntype Options = {\n  parserOpts?: any;\n};\n\nlint(message: string, rules: {[ruleName: string]: Rule}, opts?: Options) => Promise<Report>;\n```\n\n## Basic Examples\n\n### Import\n\n```js\nimport lint from \"@commitlint/lint\";\n```\n\n### Usage without config\n\n```js\nconst report = await lint(\"foo: bar\");\nconsole.log(report);\n// => { valid: true, errors: [], warnings: [] }\n```\n\n### Usage with type-enum rules and valid message\n\n```js\nconst report = await lint(\"foo: bar\", { \"type-enum\": [1, \"always\", [\"foo\"]] });\nconsole.log(report);\n// => { valid: true, errors: [], warnings: [] }\n```\n\n### Usage with type-enum rules and invalid message\n\n```js\nconst report = await lint(\"foo: bar\", { \"type-enum\": [1, \"always\", [\"bar\"]] });\nconsole.log(report);\n/* => \n{ \n  valid: false,\n  errors: [],\n  warnings: [ \n    { \n      level: 1,\n      valid: false,\n      name: 'type-enum',\n      message: 'type must be one of [bar]' \n    } \n  ]\n}\n*/\n```\n\n### Usage with custom parser options\n\n```js\nconst opts = {\n  parserOpts: {\n    headerPattern: /^(\\w*)-(\\w*)/,\n    headerCorrespondence: [\"type\", \"scope\"],\n  },\n};\n\nconst report = await lint(\n  \"foo-bar\",\n  { \"type-enum\": [2, \"always\", [\"foo\"]] },\n  opts,\n);\nconsole.log(report);\n// => { valid: true, errors: [], warnings: [] }\n```\n\n## Load configuration\n\n```js\nimport load from \"@commitlint/load\";\nimport lint from \"@commitlint/lint\";\n\nconst CONFIG = {\n  extends: [\"@commitlint/config-conventional\"],\n};\n\nconst opts = await load(CONFIG);\nconst report = await lint(\n  \"foo: bar\",\n  opts.rules,\n  opts.parserPreset ? { parserOpts: opts.parserPreset.parserOpts } : {},\n);\nconsole.log(report);\n/* => \n{ \n  valid: false,\n  errors: [ \n    { \n      level: 2,\n      valid: false,\n      name: 'type-enum',\n      message: 'type must be one of [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test]' \n    } \n  ],\n  warnings: [] \n}\n*/\n```\n\n## Read git history\n\n```js\nimport lint from \"@commitlint/lint\";\nimport read from \"@commitlint/read\";\n\nconst RULES = {\n  \"type-enum\": [2, \"always\", [\"foo\"]],\n};\n\nconst commits = await read({ to: \"HEAD\", from: \"HEAD~2\" });\n\nconsole.info(commits.map((commit) => lint(commit, RULES)));\n```\n\n## Simplified last-commit checker\n\n```js\nimport load from \"@commitlint/load\";\nimport read from \"@commitlint/read\";\nimport lint from \"@commitlint/lint\";\n\nconst { rules, parserPreset } = load();\nconst [commit] = await read({ from: \"HEAD~1\" });\n\nconst report = await lint(\n  commit,\n  rules,\n  parserPreset ? { parserOpts: parserPreset.parserOpts } : {},\n);\n\nconsole.log(JSON.stringify(result.valid));\n```\n"
  },
  {
    "path": "docs/api/load.md",
    "content": "# @commitlint/load\n\nLoad shared commitlint configuration\n\n## Install\n\n```sh\nnpm install --save @commitlint/load\n```\n\n## Signature\n\n```ts\n/**\n * How to handle violation of rule\n * 0 - ignore\n * 1 - warn\n * 2 - throw\n */\ntype RuleLevel = 0 | 1 | 2;\n\n/*\n * Application of rule\n * always - positive\n * never - negative\n */\ntype RuleCondition = 'always' | 'never';\n\n/*\n * Additional, optional options to pass to rule\n */\ntype RuleOption = any;\n\n/**\n * Basic complete rule definition\n */\ntype PrimitiveRule = [RuleLevel, RuleCondition, RuleOption?];\n\n/*\n * Async rules are resolved during config lookup.\n * They can be used to set up linting rules based on e.g. the project fs\n */\ntype AsyncRule = Promise<PrimitiveRule>;\n\n/*\n * Function rules are executed during config lookup.\n * They can be used to set up linting rules based on e.g. the project fs\n */\ntype FunctionRule = () => PrimitiveRule;\n\n/*\n * Async function rules are executed and awaited during config lookup.\n * They can be used to set up linting rules based on e.g. the project fs\n */\ntype AsyncFunctionRule () => Promise<PrimitiveRule>;\n\n/*\n * Polymorphic rule struct\n */\ntype Rule = PrimitiveRule | FunctionRule | AsyncFunctionRule;\n\n/*\n * Parser preset for conventional commits\n */\ntype ParserPreset = {\n  name: string;\n  path: string;\n  opts: any;\n};\n\ntype Seed = {\n  /*\n   * ids resolvable from cwd or configuration file.\n   * Imported and merged into configuration\n   * with increasing precedence, with top level config taking the highest.\n   */\n  extends?: string[];\n  /*\n   * id resolvable from cwd or configuration file.\n   * Imported and expanded to {ParserPreset}.\n   * Top level parserPresets override presets in extended configuration.\n   */\n  parserPreset?: string;\n  /**\n   * Initial map of rules to check against\n   */\n  rules?: {[ruleName: string]: Rule};\n  /**\n   * URL to print as help for reports with problems\n   */\n  helpUrl?: string;\n};\n\ntype Config = {\n  /*\n   * Relatives path to all extended configurations.\n   */\n  extends: string[];\n  /*\n   * Expanded parser preset, if any\n   */\n  parserPreset?: ParserPreset;\n  /*\n   * Merged map of rules to check against\n   */\n  rules: {[ruleName: string]: Rule};\n  /**\n   * URL to print as help for reports with problems\n   */\n  helpUrl?: string;\n};\n\ntype LoadOptions = {\n  /*\n   * Path to the config file to load.\n   */\n  file?: string;\n  /*\n   * The cwd to use when loading config from file parameter.\n   */\n  cwd: string;\n};\n\nload(seed: Seed = {}, options?: LoadOptions = {cwd: process.cwd()}) => Promise<Config>;\n```\n\n## Import\n\n```js\nimport load from \"@commitlint/load\";\n```\n\n## Examples\n\n### Inline rules\n\n```js\nconst config = await load({\n  rules: {\n    \"body-leading-blank\": [2, \"always\"],\n  },\n});\nconsole.log(config);\n// => { extends: [], rules: { 'body-leading-blank': [ 2, 'always' ] } }\n```\n\n### Reference a file\n\n```js\nconst config = await load({ extends: [\"./package\"] });\nconsole.log(config);\n// => { extends: ['./package', './package-b'], rules: {} }\n```\n\n### Inline `parserPreset`\n\n```js\nconst config = await load({ parserPreset: \"./parser-preset.js\" });\nconsole.log(config);\n/* => \n{ \n  extends: [], \n  rules: {}, \n  parserPreset: {\n    name: './parser-preset.js', \n    path: './parser-preset.js', \n    opts: {}\n  }\n}\n*/\n```\n\n### Config file with with current working directory\n\n```js\nconst config = await load(\n  {},\n  { file: \".commitlintrc.yml\", cwd: process.cwd() },\n);\nconsole.log(config);\n/* => \n{ \n  extends: [], \n  rules: { \n    'body-leading-blank': [ 1, 'always' ] \n  },\n  formatter: '@commitlint/format', \n  plugins: {} \n}\n*/\n```\n"
  },
  {
    "path": "docs/api/read.md",
    "content": "# @commitlint/read\n\nRead commit messages from a specified range or disk\n\n## Install\n\n```sh\nnpm install --save @commitlint/read\n```\n\n## Signature\n\n```ts\ntype Range = {\n  /* Lower end of the commit range to read */\n  from: string;\n  /* Upper end of the commit range to read */\n  to: string;\n  /* Whether (boolean) to read from ./.git/COMMIT_EDITMSG or where to read from (string) */\n  edit?: boolean | string;\n};\n\nread(range: Range) => Promise<string[]>\n```\n\n## Import\n\n```js\nimport read from \"@commitlint/read\";\n```\n\n## Examples\n\nConsider to have a repository with two commits:\n\n1. Initial commit\n2. I did something\n\n### Using `edit: true`\n\n```js\nconst result = await read({ edit: true });\nconsole.info(result);\n// => ['I did something\\n\\n']\n```\n\n### Read last two commits\n\n```js\nconst result = await read({ from: \"HEAD~2\" });\nconsole.info(result);\n// => ['I did something\\n\\n', 'Initial commit\\n\\n']\n```\n\n### Read commits within a range\n\n```js\nconst result = await read({ from: \"HEAD~2\", to: \"HEAD~1\" });\nconsole.info(result);\n// => ['Initial commit\\n\\n']\n```\n\n### Read commit message from git gui file\n\n```js\nconst result = await read({ edit: \"./git/GITGUI_EDITMESSAGE\" });\nconsole.info(result);\n// => ['I did something via git gui\\n\\n']\n```\n"
  },
  {
    "path": "docs/attributions.md",
    "content": "# Attributions\n\n`commitlint` is possible because of the hard work of the folks of the `conventional-changelog` project\n\n---\n\nThanks [@markusoelhafen](https://github.com/markusoelhafen) for providing\nthe `commitlint` icon\n\n---\n\nHomepage SVG Demo generated with [svg-term-cli](https://github.com/marionebl/svg-term-cli)\n"
  },
  {
    "path": "docs/concepts/commit-conventions.md",
    "content": "# Concept: Commit conventions\n\n[Commit conventions](https://www.conventionalcommits.org/) allow your team to add more semantic meaning to your git history. This e.g. includes `type`, `scope` or `breaking changes`.\n\nWith this additional information tools can derive useful human-readable information for releases of your project. Some examples are\n\n- Automated, rich changelogs\n- Automatic version bumps\n- Filter for test harnesses to run\n\nThe most common commit conventions follow this pattern:\n\n```text\ntype(scope?): subject\nbody?\nfooter?\n```\n\n## Multiple scopes\n\nCommitlint supports multiple scopes. Segments may be separated using delimiters (default: `/`, `\\`, `,`).\n\nThe set of allowed delimiters can be customized via the [scope-delimiter-style](/reference/rules.html#scope-delimiter-style) rule.\n"
  },
  {
    "path": "docs/concepts/shareable-config.md",
    "content": "# Concept: Shareable configuration\n\nMost commonly shareable configuration is delivered as npm package exporting\nan object containing `.rules` as default. To use shared configuration you specify it as item in the `.extends` array:\n\n::: code-group\n\n```js [commitlint.config.js]\n/**\n * @type {import('@commitlint/types').UserConfig}\n */\nexport default {\n  extends: [\"example\"], // => commitlint-config-example\n};\n```\n\n:::\n\nThis causes `commitlint` to pick up `commitlint-config-example`.\nMake it available by installing it.\n\n```sh\nnpm install --save-dev commitlint-config-example\n```\n\nThe rules found in `commitlint-config-example` are merged with the rules in `commitlint.config.js`, if any.\n\nThis works recursively, enabling shareable configuration to extend on an indefinite chain of other shareable configurations.\n\n## Relative config\n\nYou can also load local configuration by using a relative path to the file.\n\n::: warning\nThis must always start with a `.` (dot).\n:::\n\n::: code-group\n\n```js [commitlint.config.js]\nexport default {\n  extends: [\"./example\"], // => ./example.js\n};\n```\n\n:::\n\n## Scoped packages\n\nWhen using scoped packages you have two options.\n\nYou can provide the full path of the package like:\n\n::: code-group\n\n```js [commitlint.config.js]\nexport default {\n  extends: [\"@commitlint/config-conventional\"], // => @commitlint/config-conventional\n};\n```\n\n:::\n\nOr just the scope/owner of the package.\n\n> [!TIP]\n> Just like \"normal\" extends listed above, this will add `<scope>/commitlint-config`.\n\n::: code-group\n\n```js [commitlint.config.js]\nexport default {\n  extends: [\"@coolcompany\"], // => @coolcompany/commitlint-config\n};\n```\n\n:::\n\nIf you don't use the exact `<scope>/commitlint-config` pattern, you have to provide the full name of the package.\n"
  },
  {
    "path": "docs/guides/ci-setup.md",
    "content": "# Guide: CI Setup\n\nEnforce commit conventions with confidence by linting on your CI servers with `commitlint`.\n\nThis guide assumes you have already configured `commitlint` for local usage.\n\nFollow the [Getting Started](/guides/getting-started) for basic installation and configuration instructions.\n\n## GitHub Actions\n\nAn example of how a GitHub Actions workflow could validate the last commit message or all commit messages inside a Pull Request:\n\n```yml\nname: CI\n\non: [push, pull_request]\n\npermissions:\n  contents: read\n\njobs:\n  commitlint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      - name: Setup node\n        uses: actions/setup-node@v4\n        with:\n          node-version: lts/*\n          cache: npm\n      - name: Install commitlint\n        run: npm install -D @commitlint/cli @commitlint/config-conventional\n      - name: Print versions\n        run: |\n          git --version\n          node --version\n          npm --version\n          npx commitlint --version\n\n      - name: Validate current commit (last commit) with commitlint\n        if: github.event_name == 'push'\n        run: npx commitlint --last --verbose\n\n      - name: Validate PR commits with commitlint\n        if: github.event_name == 'pull_request'\n        run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose\n```\n\n## Travis\n\n```bash\n# Install and configure if needed\nnpm install --save-dev @commitlint/travis-cli\n```\n\n```yml\n# travis.yml\nlanguage: node_js\nnode_js:\n  - node\nscript:\n  - commitlint-travis\n```\n\n## CircleCI\n\nIt's just a simple example of how CircleCI configuration file could look like to validate last commit message\n\n```yml\nversion: 2.1\n\nexecutors:\n  my-executor:\n    docker:\n      - image: cimg/node:current\n    working_directory: ~/project\n\njobs:\n  setup:\n    executor: my-executor\n    steps:\n      - checkout\n      - restore_cache:\n          key: lock-{{ checksum \"package-lock.json\" }}\n      - run:\n          name: Install dependencies\n          command: npm install\n      - save_cache:\n          key: lock-{{ checksum \"package-lock.json\" }}\n          paths:\n            - node_modules\n      - persist_to_workspace:\n          root: ~/project\n          paths:\n            - node_modules\n\n  lint_commit_message:\n    executor: my-executor\n    steps:\n      - checkout\n      - attach_workspace:\n          at: ~/project\n      - run:\n          name: Define environment variable with latest commit's message\n          command: |\n            echo 'export COMMIT_MESSAGE=$(git log -1 --pretty=format:\"%s\")' >> $BASH_ENV\n            source $BASH_ENV\n      - run:\n          name: Lint commit message\n          command: echo \"$COMMIT_MESSAGE\" | npx commitlint\n\nworkflows:\n  version: 2.1\n  commit:\n    jobs:\n      - setup\n      - lint_commit_message:\n          requires:\n            - setup\n```\n\n## GitLab CI\n\n```yaml\nlint:commit:\n  image: registry.hub.docker.com/library/node:alpine\n  variables:\n    GIT_DEPTH: 0\n  before_script:\n    - apk add --no-cache git\n    - npm install --save-dev @commitlint/config-conventional @commitlint/cli\n  script:\n    - npx commitlint --from ${CI_MERGE_REQUEST_DIFF_BASE_SHA} --to ${CI_COMMIT_SHA}\n```\n\nGitLab limits `git clone` depth to\n[20 commits by default](https://docs.gitlab.com/ee/ci/pipelines/settings.html#limit-the-number-of-changes-fetched-during-clone).\nSetting `GIT_DEPTH: 0` removes this limitation, so `commitlint` can check larger MRs.\n\n## GitLab CI with pre-build container\n\n```yaml\nstages: [\"lint\", \"build\", \"test\"]\nlint:commit:\n  image:\n    name: registry.hub.docker.com/commitlint/commitlint:latest\n    entrypoint: [\"\"]\n  stage: lint\n  script:\n    # Uncomment the next line if you are extending the @commitlint/config-nx-scopes in your commitlint configuration\n    #- npm i -g nx@$(node -pe \"require('./package.json').devDependencies.nx\")\n    - commitlint --from ${CI_MERGE_REQUEST_DIFF_BASE_SHA} --to ${CI_COMMIT_SHA}\n```\n\n## Jenkins X\n\n```yml\napiVersion: tekton.dev/v1beta1\nkind: PipelineRun\nmetadata:\n  name: pullrequest\nspec:\n  pipelineSpec:\n    tasks:\n      - name: conventional-commits\n        taskSpec:\n          steps:\n            - name: lint-commit-messages\n              image: commitlint/commitlint\n              script: |\n                #!/usr/bin/env sh\n                . .jx/variables.sh\n                commitlint --extends '@commitlint/config-conventional' --from $PR_BASE_SHA --to $PR_HEAD_SHA\n  serviceAccountName: tekton-bot\n  timeout: 15m\n```\n\n## BitBucket\n\nValidate commits within a PR by leveraging [BitBucket`s default variables](https://support.atlassian.com/bitbucket-cloud/docs/variables-and-secrets/):\n\n```yml\nimage: node:18\n\npipelines:\n  pull-requests:\n    default:\n      - step:\n        name: Lint commit messages\n        script:\n          - npm install --save-dev @commitlint/config-conventional @commitlint/cli\n          - npx commitlint --from $BITBUCKET_COMMIT~$(git rev-list --count $BITBUCKET_BRANCH ^origin/$BITBUCKET_PR_DESTINATION_BRANCH) --to $BITBUCKET_COMMIT --verbose\n```\n\nBitBucket limits git clone depth to 20 commits by default. You can change this behaviour by [changing the `clone` option](https://support.atlassian.com/bitbucket-cloud/docs/git-clone-behavior/).\n\n## Azure Pipelines\n\n```yml\nsteps:\n  - checkout: self\n    fetchDepth: 0\n\n  - task: NodeTool@0\n    inputs:\n      versionSpec: \"20.x\"\n      checkLatest: true\n\n  - script: |\n      git --version\n      node --version\n      npm --version\n      npx commitlint --version\n    displayName: Print versions\n\n  - script: |\n      npm install conventional-changelog-conventionalcommits\n      npm install commitlint@latest\n    displayName: Install commitlint\n\n  - script: npx commitlint --last --verbose\n    condition: ne(variables['Build.Reason'], 'PullRequest')\n    displayName: Validate current commit (last commit) with commitlint\n\n  - script: |\n      echo \"Accessing Azure DevOps API...\"\n\n      response=$(curl -s -X GET -H \"Cache-Control: no-cache\" -H \"Authorization: Bearer $(System.AccessToken)\" $(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.Name)/pullRequests/$(System.PullRequest.PullRequestId)/commits?api-version=6.0)\n      numberOfCommits=$(echo \"$response\" | jq -r '.count')\n\n      echo \"$numberOfCommits commits to check\"\n\n      npx commitlint --from $(System.PullRequest.SourceCommitId)~${numberOfCommits} --to $(System.PullRequest.SourceCommitId) --verbose\n    condition: eq(variables['Build.Reason'], 'PullRequest')\n    displayName: Validate PR commits with commitlint\n```\n\n### 3rd party integrations\n\n#### [Codemagic](https://codemagic.io/)\n\n```yaml\n#codemagic.yaml\nworkflows:\n  commitlint:\n    name: Lint commit message\n    scripts:\n      - npx commitlint --from=HEAD~1\n```\n\n> [!TIP]\n> Help yourself adopting a commit convention by using an interactive commit prompt.\n> Learn how to use `@commitlint/prompt-cli` in the [Use prompt guide](/guides/use-prompt).\n"
  },
  {
    "path": "docs/guides/getting-started.md",
    "content": "# Getting started\n\n## Install\n\nInstall `@commitlint/cli` and a `@commitlint/config-*` / `commitlint-config-*` of your choice as devDependency and configure `commitlint` to use it.\n\n::: code-group\n\n```sh [npm]\nnpm install -D @commitlint/cli @commitlint/config-conventional\n```\n\n```sh [yarn]\nyarn add -D @commitlint/cli @commitlint/config-conventional\n```\n\n```sh [pnpm]\npnpm add -D @commitlint/cli @commitlint/config-conventional\n```\n\n```sh [bun]\nbun add -d @commitlint/cli @commitlint/config-conventional\n```\n\n```sh [deno]\ndeno add -D npm:@commitlint/cli npm:@commitlint/config-conventional\n```\n\n:::\n\n## Configuration\n\nConfigure commitlint to use conventional config\n\n```sh\necho \"export default { extends: ['@commitlint/config-conventional'] };\" > commitlint.config.js\n```\n\n> [!WARNING]\n> 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:\n>\n> - Add a `package.json` file, declaring your project as an ES6 module. This can be done easily by running `npm init es6`.\n> - Rename the config file from `commitlint.config.js` to `commitlint.config.mjs`.\n\nRefer to [configuration documentation](/reference/configuration) for more information.\n"
  },
  {
    "path": "docs/guides/local-setup.md",
    "content": "# Guide: Local setup\n\nGet high commit message quality and short feedback cycles by linting commit messages right when they are authored.\n\nThis guide demonstrates how to achieve this via git hooks.\n\nFollow the [Getting Started](/guides/getting-started) for basic installation and configuration instructions.\n\n## Add hook\n\nTo use commitlint you need to setup `commit-msg` hook (currently `pre-commit` hook is not supported)\n\n### Using a git hooks manager\n\nTo lint commits before they are created you can use [Husky](https://typicode.github.io/husky/)'s `commit-msg` hook.\n\nYou can find complete setup instructions on the [official documentation](https://typicode.github.io/husky/get-started.html).\n\n> [!NOTE]\n> The following instructions are meant to `husky@v9` if you are using a different version\n> consult the official documentation of your version.\n\n> [!WARNING]\n> For Windows users: ensure all `husky` files are `UTF-8` enconded. If any other format is used an error may be thrown at runtime such as [cannot execute binary file](https://github.com/typicode/husky/issues/1426).\n\n---\n\n:::tabs\n== npm\n\n```sh\nnpm install --save-dev husky\n\n# husky@v9\nnpx husky init\n# husky@v8 or lower\nnpx husky install\n\n# Add commit message linting to commit-msg hook\necho \"npx --no -- commitlint --edit \\$1\" > .husky/commit-msg\n# Windows users should use ` to escape dollar signs\necho \"npx --no -- commitlint --edit `$1`\" > .husky/commit-msg\n```\n\nAs an alternative you can create a script inside `package.json`\n\n```sh\nnpm pkg set scripts.commitlint=\"commitlint --edit\"\necho \"npm run commitlint \\${1}\" > .husky/commit-msg\n```\n\n== yarn\n\n```sh\nyarn add --dev husky\n\n# husky@v9\nyarn husky init\n# husky@v8 or lower\nyarn husky install\n\n# Add commit message linting to commit-msg hook\necho \"yarn commitlint --edit \\$1\" > .husky/commit-msg\n# Windows users should use ` to escape dollar signs\necho \"yarn commitlint --edit `$1`\" > .husky/commit-msg\n```\n\nAs an alternative you can create a script inside `package.json`\n\n```sh\nnpm pkg set scripts.commitlint=\"commitlint --edit\"\necho \"yarn commitlint \\${1}\" > .husky/commit-msg\n```\n\n> [!WARNING]\n> Please note that currently @commitlint/cli doesn't support yarn v2 Plug'n'Play (using yarn > v2 with `nodeLinker: node-modules` in your .yarnrc.yml file may work sometimes)\n\n== pnpm\n\n```sh\npnpm add --save-dev husky\n\n# husky@v9\npnpm husky init\n# husky@v8 or lower\npnpm husky install\n\n# Add commit message linting to commit-msg hook\necho \"pnpm dlx commitlint --edit \\$1\" > .husky/commit-msg\n# Windows users should use ` to escape dollar signs\necho \"pnpm dlx commitlint --edit `$1`\" > .husky/commit-msg\n```\n\nAs an alternative you can create a script inside `package.json`\n\n```sh\nnpm pkg set scripts.commitlint=\"commitlint --edit\"\necho \"pnpm commitlint \\${1}\" > .husky/commit-msg\n```\n\n== bun\n\n```sh\nbun add --dev husky\n\n# husky@v9\nbunx husky init\n# husky@v8 or lower\nbunx husky install\n\n# Add commit message linting to commit-msg hook\necho \"bunx commitlint --edit \\$1\" > .husky/commit-msg\n# Windows users should use ` to escape dollar signs\necho \"bunx commitlint --edit `$1`\" > .husky/commit-msg\n```\n\n== deno\n\n```sh\ndeno add --dev husky\n\n# husky@v9\ndeno task --eval husky init\n# husky@v8 or lower\ndeno task --eval husky install\n\n# Add commit message linting to commit-msg hook\necho \"deno task --eval commitlint --edit \\$1\" > .husky/commit-msg\n# Windows users should use ` to escape dollar signs\necho \"deno task --eval commitlint --edit `$1`\" > .husky/commit-msg\n```\n\n:::\n\n---\n\n### Using git hooks\n\nInfo about git hooks can be found on [Git documentation](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks).\n\n> [!WARNING]\n> It's necessary that you use **commit-msg** as the name for hook file.\n\n## Test\n\n### Test simple usage\n\nFor a first simple usage test of commitlint you can do the following:\n\n::: code-group\n\n```sh [npm]\nnpx commitlint --from HEAD~1 --to HEAD --verbose\n```\n\n```sh [yarn]\nyarn commitlint --from HEAD~1 --to HEAD --verbose\n```\n\n```sh [pnpm]\npnpm commitlint --from HEAD~1 --to HEAD --verbose\n```\n\n```sh [bun]\nbun commitlint --from HEAD~1 --to HEAD --verbose\n```\n\n```sh [deno]\ndeno task --eval commitlint --from HEAD~1 --to HEAD --verbose\n```\n\n:::\n\nThis will check your last commit and return an error if invalid or a positive output if valid.\n\n### Test the hook\n\nYou can test the hook by simply committing. You should see something like this if everything works.\n\n```bash\ngit commit -m \"foo: this will fail\"\n#  husky > commit-msg\nNo staged files match any of provided globs.\n⧗   input: foo: this will fail\n✖   type must be one of [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test] [type-enum]\n\n✖   found 1 problems, 0 warnings\nⓘ   Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint\n\nhusky - commit-msg script failed (code 1)\n```\n\nSince [v8.0.0](https://github.com/conventional-changelog/commitlint/releases/tag/v8.0.0) `commitlint` won't output anything if there are no problems with your commit.\\\n(You can use the `--verbose` flag to get positive output)\n\n```bash\ngit commit -m \"chore: lint on commitmsg\"\n# husky > pre-commit\nNo staged files match any of provided globs.\n# husky > commit-msg\n```\n\nLocal 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).\n"
  },
  {
    "path": "docs/guides/use-prompt.md",
    "content": "# Guide: Use prompt\n\n> [!WARNING]\n> Prompt is currently unmaintained  \n> Some things might not work as expected\n\n`@commitlint/prompt-cli` helps with fast authoring of commit messages and ensures they adhere to the commit convention configured in `commitlint.config.js`.\n\n## Install\n\n1. Create a git repository if needed\n\n   ```sh\n   git init\n   ```\n\n2. Create a package.json if needed\n\n   ::: code-group\n\n   ```sh [npm]\n   npm init\n   ```\n\n   ```sh [yarn]\n   yarn init\n   ```\n\n   ```sh [pnpm]\n   pnpm init\n   ```\n\n   ```sh [bun]\n   bun init\n   ```\n\n   :::\n\n3. Install and configure if needed\n\n   ::: code-group\n\n   ```sh [npm]\n   npm install --save-dev @commitlint/cli @commitlint/config-conventional @commitlint/prompt-cli\n\n   echo \"export default { extends: ['@commitlint/config-conventional'] };\" > commitlint.config.js\n   ```\n\n   ```sh [yarn]\n   yarn add --dev @commitlint/cli @commitlint/config-conventional @commitlint/prompt-cli\n\n   echo \"export default { extends: ['@commitlint/config-conventional'] };\" > commitlint.config.js\n   ```\n\n   ```sh [pnpm]\n   pnpm add --save-dev @commitlint/cli @commitlint/config-conventional @commitlint/prompt-cli\n\n   echo \"export default { extends: ['@commitlint/config-conventional'] };\" > commitlint.config.js\n   ```\n\n   ```sh [bun]\n   bun add --dev @commitlint/cli @commitlint/config-conventional @commitlint/prompt-cli\n\n   echo \"export default { extends: ['@commitlint/config-conventional'] };\" > commitlint.config.js\n   ```\n\n   ```sh [deno]\n   deno add --dev npm:@commitlint/cli npm:@commitlint/config-conventional npm:@commitlint/prompt-cli\n\n   echo \"export default { extends: ['@commitlint/config-conventional'] };\" > commitlint.config.js\n   ```\n\n   :::\n\n## Provide a shortcut\n\nTo make prompt-cli easy to use, add a npm run-script to your `package.json`\n\n```json:line-numbers {3}\n{\n  \"scripts\": {\n    \"commit\": \"commit\"\n  }\n}\n```\n\nTest the prompt by executing\n\n::: code-group\n\n```sh [npm]\ngit add .\nnpm run commit\n```\n\n```sh [yarn]\ngit add .\nyarn commit\n```\n\n```sh [pnpm]\ngit add .\npnpm commit\n```\n\n```sh [bun]\ngit add .\nbun commit\n```\n\n```sh [deno]\ngit add .\ndeno task commit\n```\n\n:::\n\n# An alternative to `@commitlint/prompt-cli`: commitizen\n\nAnother way to author commit messages that adhere to the commit convention configured in `commitlint.config.js` is to use `commitizen`.\nFor more information, checkout their [official website](http://commitizen.github.io/cz-cli/).\n\ncommitlint provides two adapters for `commitizen`:\n\n1. `@commitlint/prompt` provides a way to interact same as `@commitlint/prompt-cli`\n2. `@commitlint/cz-commitlint` is inspired by [cz-conventional-changelog](https://github.com/commitizen/cz-conventional-changelog), it provides a more modern way to interact.\n"
  },
  {
    "path": "docs/index.md",
    "content": "---\n# https://vitepress.dev/reference/default-theme-home-page\nlayout: home\n\nhero:\n  name: commitlint\n  text: Lint commit messages\n  tagline: helps your team adhere to a commit convention\n  image:\n    src: ./assets/commitlint.svg\n    alt: commitlint on CLI\n  actions:\n    - theme: brand\n      text: Guides\n      link: /guides/getting-started\n\n    - theme: alt\n      text: Reference\n      link: /reference/configuration\n\n    - theme: alt\n      text: Concepts\n      link: /concepts/commit-conventions\n\nfeatures:\n  - title: Shareable configs\n    details: By supporting npm-installed configurations it makes sharing of commit conventions easy.\n    icon: 🌏\n    link: /concepts/shareable-config\n    linkText: Learn more\n\n  - title: Easy setup\n    details: Get high commit message quality and short feedback cycles by linting commit messages right when they are authored.\n    icon: 🚀\n    link: /guides/getting-started\n    linkText: Getting started\n\n  - title: Easy to integrate with your CI\n    details: To get the most out of commitlint you'll want to automate it in your project lifecycle.\n    icon: ⚙️\n    link: /guides/ci-setup\n    linkText: Learn more\n---\n"
  },
  {
    "path": "docs/public/assets/commitlint.json",
    "content": "{\n  \"version\": 1,\n  \"width\": 80,\n  \"height\": 20,\n  \"duration\": 45.306863,\n  \"command\": null,\n  \"title\": null,\n  \"env\": {\n    \"TERM\": \"ansi\",\n    \"SHELL\": \"/usr/local/bin/fish\"\n  },\n  \"stdout\": [\n    [\n      0.043582,\n      \"\\u001b[1m\\u001b[30m⏎\\u001b[0;10m                                                                              \\r⏎ \\r\\u001b[2K\\u001b[34m~/Projects/labs/commitlint\\u001b[30m\\u001b[0;10m \\u001b[90mmaster*\\u001b[30m\\u001b[0;10m\\t\\u001b[36m\\u001b[30m\\u001b[0;10m\\r\\n\\u001b[32m❯\\u001b[30m\\u001b[0;10m \\u001b[K\"\n    ],\n    [1.424417, \"e\"],\n    [0.000242, \"\\u001b[D\\u001b[31m\\u001b[1me\\u001b[0;10m\"],\n    [0.007262, \"\\u001b[33masy_install \\u001b[12D\\u001b[30m\\u001b[0;10m\"],\n    [0.088508, \"\\u001b[31m\\u001b[1mc\\u001b[0;10m\\u001b[K\"],\n    [0.005534, \"\\u001b[33mho \\u001b[3D\\u001b[30m\\u001b[0;10m\"],\n    [\n      0.074302,\n      \"\\u001b[31m\\u001b[1mh\\u001b[0;10m\\u001b[33mo \\u001b[D\\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.080006,\n      \"\\u001b[31m\\u001b[1mo\\u001b[0;10m\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000271,\n      \"\\u001b[4D\\u001b[35mecho\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.175855, \"\\u001b[35m \\u001b[30m\\u001b[0;10m\"],\n    [0.00018, \"\\u001b[D \"],\n    [0.159886, \"\\\"\"],\n    [0.000155, \"\\u001b[D\\u001b[31m\\u001b[1m\\\"\\u001b[0;10m\"],\n    [0.519818, \"\\u001b[31m\\u001b[1mf\\u001b[0;10m\"],\n    [0.080105, \"\\u001b[31m\\u001b[1mo\\u001b[0;10m\"],\n    [0.159857, \"\\u001b[31m\\u001b[1mo\\u001b[0;10m\"],\n    [0.176008, \"\\u001b[31m\\u001b[1m\\\"\\u001b[0;10m\"],\n    [0.000288, \"\\u001b[5D\\u001b[33m\\\"foo\\\"\\u001b[30m\\u001b[0;10m\"],\n    [0.503731, \"\\u001b[33m \\u001b[30m\\u001b[0;10m\"],\n    [0.000264, \"\\u001b[D \"],\n    [0.287853, \"|\"],\n    [0.000198, \"\\u001b[D\\u001b[32m|\\u001b[30m\\u001b[0;10m\"],\n    [0.239819, \"\\u001b[32m \\u001b[30m\\u001b[0;10m\"],\n    [0.000253, \"\\u001b[D \"],\n    [1.35986, \"c\"],\n    [0.000264, \"\\u001b[D\\u001b[31m\\u001b[1mc\\u001b[0;10m\"],\n    [0.011992, \"\\u001b[33m++ \\u001b[3D\\u001b[30m\\u001b[0;10m\"],\n    [0.059653, \"\\u001b[31m\\u001b[1mo\\u001b[0;10m\\u001b[K\"],\n    [0.007052, \"\\u001b[33mde \\u001b[3D\\u001b[30m\\u001b[0;10m\"],\n    [0.072258, \"\\u001b[31m\\u001b[1mm\\u001b[0;10m\\u001b[K\"],\n    [0.005423, \"\\u001b[33mm \\u001b[D\\u001b[D\\u001b[30m\\u001b[0;10m\"],\n    [\n      0.107004,\n      \"\\u001b[31m\\u001b[1mm\\u001b[0;10m\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000313,\n      \"\\u001b[4D\\u001b[35mcomm\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.175907, \"\\u001b[35mi\\u001b[30m\\u001b[0;10m\"],\n    [0.000305, \"\\u001b[5D\\u001b[31m\\u001b[1mcommi\\u001b[0;10m\"],\n    [0.005943, \"\\u001b[33mtizen \\u001b[6D\\u001b[30m\\u001b[0;10m\"],\n    [\n      0.073589,\n      \"\\u001b[31m\\u001b[1mt\\u001b[0;10m\\u001b[33mizen \\u001b[5D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.120186, \"\\u001b[31m\\u001b[1ml\\u001b[0;10m\\u001b[K\"],\n    [0.005786, \"\\u001b[33mint \\u001b[4D\\u001b[30m\\u001b[0;10m\"],\n    [\n      0.20203,\n      \"\\u001b[31m\\u001b[1mi\\u001b[0;10m\\u001b[33mnt \\u001b[3D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.072158,\n      \"\\u001b[31m\\u001b[1mn\\u001b[0;10m\\u001b[33mt \\u001b[D\\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.072029,\n      \"\\u001b[31m\\u001b[1mt\\u001b[0;10m\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000346,\n      \"\\u001b[10D\\u001b[35mcommitlint\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.182852, \"\\u001b[K\\r\\n\"],\n    [5.5e-5, \"\\u001b[30m\\u001b[0;10m\"],\n    [1.177726, \"\\u001b[90m⧗\\u001b[39m   input: \\u001b[1mfoo\\u001b[22m\\r\\n\"],\n    [\n      0.000414,\n      \"\\u001b[31m✖\\u001b[39m   message may not be empty \\u001b[90m[subject-empty]\\u001b[39m\\r\\n\\u001b[31m✖\\u001b[39m   type may not be empty \\u001b[90m[type-empty]\\u001b[39m\\r\\n\\u001b[1m\\u001b[31m✖\\u001b[39m   found 2 problems, 0 warnings\\u001b[22m\\r\\n\"\n    ],\n    [\n      0.058677,\n      \"\\u001b[1m\\u001b[30m⏎\\u001b[0;10m                                                                              \\r⏎ \\r\\u001b[2K\"\n    ],\n    [\n      8.1e-5,\n      \"\\r\\n\\u001b[34m~/Projects/labs/commitlint\\u001b[30m\\u001b[0;10m \\u001b[33m\\u001b[30m\\u001b[0;10m\\u001b[90mmaster*\\u001b[30m\\u001b[0;10m\\t\\u001b[36m\\u001b[30m\\u001b[0;10m\\r\\n\\u001b[31m❯\\u001b[30m\\u001b[0;10m \\u001b[K\"\n    ],\n    [1.780014, \"e\"],\n    [0.000274, \"\\u001b[D\\u001b[31m\\u001b[1me\\u001b[0;10m\"],\n    [\n      0.000377,\n      \"\\u001b[33mcho \\\"foo\\\" | commitlint\\u001b[22D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.075909,\n      \"\\u001b[31m\\u001b[1mc\\u001b[0;10m\\u001b[33mho \\\"foo\\\" | commitlint\\u001b[21D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.083511,\n      \"\\u001b[31m\\u001b[1mh\\u001b[0;10m\\u001b[33mo \\\"foo\\\" | commitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.08804,\n      \"\\u001b[31m\\u001b[1mo\\u001b[0;10m\\u001b[33m \\\"foo\\\" | commitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000371,\n      \"\\u001b[4D\\u001b[35mecho\\u001b[33m \\\"foo\\\" | commitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.207623,\n      \"\\u001b[35m \\u001b[33m\\\"foo\\\" | commitlint\\u001b[18D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000332,\n      \"\\u001b[D \\u001b[33m\\\"foo\\\" | commitlint\\u001b[18D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.167635,\n      \"\\\"\\u001b[33mfoo\\\" | commitlint\\u001b[17D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000345,\n      \"\\u001b[D\\u001b[31m\\u001b[1m\\\"\\u001b[0;10m\\u001b[33mfoo\\\" | commitlint\\u001b[17D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [1.439497, \"\\u001b[31m\\u001b[1mo\\u001b[0;10m\\u001b[K\"],\n    [0.495237, \"\\u001b[D\\u001b[K\"],\n    [0.136897, \"\\u001b[31m\\u001b[1mc\\u001b[0;10m\"],\n    [\n      0.000689,\n      \"\\u001b[33mommitlint.config.js\\\" \\u001b[21D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.56659, \"\\u001b[D\\u001b[K\"],\n    [0.097083, \"\\u001b[31m\\u001b[1mf\\u001b[0;10m\"],\n    [0.0004, \"\\u001b[33moo\\\" | commitlint\\u001b[16D\\u001b[30m\\u001b[0;10m\"],\n    [\n      0.127229,\n      \"\\u001b[31m\\u001b[1mo\\u001b[0;10m\\u001b[33mo\\\" | commitlint\\u001b[15D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.13611,\n      \"\\u001b[31m\\u001b[1mo\\u001b[0;10m\\u001b[33m\\\" | commitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.312225, \"\\u001b[31m\\u001b[1m:\\u001b[0;10m\\u001b[K\"],\n    [0.000715, \"\\u001b[33m@commitlint/\\u001b[12D\\u001b[30m\\u001b[0;10m\"],\n    [0.26294, \"\\u001b[31m\\u001b[1m \\u001b[0;10m\\u001b[K\"],\n    [0.272129, \"\\u001b[31m\\u001b[1mb\\u001b[0;10m\"],\n    [0.088036, \"\\u001b[31m\\u001b[1ma\\u001b[0;10m\"],\n    [0.079995, \"\\u001b[31m\\u001b[1mr\\u001b[0;10m\"],\n    [0.35253, \"\\u001b[31m\\u001b[1m\\\"\\u001b[0;10m\"],\n    [0.000435, \"\\u001b[10D\\u001b[33m\\\"foo: bar\\\"\\u001b[30m\\u001b[0;10m\"],\n    [0.327106, \"\\u001b[33m \\u001b[30m\\u001b[0;10m\"],\n    [0.000283, \"\\u001b[D \"],\n    [0.31973, \"|\"],\n    [0.000223, \"\\u001b[D\\u001b[32m|\\u001b[30m\\u001b[0;10m\"],\n    [0.263799, \"\\u001b[32m \\u001b[30m\\u001b[0;10m\"],\n    [0.000219, \"\\u001b[D \"],\n    [0.415723, \"c\"],\n    [0.000306, \"\\u001b[D\\u001b[31m\\u001b[1mc\\u001b[0;10m\"],\n    [0.011346, \"\\u001b[33m++ \\u001b[3D\\u001b[30m\\u001b[0;10m\"],\n    [0.052215, \"\\u001b[31m\\u001b[1mo\\u001b[0;10m\\u001b[K\"],\n    [0.006604, \"\\u001b[33mde \\u001b[3D\\u001b[30m\\u001b[0;10m\"],\n    [0.065406, \"\\u001b[31m\\u001b[1mm\\u001b[0;10m\\u001b[K\"],\n    [0.005895, \"\\u001b[33mm \\u001b[D\\u001b[D\\u001b[30m\\u001b[0;10m\"],\n    [\n      0.17011,\n      \"\\u001b[31m\\u001b[1mm\\u001b[0;10m\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000278,\n      \"\\u001b[4D\\u001b[35mcomm\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.439713, \"\\u001b[35mi\\u001b[30m\\u001b[0;10m\"],\n    [0.000324, \"\\u001b[5D\\u001b[31m\\u001b[1mcommi\\u001b[0;10m\"],\n    [0.005334, \"\\u001b[33mtizen \\u001b[6D\\u001b[30m\\u001b[0;10m\"],\n    [\n      0.114637,\n      \"\\u001b[31m\\u001b[1mt\\u001b[0;10m\\u001b[33mizen \\u001b[5D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.120005, \"\\u001b[31m\\u001b[1ml\\u001b[0;10m\\u001b[K\"],\n    [0.005761, \"\\u001b[33mint \\u001b[4D\\u001b[30m\\u001b[0;10m\"],\n    [\n      0.16208,\n      \"\\u001b[31m\\u001b[1mi\\u001b[0;10m\\u001b[33mnt \\u001b[3D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.072044,\n      \"\\u001b[31m\\u001b[1mn\\u001b[0;10m\\u001b[33mt \\u001b[D\\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.048114,\n      \"\\u001b[31m\\u001b[1mt\\u001b[0;10m\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000335,\n      \"\\u001b[10D\\u001b[35mcommitlint\\u001b[33m \\u001b[D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.686938, \"\\u001b[K\\r\\n\\u001b[30m\\u001b[0;10m\"],\n    [\n      1.179442,\n      \"\\u001b[90m⧗\\u001b[39m   input: \\u001b[1mfoo: bar\\u001b[22m\\r\\n\"\n    ],\n    [\n      0.000581,\n      \"\\u001b[31m✖\\u001b[39m   type must be one of [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test] \\u001b[90m[type-enum]\\u001b[39m\\r\\n\\u001b[1m\\u001b[31m✖\\u001b[39m   found 1 problems, 0 warnings\\u001b[22m\\r\\n\"\n    ],\n    [\n      0.058213,\n      \"\\u001b[1m\\u001b[30m⏎\\u001b[0;10m                                                                              \\r⏎ \\r\\u001b[2K\"\n    ],\n    [\n      3.9e-5,\n      \"\\r\\n\\u001b[34m~/Projects/labs/commitlint\\u001b[30m\\u001b[0;10m \\u001b[33m\\u001b[30m\\u001b[0;10m\\u001b[90mmaster*\\u001b[30m\\u001b[0;10m\\t\\u001b[36m\\u001b[30m\\u001b[0;10m\\r\\n\\u001b[31m❯\\u001b[30m\\u001b[0;10m \\u001b[K\"\n    ],\n    [0.45916, \"echo \\\"foo: bar\\\" | commitlint\"],\n    [\n      0.000339,\n      \"\\u001b[28D\\u001b[35mecho\\u001b[30m\\u001b[0;10m \\u001b[33m\\\"foo: bar\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.246219, \"\\u001b[D\"],\n    [0.502613, \"\\u001b[D\"],\n    [0.088524, \"\\u001b[D\"],\n    [0.087414, \"\\u001b[D\"],\n    [0.088208, \"\\u001b[D\"],\n    [0.083942, \"\\u001b[D\"],\n    [0.083394, \"\\u001b[D\"],\n    [0.08431, \"\\u001b[D\"],\n    [0.088025, \"\\u001b[D\"],\n    [0.088327, \"\\u001b[D\"],\n    [0.087976, \"\\u001b[D\"],\n    [0.084932, \"\\u001b[D\"],\n    [0.083834, \"\\u001b[D\"],\n    [0.086017, \"\\u001b[D\"],\n    [0.088395, \"\\u001b[D\"],\n    [0.088266, \"\\u001b[D\"],\n    [0.087041, \"\\u001b[D\"],\n    [0.083235, \"\\u001b[D\"],\n    [0.219576, \"\\u001b[D\"],\n    [\n      0.527938,\n      \"\\u001b[D\\u001b[33m: bar\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[19D\"\n    ],\n    [\n      0.000198,\n      \"\\u001b[6C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.151916,\n      \"\\u001b[D\\u001b[33m: bar\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[19D\"\n    ],\n    [\n      0.000217,\n      \"\\u001b[6C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.127879,\n      \"\\u001b[D\\u001b[33m: bar\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[19D\"\n    ],\n    [\n      0.000301,\n      \"\\u001b[6C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      1.16062,\n      \"\\u001b[33mc: bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000627,\n      \"\\u001b[5C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.111309,\n      \"\\u001b[33mh: bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000672,\n      \"\\u001b[5C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.047358,\n      \"\\u001b[33mo: bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000622,\n      \"\\u001b[5C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.079423,\n      \"\\u001b[33mr: bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000618,\n      \"\\u001b[5C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.095361,\n      \"\\u001b[33me: bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000619,\n      \"\\u001b[5C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.135183,\n      \"\\u001b[33m(: bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000448,\n      \"\\u001b[5C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.111682,\n      \"\\u001b[33m): bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000667,\n      \"\\u001b[5C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[19D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.382519, \"\\u001b[D\"],\n    [\n      0.128976,\n      \"\\u001b[33ms): bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000623,\n      \"\\u001b[6C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.103675,\n      \"\\u001b[33mc): bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000624,\n      \"\\u001b[6C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.57513,\n      \"\\u001b[33mo): bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.00063,\n      \"\\u001b[6C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.143259,\n      \"\\u001b[33mp): bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000654,\n      \"\\u001b[6C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.119324,\n      \"\\u001b[33me): bar\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.00047,\n      \"\\u001b[6C\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[20D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.174646, \"\\u001b[C\"],\n    [0.160014, \"\\u001b[C\"],\n    [0.144159, \"\\u001b[C\"],\n    [0.151878, \"\\u001b[C\"],\n    [0.15203, \"\\u001b[C\"],\n    [0.751957, \"\\u001b[C\"],\n    [\n      0.296238,\n      \"\\u001b[D\\u001b[33m\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[14D\"\n    ],\n    [\n      0.000209,\n      \"\\u001b[C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.13563,\n      \"\\u001b[D\\u001b[33m\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[14D\"\n    ],\n    [\n      0.000246,\n      \"\\u001b[C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.119832,\n      \"\\u001b[D\\u001b[33m\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[14D\"\n    ],\n    [\n      0.000235,\n      \"\\u001b[C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.280499,\n      \"\\u001b[33mm\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000626,\n      \"\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.111295,\n      \"\\u001b[33me\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.00062,\n      \"\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.263602,\n      \"\\u001b[33ms\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000539,\n      \"\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.143222,\n      \"\\u001b[33ms\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000648,\n      \"\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.063561,\n      \"\\u001b[33ma\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000549,\n      \"\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.127469,\n      \"\\u001b[33mg\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000641,\n      \"\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.190361, \"\\u001b[14C\\r\\n\\u001b[30m\\u001b[0;10m\"],\n    [\n      1.170189,\n      \"\\u001b[90m⧗\\u001b[39m   input: \\u001b[1mchore(scope): messag\\u001b[22m\\r\\n\"\n    ],\n    [\n      0.00037,\n      \"\\u001b[31m✖\\u001b[39m   scope must be one of [cli, commitlint-config-angular, commitlint-config-lerna-scopes, commitlint-config-patternplate, config-angular, config-lerna-scopes, config-patternplate, core, example-prompt, prompt-cli, prompt, utils] \\u001b[90m[scope-enum]\\u001b[39m\\r\\n\\u001b[1m\\u001b[31m✖\\u001b[39m   found 1 problems, 0 warnings\\u001b[22m\\r\\n\"\n    ],\n    [\n      0.059556,\n      \"\\u001b[1m\\u001b[30m⏎\\u001b[0;10m                                                                              \\r⏎ \\r\\u001b[2K\"\n    ],\n    [\n      0.000104,\n      \"\\r\\n\\u001b[34m~/Projects/labs/commitlint\\u001b[30m\\u001b[0;10m \\u001b[33m\\u001b[30m\\u001b[0;10m\\u001b[90mmaster*\\u001b[30m\\u001b[0;10m\\t\\u001b[36m\\u001b[30m\\u001b[0;10m\\r\\n\\u001b[31m❯\\u001b[30m\\u001b[0;10m \\u001b[K\"\n    ],\n    [1.595015, \"echo \\\"chore(scope): messag\\\" | commitlint\"],\n    [\n      0.00045,\n      \"\\u001b[40D\\u001b[35mecho\\u001b[30m\\u001b[0;10m \\u001b[33m\\\"chore(scope): messag\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.41445, \"\\u001b[D\"],\n    [0.503174, \"\\u001b[D\"],\n    [0.08644, \"\\u001b[D\"],\n    [0.08346, \"\\u001b[D\"],\n    [0.087163, \"\\u001b[D\"],\n    [0.084405, \"\\u001b[D\"],\n    [0.085425, \"\\u001b[D\"],\n    [0.084549, \"\\u001b[D\"],\n    [0.083284, \"\\u001b[D\"],\n    [0.083372, \"\\u001b[D\"],\n    [0.083362, \"\\u001b[D\"],\n    [0.083392, \"\\u001b[D\"],\n    [0.088245, \"\\u001b[D\"],\n    [0.085091, \"\\u001b[D\"],\n    [0.084852, \"\\u001b[D\"],\n    [0.087872, \"\\u001b[D\"],\n    [0.087465, \"\\u001b[D\"],\n    [0.083365, \"\\u001b[D\"],\n    [0.088288, \"\\u001b[D\"],\n    [0.088374, \"\\u001b[D\"],\n    [0.086046, \"\\u001b[D\"],\n    [0.656623, \"\\u001b[D\"],\n    [0.711983, \"\\u001b[D\"],\n    [\n      0.42408,\n      \"\\u001b[D\\u001b[33m): messag\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[23D\"\n    ],\n    [\n      0.000222,\n      \"\\u001b[10C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[23D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.311938,\n      \"\\u001b[D\\u001b[33m): messag\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[23D\"\n    ],\n    [\n      0.000212,\n      \"\\u001b[10C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[23D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.175793,\n      \"\\u001b[D\\u001b[33m): messag\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[23D\"\n    ],\n    [\n      0.000219,\n      \"\\u001b[10C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[23D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.183789,\n      \"\\u001b[D\\u001b[33m): messag\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[23D\"\n    ],\n    [\n      0.000222,\n      \"\\u001b[10C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[23D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.255718,\n      \"\\u001b[D\\u001b[33m): messag\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[23D\"\n    ],\n    [\n      0.000218,\n      \"\\u001b[10C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[23D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [1.495663, \"\\u001b[C\"],\n    [\n      0.320133,\n      \"\\u001b[D\\u001b[33m: messag\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[22D\"\n    ],\n    [\n      0.000218,\n      \"\\u001b[9C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[22D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.151649,\n      \"\\u001b[D\\u001b[33m: messag\\\" \\u001b[30m\\u001b[0;10m|\\u001b[32m \\u001b[30m\\u001b[0;10mc\\u001b[35mommitlint\\u001b[30m\\u001b[0;10m\\u001b[K\\u001b[22D\"\n    ],\n    [\n      0.000219,\n      \"\\u001b[9C \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[22D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.327953, \"\\u001b[C\"],\n    [0.184011, \"\\u001b[C\"],\n    [0.167976, \"\\u001b[C\"],\n    [0.143875, \"\\u001b[C\"],\n    [0.159963, \"\\u001b[C\"],\n    [0.151488, \"\\u001b[C\"],\n    [0.160789, \"\\u001b[C\"],\n    [0.151846, \"\\u001b[C\"],\n    [\n      0.184798,\n      \"\\u001b[33me\\u001b[30m\\u001b[0;10m\\\"\\u001b[32m \\u001b[30m\\u001b[0;10m|\\u001b[35m commitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [\n      0.000621,\n      \"\\u001b[33m\\\"\\u001b[30m\\u001b[0;10m \\u001b[32m|\\u001b[30m\\u001b[0;10m \\u001b[35mcommitlint\\u001b[14D\\u001b[30m\\u001b[0;10m\"\n    ],\n    [0.566558, \"\\u001b[14C\\r\\n\\u001b[30m\\u001b[0;10m\"],\n    [\n      1.174173,\n      \"\\u001b[90m⧗\\u001b[39m   input: \\u001b[1mchore: message\\u001b[22m\\r\\n\"\n    ],\n    [\n      0.000452,\n      \"\\u001b[1m\\u001b[32m✔\\u001b[39m   found 0 problems, 0 warnings\\u001b[22m\\r\\n\"\n    ],\n    [8.4e-5, \"\\r\\n\"],\n    [\n      0.048998,\n      \"\\u001b[1m\\u001b[30m⏎\\u001b[0;10m                                                                              \\r⏎ \\r\\u001b[2K\"\n    ],\n    [\n      3.4e-5,\n      \"\\r\\n\\u001b[34m~/Projects/labs/commitlint\\u001b[30m\\u001b[0;10m \\u001b[90mmaster*\\u001b[30m\\u001b[0;10m\\t\\u001b[36m\\u001b[30m\\u001b[0;10m\\r\\n\\u001b[32m❯\\u001b[30m\\u001b[0;10m \\u001b[K\"\n    ],\n    [2.345267, \"\\r\\n\\u001b[30m\\u001b[0;10m\\u001b[30m\\u001b[0;1\"],\n    [8.2e-5, \"0m\"]\n  ]\n}\n"
  },
  {
    "path": "docs/reference/cli.md",
    "content": "<script setup>\n  import packageJson from \"../../@commitlint/cli/package.json\"\n  const commitlintVersion = packageJson.version\n</script>\n\n# CLI\n\n```sh-vue\n❯ npx commitlint --help\n\n@commitlint/cli@{{ commitlintVersion }} - Lint your commit messages\n\n[input] reads from stdin if --edit, --env, --from and --to are omitted\n\nOptions:\n  -c, --color          toggle colored output           [boolean] [default: true]\n  -g, --config         path to the config file; result code 9 if config is\n                       missing                                          [string]\n      --print-config   print resolved config\n                                          [string] [choices: \"\", \"text\", \"json\"]\n  -d, --cwd            directory to execute in\n                                         [string] [default: (Working Directory)]\n  -e, --edit           read last commit message from the specified file or\n                       fallbacks to ./.git/COMMIT_EDITMSG               [string]\n  -E, --env            check message in the file at path given by environment\n                       variable value                                   [string]\n  -x, --extends        array of shareable configurations to extend       [array]\n  -H, --help-url       help url in error message                        [string]\n  -f, --from           lower end of the commit range to lint; applies if\n                       edit=false                                       [string]\n      --from-last-tag  uses the last tag as the lower end of the commit range to\n                       lint; applies if edit=false and from is not set [boolean]\n      --git-log-args   additional git log arguments as space separated string,\n                       example '--first-parent --cherry-pick'           [string]\n  -l, --last           just analyze the last commit; applies if edit=false\n                                                                       [boolean]\n  -o, --format         output format of the results                     [string]\n  -p, --parser-preset  configuration preset to use for\n                       conventional-commits-parser                      [string]\n  -q, --quiet          toggle console output          [boolean] [default: false]\n  -t, --to             upper end of the commit range to lint; applies if\n                       edit=false                                       [string]\n  -V, --verbose        enable verbose output for reports without problems\n                                                                       [boolean]\n  -s, --strict         enable strict mode; result code 2 for warnings, 3 for\n                       errors                                          [boolean]\n      --options        path to a JSON file or Common.js module containing CLI\n                       options\n  -v, --version        display version information                     [boolean]\n  -h, --help           Show help                                       [boolean]\n```\n"
  },
  {
    "path": "docs/reference/community-projects.md",
    "content": "# Projects from the community\n\n## Remark\n\n?> These projects are not affiliated with us in any way.\n\nBefore you use any of these projects make sure you know what you are doing. If you find anything weird about a project let us know.\n\nIf you want to add a project to this list [open a pull request](https://github.com/conventional-changelog/commitlint/pulls).\n\n## List of Projects\n\n- [Gitmoji Commit Workflow](https://github.com/arvinxx/gitmoji-commit-workflow)\n- [commitlint.io](https://github.com/tomasen/commitlintio) - helps your project to ensure nice and tidy commit messages without needing any download or installation\n- [commitlint plugin function rules](https://github.com/vidavidorra/commitlint-plugin-function-rules) - use functions as rule value to create rules based on commit messages, with regular expressions and more\n- [commitlint-plugin-selective-scope](https://github.com/ridvanaltun/commitlint-plugin-selective-scope) - limit scopes per type with regular expressions and plain text\n- [commitlint-gitlab-ci](https://gitlab.com/dmoonfire/commitlint-gitlab-ci/) - a small wrapper around `commitlint` for working with the quirks of Gitlab's CI without failing jobs\n- [committier](https://github.com/iamyoki/committier) - fix and format commit messages\n"
  },
  {
    "path": "docs/reference/configuration.md",
    "content": "# Configuration\n\n## Config via file\n\n`@commitlint/cli` picks up configuration from the following files:\n\n- `.commitlintrc`\n- `.commitlintrc.json`\n- `.commitlintrc.yaml`\n- `.commitlintrc.yml`\n- `.commitlintrc.js`\n- `.commitlintrc.cjs`\n- `.commitlintrc.mjs`\n- `.commitlintrc.ts`\n- `.commitlintrc.cts`\n- `.commitlintrc.mts`\n- `commitlint.config.js`\n- `commitlint.config.cjs`\n- `commitlint.config.mjs`\n- `commitlint.config.ts`\n- `commitlint.config.cts`\n- `commitlint.config.mts`\n\nThe file is expected\n\n- to contain valid JavaScript / TypeScript\n- export a configuration object\n- adhere to the schema outlined below\n\nConfiguration files are resolved using [cosmiconfig](https://github.com/cosmiconfig/cosmiconfig).\n\n## Config via `package.json`\n\nYou can add a `commitlint` field in `package.json` (or [`package.yaml`](https://github.com/pnpm/pnpm/pull/1799)) with an object that follows the below structure.\n\n## Config option CLI\n\nAdd the path to the configuration file. Example: `commitlint --config commitlint.config.js`\n\n## Configuration object example\n\n```js\nconst Configuration = {\n  /*\n   * Resolve and load @commitlint/config-conventional from node_modules.\n   * Referenced packages must be installed\n   */\n  extends: [\"@commitlint/config-conventional\"],\n  /*\n   * Resolve and load conventional-changelog-atom from node_modules.\n   * Referenced packages must be installed\n   */\n  parserPreset: \"conventional-changelog-atom\",\n  /*\n   * Resolve and load @commitlint/format from node_modules.\n   * Referenced package must be installed\n   */\n  formatter: \"@commitlint/format\",\n  /*\n   * Any rules defined here will override rules from @commitlint/config-conventional\n   */\n  rules: {\n    \"type-enum\": [2, \"always\", [\"foo\"]],\n  },\n  /*\n   * Array of functions that return true if commitlint should ignore the given message.\n   * Given array is merged with predefined functions, which consist of matchers like:\n   *\n   * - 'Merge pull request', 'Merge X into Y' or 'Merge branch X'\n   * - 'Revert X'\n   * - 'v1.2.3' (ie semver matcher)\n   * - 'Automatic merge X' or 'Auto-merged X into Y'\n   *\n   * To see full list, check https://github.com/conventional-changelog/commitlint/blob/master/%40commitlint/is-ignored/src/defaults.ts.\n   * To disable those ignores and run rules always, set `defaultIgnores: false` as shown below.\n   */\n  ignores: [(commit) => commit === \"\"],\n  /*\n   * Whether commitlint uses the default ignore rules, see the description above.\n   */\n  defaultIgnores: true,\n  /*\n   * Custom URL to show upon failure\n   */\n  helpUrl:\n    \"https://github.com/conventional-changelog/commitlint/#what-is-commitlint\",\n  /*\n   * Custom prompt configs\n   */\n  prompt: {\n    messages: {},\n    questions: {\n      type: {\n        description: \"please input type:\",\n      },\n    },\n  },\n};\n\nexport default Configuration;\n```\n\n> [!NOTE]\n> CJS format is supported as well:\n>\n> ```js\n> module.exports = Configuration;\n> ```\n\n### TypeScript configuration\n\nConfiguration can also be a TypeScript file.\n\nRelevant types and enums can be imported from `@commitlint/types`.\n\nBelow you can see main changes from a standard js file:\n\n```ts\nimport type { UserConfig } from \"@commitlint/types\"; // [!code focus]\nimport { RuleConfigSeverity } from \"@commitlint/types\"; // [!code focus]\n\nconst Configuration: UserConfig = {\n  // [!code focus]\n  extends: [\"@commitlint/config-conventional\"],\n  parserPreset: \"conventional-changelog-atom\",\n  formatter: \"@commitlint/format\",\n  rules: {\n    \"type-enum\": [RuleConfigSeverity.Error, \"always\", [\"foo\"]], // [!code focus]\n  },\n  // ...\n};\n\nexport default Configuration;\n```\n\n## Shareable configuration\n\nEvery commitlint configuration can extend other commitlint configurations.\nSpecify configurations to extend via the `.extends` key, using ids\nthat can be resolved by the node resolve algorithm.\n\nThis means installed npm packages and local files can be used.\n\n:::tabs\n== npm\n\n```sh\nnpm install --save-dev commitlint-config-lerna @commitlint/config-conventional\n```\n\n::: code-group\n\n```js [commitlint.config.js]\nexport default {\n  extends: [\n    'lerna' // prefixed with commitlint-config-*,\n    '@commitlint/config-conventional' // scoped packages are not prefixed\n  ]\n}\n```\n\n== local\n\n::: code-group\n\n```js [commitlint.config.js]\nexport default {\n  extends: [\"./commitlint.base.js\", \"./commitlint.types.js\"],\n};\n```\n\n```js [commitlint.types.js]\n// will be picked up by commitlint.config.js\nexport default {\n  rules: {\n    \"type-enum\": [2, \"always\", [\"foo\"]],\n  },\n};\n```\n\n```js [commitlint.base.js]\n// will be picked up by commitlint.config.js\nexport default {\n  extends: [\"@commitlint/config-conventional\"], // extends can be nested\n  parserPreset: \"conventional-changelog-atom\",\n};\n```\n\n:::\n\nMore information can be found in the [Concepts – shareable config section](/concepts/shareable-config).\n\n## Parser presets\n\nThe parser preset used to parse commit messages can be configured.\nUse ids resolvable by the node resolve algorithm.\n\nThis means installed npm packages and local files can be used.\n\n:::tabs\n== npm\n\n```sh\nnpm install --save-dev conventional-changelog-atom\n```\n\n::: code-group\n\n```js [commitlint.config.js]\nexport default {\n  parserPreset: \"conventional-changelog-atom\",\n};\n```\n\n== local\n\n::: code-group\n\n```js [commitlint.config.js]\nexport default {\n  parserPreset: \"./parser-preset\",\n};\n```\n\n```js [parser-preset.js]\nexport default {\n  parserOpts: {\n    headerPattern: /^(\\w*)\\((\\w*)\\)-(\\w*)\\s(.*)$/,\n    headerCorrespondence: [\"type\", \"scope\", \"ticket\", \"subject\"],\n  },\n};\n```\n\n:::\n\n## Formatter\n\nCommitlint can output the issues encountered in different formats, if necessary.\nUse ids resolvable by the node resolve algorithm.\n\n```js\nexport default {\n  formatter: \"@commitlint/format\",\n};\n```\n\n## Rules\n\nRefer to [Rules](/reference/rules.md) for a complete list of available rules.\n\n## Prompt\n\nConfig command-line submit interaction, works with `@commitlint/cz-commitlint`.\n\nRefer to [Prompt Config](/reference/prompt.md) for details.\n"
  },
  {
    "path": "docs/reference/examples.md",
    "content": "# Examples\n\nThese examples show common usages of how commitlint can be configured.\n\n## Validate for issue/ticket numbers\n\n::: code-group\n\n```jsonc [package.json]\n{\n  // ...\n  \"commitlint\": {\n    \"rules\": {\n      \"references-empty\": [2, \"never\"],\n    },\n    \"parserPreset\": {\n      \"parserOpts\": {\n        \"issuePrefixes\": [\"PROJ-\"],\n      },\n    },\n  },\n  // ...\n}\n```\n\n:::\n\n## Customizing Emojis and Alignment in VS Code\n\nSome 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.\n\n![cz-commitlint questions](/assets/vs-code-emoji.png)\n\nTo fix this issue in VS Code, you can specify an additional space after each emoji in your `commitlint.config.ts` file.\n\n::: code-group\n\n```ts [commitlint.config.ts]\nimport { type UserConfig } from \"@commitlint/types\";\n\nexport default {\n  // Use the conventional commit rules as a base.\n  extends: [\"@commitlint/config-conventional\"],\n  prompt: {\n    questions: {\n      type: {\n        enum: {\n          // Add a space to a few common types for better alignment.\n          build: {\n            emoji: \"🛠️ \", // The extra space fixes the alignment.\n          },\n          chore: {\n            emoji: \"♻️ \",\n          },\n          ci: {\n            emoji: \"⚙️ \",\n          },\n          revert: {\n            emoji: \"🗑️ \",\n          },\n        },\n      },\n    },\n  },\n} satisfies UserConfig;\n```\n\n:::\n\n## Include Emojis in Commit Messages\n\nBy 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.\n\nThis configuration is based on the conventional commit rules and uses a _parser preset_ to validate commit headers that start with an emoji.\n\n::: code-group\n\n```ts [commitlint.config.ts]\nimport type { ParserPreset, UserConfig } from \"@commitlint/types\";\nimport config from \"@commitlint/config-conventional\";\nimport createPreset from \"conventional-changelog-conventionalcommits\";\nimport { merge } from \"lodash-es\";\n\n// A helper function to create the custom emoji parser preset.\nasync function createEmojiParser(): Promise<ParserPreset> {\n  // Generates the regex from the emojis defined in the conventional config.\n  const emojiRegexPart = Object.values(config.prompt.questions.type.enum)\n    .map((value) => value.emoji.trim())\n    .join(\"|\");\n\n  const parserOpts = {\n    // This regular expression validates commit headers with an emoji.\n    breakingHeaderPattern: new RegExp(\n      `^(?:${emojiRegexPart})\\\\s+(\\\\w*)(?:\\\\((.*)\\\\))?!:\\\\s+(.*)$`,\n    ),\n    headerPattern: new RegExp(\n      `^(?:${emojiRegexPart})\\\\s+(\\\\w*)(?:\\\\((.*)\\\\))?!?:\\\\s+(.*)$`,\n    ),\n  };\n\n  const emojiParser = merge({}, await createPreset(), {\n    conventionalChangelog: { parserOpts },\n    parserOpts,\n    recommendedBumpOpts: { parserOpts },\n  });\n\n  return emojiParser;\n}\n\nconst emojiParser = await createEmojiParser();\n\nexport default {\n  extends: [\"@commitlint/config-conventional\"],\n  parserPreset: emojiParser,\n  prompt: {\n    questions: {\n      type: {\n        enum: {\n          // Customize emojis and add the extra space for better alignment.\n          build: { emoji: \"🛠️ \" },\n          chore: { emoji: \"♻️ \" },\n          ci: { emoji: \"⚙️ \" },\n          revert: { emoji: \"🗑️ \" },\n        },\n        // This setting includes the emoji in the final commit header.\n        headerWithEmoji: true,\n      },\n    },\n  },\n} satisfies UserConfig;\n```\n\n:::\n\nAlthough some emojis may appear without a trailing space in the terminal, the commit message itself is submitted with the correct formatting.\n\n![cz-commitlint questions](/assets/vs-code-commit-msg.png)\n\nYou can verify this with `git log -4 --format=%B > commits.txt`.\n\n:::code-group\n\n```text [commits.txt]\n⚙️ ci(scope): short\n\n🛠 build(scope): short\n\n🐛 fix(scope): short\n\n✨ feat(scope): short\n```\n\n:::\n"
  },
  {
    "path": "docs/reference/plugins.md",
    "content": "# Working with Plugins\n\nOur plugin implementation is based off of [eslint's plugin implementation](https://github.com/eslint/eslint/blob/5018378131fd5190bbccca902c0cf4276ee1581a/lib/config/plugins.js);\nEach plugin is an npm module with a name in the format of `commitlint-plugin-<plugin-name>`, such as `commitlint-plugin-jquery`. You can also use scoped packages in the format of `@<scope>/commitlint-plugin-<plugin-name>` such as `@jquery/commitlint-plugin-jquery`.\n\n## Rules in Plugins\n\nPlugins can expose additional rules for use in commitlint. To do so, the plugin must export a `rules` object containing a key-value mapping of rule ID to rule. The rule ID does not have to follow any naming convention (so it can just be `dollar-sign`, for instance).\n\n```js\nexport default {\n  rules: {\n    \"dollar-sign\": function (parsed, when, value) {\n      // rule implementation ...\n    },\n  },\n};\n```\n\nTo use the rule in commitlint, you would use the unprefixed plugin name, followed by a slash, followed by the rule name. So if this plugin were named `commitlint-plugin-myplugin`, then in your configuration you'd refer to the rule by the name `myplugin/dollar-sign`. Example: `\"rules\": {\"myplugin/dollar-sign\": 2}`.\n\n## Peer Dependency\n\nTo make clear that the plugin requires commitlint to work correctly you have to declare commitlint as a `peerDependency` in your `package.json`.\nThe plugin support was introduced in commitlint version `7.6.0`. Ensure the `peerDependency` points to @commitlint `7.6.0` or later.\n\n```json\n{\n  \"peerDependencies\": {\n    \"@commitlint/lint\": \">=7.6.0\"\n  }\n}\n```\n\n## Share Plugins\n\nIn order to make your plugin available to the community you have to publish it on npm.\n\nRecommended keywords:\n\n- `commitlint`\n- `commitlintplugin`\n\nAdd these keywords into your `package.json` file to make it easy for others to find.\n\n## Local Plugins\n\nIn case you want to develop your plugins locally without the need to publish to `npm`, you can send declare your plugins inside your project locally. Please be aware that you can declare **only one** local plugin.\n\n### Usage Example\n\n::: code-group\n\n```js [commitlint.config.js]\nexport default {\n  rules: {\n    \"hello-world-rule\": [2, \"always\"],\n  },\n  plugins: [\n    {\n      rules: {\n        \"hello-world-rule\": ({ subject }) => {\n          const HELLO_WORLD = \"Hello World\";\n          return [\n            subject.includes(HELLO_WORLD),\n            `Your subject should contain ${HELLO_WORLD} message`,\n          ];\n        },\n      },\n    },\n  ],\n};\n```\n\n:::\n\n```bash\n> echo \"feat: random subject\" | commitlint # fails\n> echo \"feat: Hello World\" | commitlint # passes\n```\n\n## Further Reading\n\n- [npm Developer Guide](https://docs.npmjs.com/misc/developers)\n"
  },
  {
    "path": "docs/reference/prompt.md",
    "content": "# Prompt\n\nPrompt Config is used by `@commitlint/cz-commitlint`.\n\nThere are three fields: `settings`, `messages` and `questions`\n\n## `settings`\n\nSet optional options.\n\n- `enableMultipleScopes`: `(boolean)` Enable multiple scopes, select scope with a radio list, disabled by default.\n- `scopeEnumSeparator`: `(string)` Commitlint supports [multiple scopes](/concepts/commit-conventions#multiple-scopes), you can specify the delimiter. It is applied when `enableMultipleScopes` set true.\n- `useExclamationMark`: `(boolean)` Append `!` after the type/scope in the commit header when a breaking change is indicated, disabled by default.\n\n## `messages`\n\nSet hint contents, you can configure it to support localization.\n\n- `skip`: The field can be skipped by pressing enter\n- `max`: Maximum number of characters\n- `min`: Minimum number of characters\n- `emptyWarning`: The field cannot be empty\n- `upperLimitWarning`: The character limit is exceeded\n- `lowerLimitWarning`: The characters are less than lower limit\n\n## `questions`\n\nSpecify the interactive steps, Steps can only be configured in\n\n- `header`\n- `type`\n- `scope`\n- `subject`\n- `body`\n- `footer`\n- `isBreaking`\n- `breaking`\n- `breakingBody`\n- `isIssueAffected`\n- `issues`\n- `issuesBody`\n\n![cz-commitlint questions](/assets/cz-commitlint.png)\n\n```js\nexport default {\n  parserPreset: 'conventional-changelog-conventionalcommits',\n  rules: {\n    ...\n  },\n  prompt: {\n    settings: {},\n    messages: {\n      skip: ':skip',\n      max: 'upper %d chars',\n      min: '%d chars at least',\n      emptyWarning: 'can not be empty',\n      upperLimitWarning: 'over limit',\n      lowerLimitWarning: 'below limit'\n    },\n    questions: {\n      type: {\n        description: \"Select the type of change that you're committing:\",\n        enum: {\n          feat: {\n            description: 'A new feature',\n            title: 'Features',\n            emoji: '✨',\n          },\n          fix: {\n            description: 'A bug fix',\n            title: 'Bug Fixes',\n            emoji: '🐛',\n          },\n          docs: {\n            description: 'Documentation only changes',\n            title: 'Documentation',\n            emoji: '📚',\n          },\n          style: {\n            description: 'Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)',\n            title: 'Styles',\n            emoji: '💎',\n          },\n          refactor: {\n            description: 'A code change that neither fixes a bug nor adds a feature',\n            title: 'Code Refactoring',\n            emoji: '📦',\n          },\n          perf: {\n            description: 'A code change that improves performance',\n            title: 'Performance Improvements',\n            emoji: '🚀',\n          },\n          test: {\n            description: 'Adding missing tests or correcting existing tests',\n            title: 'Tests',\n            emoji: '🚨',\n          },\n          build: {\n            description: 'Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)',\n            title: 'Builds',\n            emoji: '🛠',\n          },\n          ci: {\n            description: 'Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)',\n            title: 'Continuous Integrations',\n            emoji: '⚙️',\n          },\n          chore: {\n            description: \"Other changes that don't modify src or test files\",\n            title: 'Chores',\n            emoji: '♻️',\n          },\n          revert: {\n            description: 'Reverts a previous commit',\n            title: 'Reverts',\n            emoji: '🗑',\n          },\n        },\n      },\n      scope: {\n        description:\n          'What is the scope of this change (e.g. component or file name)',\n      },\n      subject: {\n        description: 'Write a short, imperative tense description of the change',\n      },\n      body: {\n        description: 'Provide a longer description of the change',\n      },\n      isBreaking: {\n        description: 'Are there any breaking changes?',\n      },\n      breakingBody: {\n        description:\n          'A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself',\n      },\n      breaking: {\n        description: 'Describe the breaking changes',\n      },\n      isIssueAffected: {\n        description: 'Does this change affect any open issues?',\n      },\n      issuesBody: {\n        description:\n          'If issues are closed, the commit requires a body. Please enter a longer description of the commit itself',\n      },\n      issues: {\n        description: 'Add issue references (e.g. \"fix #123\", \"re #123\".)',\n      },\n    },\n  }\n};\n```\n"
  },
  {
    "path": "docs/reference/rules-configuration.md",
    "content": "# Rules configuration\n\nRules are made up by a name and a configuration array. The configuration array contains:\n\n- **Level** `[0..2]`: `0` disables the rule. For `1` it will be considered a warning for `2` an error.\n- **Applicable** `always|never`: `never` inverts the rule.\n- **Value**: value to use for this rule.\n\nRule configurations are either of type `array` residing on a key with the rule's name as key on the rules `object` or of type function returning type `array` or `Promise<array>`. This means all of the following notations are supported.\n\n## Plain array\n\n:::code-group\n\n```js [commitlint.config.js]\nexport default {\n  // ...\n  rules: {\n    \"header-max-length\": [0, \"always\", 72], // [!code focus]\n  },\n  // ...\n};\n```\n\n:::\n\n## Function returning array\n\n:::code-group\n\n```js [commitlint.config.js]\nexport default {\n  // ...\n  rules: {\n    \"header-max-length\": () => [0, \"always\", 72], // [!code focus]\n  },\n  // ...\n};\n```\n\n:::\n\n## Async function returning array\n\n:::code-group\n\n```js [commitlint.config.js]\nexport default {\n  // ...\n  rules: {\n    \"header-max-length\": async () => [0, \"always\", 72], // [!code focus]\n  },\n  // ...\n};\n```\n\n:::\n"
  },
  {
    "path": "docs/reference/rules.md",
    "content": "# Rules\n\n## body-case\n\n- **condition**: `body` is in case `value`\n- **rule**: `always`\n- **value**\n\n  ```text\n  'lower-case'\n  ```\n\n- **possible values**\n\n  ```js\n  [\n    \"lower-case\", // default\n    \"upper-case\", // UPPERCASE\n    \"camel-case\", // camelCase\n    \"kebab-case\", // kebab-case\n    \"pascal-case\", // PascalCase\n    \"sentence-case\", // Sentence case\n    \"snake-case\", // snake_case\n    \"start-case\", // Start Case\n  ];\n  ```\n\n## body-empty\n\n- **condition**: `body` is empty\n- **rule**: `never`\n\n## body-full-stop\n\n- **condition**: `body` ends with `value`\n- **rule**: `never`\n- **value**\n\n  ```text\n  '.'\n  ```\n\n## body-leading-blank\n\n- **condition**: `body` begins with blank line\n- **rule**: `always`\n\n## body-max-length\n\n- **condition**: `body` has `value` or less characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  Infinity\n  ```\n\n## body-max-line-length\n\n- **condition**: `body` lines have `value` or less characters, or contain a URL\n- **rule**: `always`\n- **value**\n\n  ```text\n  Infinity\n  ```\n\n## body-min-length\n\n- **condition**: `body` has `value` or more characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  0\n  ```\n\n## breaking-change-exclamation-mark\n\n- **condition**: Either both or neither `header` has an exclamation mark before the `:` marker\n  and a line in `footer` matches the regular expression `^BREAKING[ -]CHANGE:`\n- **rule**: `always`\n\n> [!NOTE]\n>\n> This rule enforces that breaking changes are marked by both a `!` in the header\n> and `BREAKING CHANGE` in the footer. The behavior is that of an XNOR operation:\n>\n> - It passes when either both are present or both are not.\n> - It fails when one is present and the other is not.\n\n## footer-empty\n\n- **condition**: `footer` is empty\n- **rule**: `never`\n\n## footer-leading-blank\n\n- **condition**: `footer` begins with blank line\n- **rule**: `always`\n\n## footer-max-length\n\n- **condition**: `footer` has `value` or less characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  Infinity\n  ```\n\n## footer-max-line-length\n\n- **condition**: `footer` lines have `value` or less characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  Infinity\n  ```\n\n## footer-min-length\n\n- **condition**: `footer` has `value` or more characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  0\n  ```\n\n## header-case\n\n- **condition**: `header` is in case `value`\n- **rule**: `always`\n- **value**\n\n  ```text\n  'lower-case'\n  ```\n\n- **possible values**\n\n  ```js\n  [\n    \"lower-case\", // default\n    \"upper-case\", // UPPERCASE\n    \"camel-case\", // camelCase\n    \"kebab-case\", // kebab-case\n    \"pascal-case\", // PascalCase\n    \"sentence-case\", // Sentence case\n    \"snake-case\", // snake_case\n    \"start-case\", // Start Case\n  ];\n  ```\n\n## header-full-stop\n\n- **condition**: `header` ends with `value`\n- **rule**: `never`\n- **value**\n\n  ```text\n  '.'\n  ```\n\n## header-max-length\n\n- **condition**: `header` has `value` or less characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  72\n  ```\n\n## header-min-length\n\n- **condition**: `header` has `value` or more characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  0\n  ```\n\n## header-trim\n\n- **condition**: `header` must not have initial or trailing whitespaces\n- **rule**: `always`\n\n## references-empty\n\n- **condition**: `references` has at least one entry\n- **rule**: `never`\n\n## scope-case\n\n- **condition**: `scope` is in case `value`\n- **rule**: `always`\n- **value**\n\n  ```text\n  'lower-case'\n  ```\n\n- **possible values**\n\n  ```js\n  [\n    \"lower-case\", // default\n    \"upper-case\", // UPPERCASE\n    \"camel-case\", // camelCase\n    \"kebab-case\", // kebab-case\n    \"pascal-case\", // PascalCase\n    \"sentence-case\", // Sentence case\n    \"snake-case\", // snake_case\n    \"start-case\", // Start Case\n  ];\n  ```\n\n- extended value (object based)\n\n  ```js\n  {\n    cases: [\"kebab-case\"],\n    delimiters: [\"/\"]\n  }\n  ```\n\n  - `cases` — list of allowed case formats\n  - `delimiters` — optional list of delimiter strings used to split multi-segment scopes (default: `[\"/\", \"\\\", \",\"]`)\n\n## scope-delimiter-style\n\n- **condition**: all delimiters found in `scope` must match `value`\n- **rule**: `always`\n- **value**\n\n  ```text\n    [\"/\", \"\\\", \",\"]\n  ```\n\n> [!NOTE]\n>\n> - When using this rule together with [scope-enum](#scope-enum) or [scope-case](#scope-case), make sure to provide the same `delimiters` configuration in those rules as well. Otherwise scope parsing may become inconsistent.\n\n## scope-empty\n\n- **condition**: `scope` is empty\n- **rule**: `never`\n\n## scope-enum\n\n- **condition**: `scope` is found in value\n- **rule**: `always`\n- **value**\n\n  ```text\n  []\n  ```\n\n- extended value (object based)\n\n  ```js\n  {\n    scopes: [\"foo\", \"bar\"],\n    delimiters: [\"/\"]\n  }\n  ```\n\n  - `scopes` — list of allowed scope values\n  - `delimiters` — optional list of delimiter strings used to split multi-segment scopes (default: `[\"/\", \"\\\", \",\"]`)\n\n> [!NOTE]\n>\n> - This rule always passes if no scopes are provided in the message or the value > is an empty array.\n> - When set to `always`, all message scopes must be found in the value.\n> - When set to `never`, none of the message scopes can be found in the value.\n\n## scope-max-length\n\n- **condition**: `scope` has `value` or less characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  Infinity\n  ```\n\n## scope-min-length\n\n- **condition**: `scope` has `value` or more characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  0\n  ```\n\n## signed-off-by\n\n- **condition**: `message` has `value`\n- **rule**: `always`\n- **value**\n\n  ```text\n  'Signed-off-by:'\n  ```\n\n## subject-case\n\n- **condition**: `subject` is in case `value`\n- **rule**: `always`\n- **value**\n\n  ```js\n  [\"sentence-case\", \"start-case\", \"pascal-case\", \"upper-case\"];\n  ```\n\n- **possible values**\n\n  ```js\n  [\n    \"lower-case\", // lower case\n    \"upper-case\", // UPPERCASE\n    \"camel-case\", // camelCase\n    \"kebab-case\", // kebab-case\n    \"pascal-case\", // PascalCase\n    \"sentence-case\", // Sentence case\n    \"snake-case\", // snake_case\n    \"start-case\", // Start Case\n  ];\n  ```\n\n## subject-empty\n\n- **condition**: `subject` is empty\n- **rule**: `never`\n\n## subject-exclamation-mark\n\n- **condition**: `subject` has exclamation before the `:` marker\n- **rule**: `never`\n\n## subject-full-stop\n\n- **condition**: `subject` ends with `value`\n- **rule**: `never`\n- **value**\n\n  ```text\n  '.'\n  ```\n\n## subject-max-length\n\n- **condition**: `subject` has `value` or less characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  Infinity\n  ```\n\n## subject-min-length\n\n- **condition**: `subject` has `value` or more characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  0\n  ```\n\n## trailer-exists\n\n- **condition**: `message` has trailer `value`\n- **rule**: `always`\n- **value**\n\n  ```text\n  'Signed-off-by:'\n  ```\n\n## type-case\n\n- **description**: `type` is in case `value`\n- **rule**: `always`\n- **value**\n\n  ```text\n  'lower-case'\n  ```\n\n- **possible values**\n\n  ```js\n  [\n    \"lower-case\", // default\n    \"upper-case\", // UPPERCASE\n    \"camel-case\", // camelCase\n    \"kebab-case\", // kebab-case\n    \"pascal-case\", // PascalCase\n    \"sentence-case\", // Sentence case\n    \"snake-case\", // snake_case\n    \"start-case\", // Start Case\n  ];\n  ```\n\n## type-empty\n\n- **condition**: `type` is empty\n- **rule**: `never`\n\n## type-enum\n\n- **condition**: `type` is found in value\n- **rule**: `always`\n- **value**\n\n  ```js\n  [\n    \"build\",\n    \"chore\",\n    \"ci\",\n    \"docs\",\n    \"feat\",\n    \"fix\",\n    \"perf\",\n    \"refactor\",\n    \"revert\",\n    \"style\",\n    \"test\",\n  ];\n  ```\n\n## type-max-length\n\n- **condition**: `type` has `value` or less characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  Infinity\n  ```\n\n## type-min-length\n\n- **condition**: `type` has `value` or more characters\n- **rule**: `always`\n- **value**\n\n  ```text\n  0\n  ```\n"
  },
  {
    "path": "docs/support/releases.md",
    "content": "# Releases\n\nSecurity patches will be applied to versions which are not yet EOL.  \nFeatures will only be applied to the current main version.\n\nWe're not a sponsored OSS project. Therefore we can't promise that we will release patch versions for older releases in a timely manner.  \nIf you are stuck on an older version and need a security patch we're happy if you can provide a PR.\n\nFor a list of releases check our [README](https://github.com/conventional-changelog/commitlint#releases)\n"
  },
  {
    "path": "docs/support/troubleshooting.md",
    "content": "# Troubleshooting\n\n## Getting `Range error: Found invalid rule names: [...]` after update {#range-error-invalid-rule}\n\nAfter updating one or more `@commitlint` packages you might encounter an error like:\n\n```text\nFound invalid rule names: header-trim.\nSupported rule names are: body-case, body-empty, ...\n```\n\nThe source of this error is likely a mismatch of version between `@commitlint` packages in `node_modules`.\n\nE.g.: you might have a config requesting a rule that is not included in `@commitlint/rules`.\n\n> [!TIP]\n> If you are relying on a config which depends on an earlier version of `@commitlint/config-conventional` be sure to update them:\n>\n> ```sh\n> npm update @commitlint/config-conventional\n> ```\n\n---\n\n> [!NOTE]\n> Detailed explanation about the error can be found in this [comment](https://github.com/conventional-changelog/commitlint/pull/3871#issuecomment-1911455325).\n"
  },
  {
    "path": "docs/support/upgrade.md",
    "content": "# Upgrade Guides\n\n## validate-commit-msg\n\nThe maintainers of [validate-commit-msg](https://github.com/conventional-changelog-archived-repos/validate-commit-msg) have deprecated their package in favor of `commitlint`.\n\n### Migrating with default settings\n\nThe most common `validate-commit-msg` use cases can be recreated with minor changes to your setup.\n\n**Replace validate-commit-msg with commitlint**\n\n```sh\nnpm remove validate-commit-msg --save-dev\nnpm install --save-dev @commitlint/cli @commitlint/config-conventional\n```\n\n**Add a commitmsg run-script to package.json**\n\n```\n{\n  \"scripts\": {\n    \"commitmsg\": \"commitlint -x @commitlint/config-conventional -E GIT_PARAMS\"\n  }\n}\n```\n\n**Install husky**\n\n```sh\nnpm install --save-dev husky\n```\n\n### Migrating with custom settings\n\nIf you used `validate-commit-msg` with custom configuration you might want to customize `commitlint` configuration, too.\n\n**Replace validate-commit-msg with commitlint**\n\n```sh\nnpm remove validate-commit-msg --save-dev\nnpm install --save-dev @commitlint/cli @commitlint/config-conventional\n```\n\n**Add a commitmsg run-script to package.json**\n\n```\n{\n  \"scripts\": {\n    \"commitmsg\": \"commitlint -E GIT_PARAMS\"\n  }\n}\n```\n\n**Install husky**\n\n```sh\nnpm install --save-dev husky\n```\n\n**Configure commitlint**\n\n```js\nmodule.exports = {\n  extends: [\"@commitlint/config-conventional\"],\n  rules: {\n    // Place your rules here\n    \"scope-enum\": [2, \"always\", [\"a\", \"b\"]], // error if scope is given but not in provided list\n  },\n};\n```\n\n### validate-commit-msg option equivalents\n\n```js\n{\n  \"types\": [\"a\", \"b\"],              // 'type-enum': [2, 'always', ['a', 'b']]\n  \"scope\": {\n    \"required\": true,               // 'scope-empty': [2, 'never']\n    \"allowed\": [\"a\", \"b\"],          // 'scope-enum': [2, 'always', ['a', 'b']]; specify [0] for allowed: [\"*\"]\n    \"validate\": false,              // 'scope-enum': [0], 'scope-empty': [0]\n    \"multiple\": false               //  multiple scopes are not supported in commitlint\n  },\n  \"warnOnFail\": false,              // no equivalent setting in commitlint\n  \"maxSubjectLength\": 100,          // 'header-max-length': [2, 'always', 100]\n  \"subjectPattern\": \".+\",           // may be configured via `parser-preset`, contact us\n  \"subjectPatternErrorMsg\": \"msg\",  // no equivalent setting in commitlint\n  \"helpMessage\": \"\",                // no equivalent setting in commitlint\n  \"autoFix\": false                  // no equivalent setting in commitlint\n}\n```\n\nRefer to the [Rules Reference](/reference/rules) for a list of all available configuration options.\n\nThere is also the [#commitlint](https://node-tooling.slack.com/messages/C7M8XJ4RL/) channel on the DevTools Slack workspace. Join us there and we'll do our best to help you with your migration.\n\n## Version 1 to 2\n\n```bash\nnpm install --save-dev conventional-changelog-lint@latest\n```\n\n### Breaking changes\n\n#### CLI\n\n- None\n\n#### Config\n\n- **wildcards** config is ignored - as of version `2.0.0` the former `.wildcards` configuration is ignored entirely. If your `.conventional-changelog-lintrc`, `commitlint.config.js` or an extended shareable configuration has a `.wildcards` key a warning will be issued.\n\n#### API\n\n- None\n\n## Version 2 to 3\n\n```bash\nnpm remove --save-dev conventional-changelog-lint\nnpm install --save commitlint\nmv .conventional-changelog-lintrc commitlint.config.js\n```\n\n- Rename all calls to `conventional-changelog-lint` to `commitlint`\n\n### Breaking changes\n\n#### CLI\n\n- `conventional-changelog-lint` command now is called `commitlint`\n- `commitlint` command now is installed via `@commitlint/cli`\n- `.conventional-changelog-lintrc` now is called `commitlint.config.js`\n- `commitlint` does not search upwards in the directory structure for config\n- `--preset | -p` flag was removed. The `angular` preset is used always.\n\n#### Config\n\n- `.preset` key is removed. The `angular` preset is used always.\n\n#### API\n\n- `getConfiguration(name, settings, seed)` changed to `load(seed)`\n- `getMessages(range)` changed to `read(range)`\n- `getPreset(name, require)` removed\n- `format(report, options)` now only respects `.color` on `options`\n- `lint(message, options)` changed to `lint(message, rules)`\n\n## Version 4 to 5\n\n```bash\nnpm remove --save-dev @commitlint/config-angular\nnpm install --save @commitlint/cli @commitlint/config-conventional\necho 'module.exports = {extends: [\"@commitlint/config-conventional\"]};';\n```\n\n### Breaking changes\n\n#### Config\n\n- `config-angular` dropped support for the `chore` type, breaking compatibility with conventional-changelog,\n  use `config-conventional` instead.\n\n## Version 7 to 8\n\n### Breaking changes\n\n#### Output on successful commit will be omitted\n\n- You can use the `--verbose` flag to get positive output\n\n## Version 8 to 9\n\n### Breaking changes\n\n#### Possible types\n\n- `improvement` type will now be rejected by this config\n\n## Version 9 to 10\n\n### Breaking changes\n\n#### Node support\n\n- node v8 is not supported anymore\n\n## Version 10 to 11\n\n### Breaking changes\n\n#### Lerna support\n\n- lerna v2 is not supported anymore\n\n## Version 11 to 12\n\n### Breaking changes\n\n#### resolve-extends\n\n- The order of the `extends` resolution is changed from right-to-left to left-to-right\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import typescriptEslint from '@typescript-eslint/eslint-plugin';\nimport { createTypeScriptImportResolver } from 'eslint-import-resolver-typescript';\nimport vitest from '@vitest/eslint-plugin';\nimport { importX } from 'eslint-plugin-import-x';\nimport globals from 'globals';\nimport tsParser from '@typescript-eslint/parser';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport js from '@eslint/js';\nimport { FlatCompat } from '@eslint/eslintrc';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst compat = new FlatCompat({\n\tbaseDirectory: __dirname,\n\trecommendedConfig: js.configs.recommended,\n\tallConfig: js.configs.all,\n});\n\nexport default [\n\t{\n\t\tignores: ['**/lib/', '**/coverage/', '**/node_modules/', '**/fixtures/', '**/dist/'],\n\t},\n\timportX.flatConfigs.typescript,\n\t...compat.extends('eslint:recommended', 'prettier'),\n\t{\n\t\tplugins: {\n\t\t\t'@typescript-eslint': typescriptEslint,\n\t\t},\n\t\tsettings: {\n\t\t\t'import-x/resolver-next': createTypeScriptImportResolver(),\n\t\t},\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\t...globals.node,\n\t\t\t\t...vitest.environments.env.globals\n\t\t\t},\n\t\t\tecmaVersion: 11,\n\t\t\tsourceType: 'module',\n\n\t\t\tparserOptions: {\n\t\t\t\tecmaFeatures: {\n\t\t\t\t\tjsx: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\trules: {\n\t\t\t'import-x/first': 'error',\n\t\t\t'import-x/no-absolute-path': 'error',\n\t\t\t'import-x/no-amd': 'error',\n\t\t\t'import-x/no-mutable-exports': 'error',\n\t\t\t'import-x/no-named-default': 'error',\n\t\t\t'import-x/no-self-import': 'error',\n\t\t\t'import-x/no-extraneous-dependencies': [\n\t\t\t\t'error',\n\t\t\t\t{\n\t\t\t\t\tdevDependencies: true,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\t...compat\n\t\t.extends(\n\t\t\t'plugin:@typescript-eslint/eslint-recommended',\n\t\t\t'plugin:@typescript-eslint/recommended',\n\t\t\t'prettier'\n\t\t)\n\t\t.map((config) => ({\n\t\t\t...config,\n\t\t\tfiles: ['**/*.cts', '**/*.ts'],\n\t\t})),\n\t{\n\t\tfiles: ['**/*.cts', '**/*.ts'],\n\t\tlanguageOptions: {\n\t\t\tparser: tsParser,\n\t\t},\n\t\trules: {\n\t\t\t'@typescript-eslint/no-unused-vars': 'off',\n\t\t\t'@typescript-eslint/no-use-before-define': 'off',\n\t\t\t'@typescript-eslint/no-explicit-any': 'off',\n\t\t\t'@typescript-eslint/explicit-function-return-type': 'off',\n\t\t\t'@typescript-eslint/no-var-requires': 'off',\n\t\t\t'@typescript-eslint/no-inferrable-types': 'off',\n\t\t\t'@typescript-eslint/no-non-null-assertion': 'off',\n\t\t\t'@typescript-eslint/triple-slash-reference': 'off',\n\t\t\t'no-empty': 'off',\n\t\t\t'no-var': 'off',\n\t\t},\n\t},\n\t{\n\t\tfiles: ['**/*.test.ts', '**/*.test.js'],\n\t\tplugins: {\n\t\t\tvitest,\n\t\t},\n\t\trules: {\n\t\t\t...vitest.configs.recommended.rules,\n\t\t\t'vitest/max-nested-describe': ['error', { max: 3 }],\n\t\t\t'@typescript-eslint/no-explicit-any': 'off',\n\t\t\t'@typescript-eslint/no-var-requires': 'off',\n\t\t\t'import-x/first': 'off',\n\t\t\t'import-x/no-extraneous-dependencies': 'off',\n\t\t},\n\t},\n];\n"
  },
  {
    "path": "lerna.json",
    "content": "{\n  \"npmClient\": \"yarn\",\n  \"version\": \"20.5.0\"\n}\n"
  },
  {
    "path": "license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 - present Mario Nebl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@commitlint/root\",\n  \"description\": \"Lint commit messages\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"tsc -b\",\n    \"watch\": \"tsc -b --watch\",\n    \"clean\": \"tsc -b --clean && lerna clean --yes && lerna exec 'git clean -xdf lib' && git clean -xdf node_modules\",\n    \"commit\": \"node @commitlint/prompt-cli/cli.js\",\n    \"deps\": \"lerna run deps\",\n    \"pkg\": \"lerna run pkg\",\n    \"docs-dev\": \"vitepress dev docs\",\n    \"docs-build\": \"vitepress build docs\",\n    \"docs-preview\": \"vitepress preview docs\",\n    \"lint\": \"eslint\",\n    \"lint-fix\": \"eslint --fix\",\n    \"format\": \"prettier **/*.{ts,js,json,yml,md} --check\",\n    \"format-fix\": \"prettier \\\"**/*.{ts,js,json,yml,md}\\\" --write\",\n    \"publish\": \"npm whoami && lerna publish --conventional-commits\",\n    \"reinstall\": \"yarn clean && yarn install\",\n    \"start\": \"yarn watch\",\n    \"test\": \"cross-env HOME=$PWD LANG=en_US.UTF-8 NO_COLOR=1 vitest run --coverage\",\n    \"prepare\": \"husky\"\n  },\n  \"commitlint\": {\n    \"extends\": [\n      \"@commitlint/config-conventional\",\n      \"@commitlint/config-workspace-scopes\"\n    ]\n  },\n  \"lint-staged\": {\n    \"*.{ts,js,json,yml,md}\": [\n      \"prettier --write\"\n    ]\n  },\n  \"renovate\": {\n    \"rangeStrategy\": \"update-lockfile\",\n    \"ignorePaths\": [\n      \"**/fixtures/**/package.json\"\n    ],\n    \"extends\": [\n      \"config:base\"\n    ],\n    \"semanticCommitType\": \"chore\",\n    \"semanticCommitScope\": null,\n    \"ignoreDeps\": [\n      \"@commitlint/test\",\n      \"@commitlint/test-environment\",\n      \"@commitlint/utils\"\n    ]\n  },\n  \"workspaces\": [\n    \"@alias/*\",\n    \"@commitlint/*\",\n    \"@packages/*\"\n  ],\n  \"engines\": {\n    \"node\": \">=v18\",\n    \"npm\": \">=7\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/conventional-changelog/commitlint.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/conventional-changelog/commitlint/issues\"\n  },\n  \"homepage\": \"https://github.com/conventional-changelog/commitlint#readme\",\n  \"keywords\": [\n    \"conventional\",\n    \"conventional-changelog\",\n    \"log\",\n    \"changelog\",\n    \"lint\",\n    \"check\"\n  ],\n  \"author\": {\n    \"name\": \"Mario Nebl\",\n    \"email\": \"hello@herebecode.com\"\n  },\n  \"devDependencies\": {\n    \"@eslint/eslintrc\": \"^3.3.4\",\n    \"@eslint/js\": \"^10.0.1\",\n    \"@swc/core\": \"^1.15.18\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.56.1\",\n    \"@typescript-eslint/parser\": \"^8.56.1\",\n    \"@vitest/coverage-istanbul\": \"~4.0.18\",\n    \"@vitest/eslint-plugin\": \"^1.3.4\",\n    \"cross-env\": \"^7.0.3\",\n    \"eslint\": \"^10.0.2\",\n    \"eslint-config-prettier\": \"^10.0.0\",\n    \"eslint-import-resolver-typescript\": \"^4.4.3\",\n    \"eslint-plugin-import-x\": \"^4.15.2\",\n    \"globals\": \"^16.0.0\",\n    \"husky\": \"^9.1.5\",\n    \"lerna\": \"^8.2.0\",\n    \"lint-staged\": \"16.4.0\",\n    \"prettier\": \"^3.5.3\",\n    \"typescript\": \"^5.2.2\",\n    \"vitepress\": \"^1.3.4\",\n    \"vitepress-plugin-tabs\": \"^0.8.0\",\n    \"vitest\": \"~4.0.18\",\n    \"vue\": \"^3.5.29\"\n  }\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.shared.json\",\n  \"files\": [],\n  \"include\": [\"./**/*.test.ts\", \"./**/*-test.ts\", \"./**/*.test-d.ts\"],\n  \"exclude\": [\"./**/lib/*.ts\"],\n  \"compilerOptions\": {\n    \"noEmit\": true\n  },\n  \"references\": [\n    { \"path\": \"@packages/test-environment\" },\n    { \"path\": \"@packages/test\" },\n    { \"path\": \"@commitlint/config-validator\" },\n    { \"path\": \"@commitlint/ensure\" },\n    { \"path\": \"@commitlint/execute-rule\" },\n    { \"path\": \"@commitlint/format\" },\n    { \"path\": \"@commitlint/is-ignored\" },\n    { \"path\": \"@commitlint/load\" },\n    { \"path\": \"@commitlint/message\" },\n    { \"path\": \"@commitlint/parse\" },\n    { \"path\": \"@commitlint/resolve-extends\" },\n    { \"path\": \"@commitlint/to-lines\" },\n    { \"path\": \"@commitlint/top-level\" },\n    { \"path\": \"@commitlint/read\" },\n    { \"path\": \"@commitlint/rules\" },\n    { \"path\": \"@commitlint/lint\" },\n    { \"path\": \"@commitlint/core\" },\n    { \"path\": \"@commitlint/cli\" },\n    { \"path\": \"@commitlint/travis-cli\" },\n    { \"path\": \"@commitlint/prompt\" },\n    { \"path\": \"@commitlint/cz-commitlint\" },\n    { \"path\": \"@commitlint/config-conventional\" },\n    { \"path\": \"@commitlint/config-pnpm-scopes\" },\n    { \"path\": \"@commitlint/types\" }\n  ]\n}\n"
  },
  {
    "path": "tsconfig.shared.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"lib\": [\"es2022\"],\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true,\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"esModuleInterop\": true,\n    \"resolveJsonModule\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"allowUnreachableCode\": false,\n    \"allowUnusedLabels\": false,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"isolatedModules\": true,\n    \"skipLibCheck\": true,\n    \"downlevelIteration\": true\n  }\n}\n"
  },
  {
    "path": "vitest.config.ts",
    "content": "import { defineConfig } from \"vitest/config\";\n\nexport default defineConfig({\n\ttest: {\n\t\ttypecheck: {\n\t\t\tenabled: true,\n\t\t},\n\t\texclude: [\"**/node_modules/**\", \"**/lib/*.test.js\"],\n\t\tenvironment: \"commitlint\",\n\t\tcoverage: {\n\t\t\tprovider: \"istanbul\",\n\t\t\tinclude: [\"**/@commitlint/*/src/**\"],\n\t\t},\n\t},\n\tenvironments: {\n\t\tnode: {},\n\t},\n});\n"
  }
]