Full Code of orhun/git-cliff for AI

main 775beb07e996 cached
445 files
3.8 MB
1.0M tokens
6125 symbols
1 requests
Download .txt
Showing preview only (4,035K chars total). Download the full file or copy to clipboard to get everything.
Repository: orhun/git-cliff
Branch: main
Commit: 775beb07e996
Files: 445
Total size: 3.8 MB

Directory structure:
gitextract_m2e076c7/

├── .cliffignore
├── .dockerignore
├── .editorconfig
├── .envrc
├── .git-blame-ignore-revs
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── feature_request.yml
│   │   └── integration.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── actions/
│   │   └── run-fixtures-test/
│   │       └── action.yml
│   ├── bors.toml
│   ├── config.yml
│   ├── dependabot.yml
│   ├── fixtures/
│   │   ├── README.md
│   │   ├── new-fixture-template/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-always-render/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-always-render-unreleased/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-azure-devops-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-azure-devops-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bitbucket-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bitbucket-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-initial-tag/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-initial-tag-cli-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-initial-tag-default/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-unreleased-with-tag-message-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-custom-minor/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-keep-zerover/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-major/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-minor/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-patch/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bumped-version/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-cli-arg-ignore-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-cli-arg-skip-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-footers/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-preprocessors/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-range-with-given-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-range-with-sort-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-configure-from-cargo-toml/
│   │   │   ├── Cargo.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-conventional-commit/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-custom-remote-api-url/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-custom-scope/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-custom-tag-pattern/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-date-order/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-fail-on-unmatched-commit/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.rc
│   │   ├── test-fixtures-locally.sh
│   │   ├── test-footer-filter/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-footer-template/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-from-context/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   ├── context.json
│   │   │   └── expected.md
│   │   ├── test-from-context-does-not-discard-fields/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   ├── context.json
│   │   │   └── expected.md
│   │   ├── test-gitea-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-gitea-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-github-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-github-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-gitlab-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-gitlab-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-header-template/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-ignore-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-invert-ignore-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-current-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-latest-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-no-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-one-tag/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-one-tag-bump-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-tag-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-unreleased-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-latest-with-one-tag/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-limit-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-monorepo-include-path/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-no-exec/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-offline/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-override-scope/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-regex-json-array/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-regex-label-grouping/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-regex-replace-parser/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-release-statistics/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-remote-config/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-require-conventional-negative/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.rc
│   │   ├── test-require-conventional-skipped/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-skip-breaking-changes/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-skip-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-skip-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-split-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-submodules/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-submodules-include-path/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-submodules-include-path-config/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-submodules-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-tag-message/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-topo-order/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-topo-order-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-topo-order-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-unchanged-tag-date/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-unreleased-tag-missing-release-commit/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   └── test-workdir-include-path/
│   │       ├── cliff.toml
│   │       ├── commit.sh
│   │       └── expected.md
│   ├── mergify.yml
│   └── workflows/
│       ├── cd.yml
│       ├── check-semver.yml
│       ├── ci.yml
│       ├── codeql.yml
│       ├── dependency-review.yml
│       ├── docker.yml
│       ├── test-fixtures.yml
│       └── website.yml
├── .gitignore
├── .lycheeignore
├── .well-known/
│   └── funding-manifest-urls
├── CHANGELOG.md
├── CNAME
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── Dockerfile
├── LICENSE-APACHE
├── LICENSE-MIT
├── README.md
├── RELEASE.md
├── SECURITY.md
├── cliff.toml
├── codecov.yml
├── config/
│   └── cliff.toml
├── examples/
│   ├── azure-devops-keepachangelog.toml
│   ├── cocogitto.toml
│   ├── detailed.toml
│   ├── github-keepachangelog.toml
│   ├── github.toml
│   ├── keepachangelog.toml
│   ├── minimal.toml
│   ├── scoped.toml
│   ├── scopesorted.toml
│   ├── statistics.toml
│   └── unconventional.toml
├── flake.nix
├── git-cliff/
│   ├── Cargo.toml
│   ├── examples/
│   │   └── basic.rs
│   └── src/
│       ├── args.rs
│       ├── bin/
│       │   ├── completions.rs
│       │   └── mangen.rs
│       ├── lib.rs
│       ├── logger.rs
│       ├── main.rs
│       └── profiler.rs
├── git-cliff-core/
│   ├── Cargo.toml
│   ├── src/
│   │   ├── changelog.rs
│   │   ├── command.rs
│   │   ├── commit.rs
│   │   ├── config.rs
│   │   ├── contributor.rs
│   │   ├── embed.rs
│   │   ├── error.rs
│   │   ├── lib.rs
│   │   ├── release.rs
│   │   ├── remote/
│   │   │   ├── azure_devops.rs
│   │   │   ├── bitbucket.rs
│   │   │   ├── gitea.rs
│   │   │   ├── github.rs
│   │   │   ├── gitlab.rs
│   │   │   └── mod.rs
│   │   ├── repo.rs
│   │   ├── statistics.rs
│   │   ├── summary.rs
│   │   ├── tag.rs
│   │   └── template.rs
│   └── tests/
│       └── integration_test.rs
├── lychee.toml
├── npm/
│   ├── git-cliff/
│   │   ├── .gitignore
│   │   ├── .yarn/
│   │   │   └── releases/
│   │   │       └── yarn-4.1.0.cjs
│   │   ├── .yarnrc.yml
│   │   ├── eslint.config.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── cli.ts
│   │   │   ├── getExePath.ts
│   │   │   ├── index.ts
│   │   │   ├── options.ts
│   │   │   └── optionsToStringArgs.ts
│   │   ├── tsconfig.json
│   │   └── tsup.config.ts
│   └── package.json.tmpl
├── pypi/
│   ├── .gitignore
│   └── pyproject.toml
├── release.sh
├── rust-toolchain.toml
├── rustfmt.toml
├── typos.toml
└── website/
    ├── .gitignore
    ├── README.md
    ├── babel.config.js
    ├── blog/
    │   ├── authors.yml
    │   ├── git-cliff-0.5.0.md
    │   ├── git-cliff-1.2.0.md
    │   ├── git-cliff-1.3.0.md
    │   ├── git-cliff-1.4.0.md
    │   ├── git-cliff-2.0.0.md
    │   ├── git-cliff-2.10.0.md
    │   ├── git-cliff-2.11.0.md
    │   ├── git-cliff-2.12.0.md
    │   ├── git-cliff-2.2.0.md
    │   ├── git-cliff-2.3.0.md
    │   ├── git-cliff-2.4.0.md
    │   ├── git-cliff-2.5.0.md
    │   ├── git-cliff-2.6.0.md
    │   ├── git-cliff-2.7.0.md
    │   ├── git-cliff-2.8.0.md
    │   └── git-cliff-2.9.0.md
    ├── docs/
    │   ├── configuration/
    │   │   ├── bump.md
    │   │   ├── changelog.md
    │   │   ├── git.md
    │   │   ├── index.md
    │   │   └── remote.md
    │   ├── development/
    │   │   ├── _category_.json
    │   │   ├── contributing.md
    │   │   └── profiling.md
    │   ├── docker.md
    │   ├── github-actions/
    │   │   ├── _category_.json
    │   │   ├── git-cliff-action.md
    │   │   ├── setup-git-cliff.md
    │   │   └── taiki-e-install-action.md
    │   ├── gitlab.md
    │   ├── index.md
    │   ├── installation/
    │   │   ├── alpine-linux.md
    │   │   ├── arch-linux.md
    │   │   ├── binary-releases.md
    │   │   ├── build-from-source.md
    │   │   ├── conda-forge.md
    │   │   ├── crates-io.md
    │   │   ├── gentoo-linux.md
    │   │   ├── homebrew.md
    │   │   ├── index.md
    │   │   ├── macports.md
    │   │   ├── mise.md
    │   │   ├── nix.md
    │   │   ├── npm.md
    │   │   ├── pypi.md
    │   │   └── winget.md
    │   ├── integration/
    │   │   ├── _category_.json
    │   │   ├── azure-devops.md
    │   │   ├── bitbucket.md
    │   │   ├── gitea.md
    │   │   ├── github.md
    │   │   ├── gitlab.md
    │   │   ├── python.md
    │   │   └── rust.md
    │   ├── sourcehut.md
    │   ├── templating/
    │   │   ├── _category_.json
    │   │   ├── context.md
    │   │   ├── examples.md
    │   │   └── syntax.md
    │   ├── tips-and-tricks.md
    │   └── usage/
    │       ├── _category_.json
    │       ├── adding-commits.md
    │       ├── adding-tag-messages.md
    │       ├── args.md
    │       ├── bump-version.md
    │       ├── examples.md
    │       ├── initializing.md
    │       ├── jujutsu.md
    │       ├── load-context.md
    │       ├── monorepos.md
    │       ├── multiple-repos.md
    │       ├── print-context.md
    │       ├── skipping-commits.md
    │       └── submodules.md
    ├── docusaurus.config.js
    ├── package.json
    ├── sidebars.js
    ├── src/
    │   ├── components/
    │   │   ├── HomepageFeatures/
    │   │   │   ├── index.tsx
    │   │   │   └── styles.module.css
    │   │   └── Testimonials/
    │   │       ├── index.tsx
    │   │       └── styles.module.css
    │   ├── css/
    │   │   └── custom.css
    │   └── pages/
    │       ├── index.module.css
    │       └── index.tsx
    ├── static/
    │   ├── .nojekyll
    │   ├── 10k/
    │   │   └── index.html
    │   ├── favicon/
    │   │   └── site.webmanifest
    │   └── issues/
    │       └── index.html
    └── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .cliffignore
================================================
# skip commits by their SHA1

4f88dda8c746173ea59f920b7579b7f6c74bd6c8
10c3194381f2cc4f93eb97404369568882ed8677


================================================
FILE: .dockerignore
================================================
# Directories
/.git/
/.github/
/npm/
/pypi/
/website/

# Files
.editorconfig
.gitignore
*.md
codecov.yml
Dockerfile
LICENSE
rustfmt.toml
_config.yml
.lycheeignore
lychee.toml

# Ignore rust toolchain files as they would needlessly fetch the toolchain.
# But the image already contains a sufficient toolchain.
# Ignore both the latest naming and the legacy naming
rust-toolchain.toml
rust-toolchain


================================================
FILE: .editorconfig
================================================
# https://EditorConfig.org

# top-most EditorConfig file
root = true

[{*.sh,*.rs}]
indent_style = space
indent_size = 4


================================================
FILE: .envrc
================================================
use flake
dotenv_if_exists .env


================================================
FILE: .git-blame-ignore-revs
================================================
00273009e7553229bccc02e9f4a00d6f8acb9cd5


================================================
FILE: .github/CODEOWNERS
================================================
# See https://help.github.com/articles/about-codeowners/
# for more info about CODEOWNERS file

# It uses the same pattern rule for gitignore file
# https://git-scm.com/docs/gitignore#_pattern_format

# Core
* @orhun


================================================
FILE: .github/FUNDING.yml
================================================
github: orhun
patreon: orhunp
buy_me_a_coffee: orhun


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug report 🐛
description: Report a bug to help us improve
labels: ['bug']
assignees: 
  - orhun
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report!
  - type: checkboxes
    id: new-bug
    attributes:
      label: Is there an existing issue for this?
      description: Please search to see if an issue already exists for the bug you encountered.
      options:
        - label: I have searched the existing issues
          required: true
  - type: textarea
    id: bug-description
    attributes:
      label: Description of the bug
      description: Tell us what bug you encountered and what should have happened
    validations:
      required: true
  - type: textarea
    id: steps-to-reproduce
    attributes:
      label: Steps To Reproduce
      description: Steps to reproduce the behavior.
      placeholder: |
        Please tell us how to reproduce this bug, for example:
        1. Build with '...' arguments
        2. Run with '....' arguments
        4. Use '...' configuration options
        5. See the error
    validations:
      required: true
  - type: textarea
    id: expected-behavior
    attributes:
      label: Expected behavior
      description: What should be the expected behavior.
      placeholder: A clear and concise description of what you expected to happen.
    validations:
      required: true
  - type: textarea
    id: screenshots
    attributes:
      label: Screenshots / Logs
      description: If applicable, add screenshots to help explain your problem.
      placeholder: Paste your screenshots here.
  - type: textarea
    id: software-info
    attributes:
      label: Software information
      description: Please provide the following information about your environment.
      value: |
        - Operating system:
        - Rust version:
        - Project version:
    validations:
      required: true
  - type: textarea
    id: additional-context
    attributes:
      label: Additional context
      description: Do you want to share any additional context about this bug?
      placeholder: Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
contact_links:
  - name: Discord Chat
    url: https://discord.gg/W3mAwMDWH4
    about: Ask questions and have discussions about git-cliff on Discord
  - name: Matrix Chat
    url: https://matrix.to/#/#git-cliff:matrix.org
    about: Ask questions and have discussions about git-cliff on Matrix


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature request ⛰️ 
description: Suggest an idea for this project
labels: ['feature/request']
assignees: 
  - orhun
body:
  - type: markdown
    attributes:
      value: Thank you for suggesting this feature! The more information you provide, the more likely it is that it will be picked up.
  - type: checkboxes
    id: new-feature
    attributes:
      label: Is there an existing issue or pull request for this?
      description: Please search to see if an issue or pull request already exists for the feature you desire.
      options:
        - label: I have searched the existing issues and pull requests
          required: true
  - type: textarea
    id: feature-description
    attributes:
      label: Feature description
      description: Is your feature request related to a problem? Please describe.
      placeholder: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
    validations:
      required: true
  - type: textarea
    id: desired-solution
    attributes:
      label: Desired solution
      description: Describe the solution you'd like
      placeholder: A clear and concise description of what you want to happen.
    validations:
      required: true
  - type: textarea
    id: alternatives-considered
    attributes:
      label: Alternatives considered
      description: Describe alternatives you've considered
      placeholder: A clear and concise description of any alternative solutions or features you've considered.
    validations:
      required: true
  - type: textarea
    id: additional-context
    attributes:
      label: Additional context
      description: Do you want to share any additional context about this bug?
      placeholder: Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/integration.yml
================================================
name: Integration ⚙️
description: Report a bug or request a feature about an integration (e.g GitHub/GitLab/Gitea/Bitbucket)
labels: ["integration"]
assignees:
  - orhun
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report!
        Please see https://git-cliff.org/docs/category/integration for more information about integrations.
  - type: checkboxes
    id: new-bug
    attributes:
      label: Is there an existing issue for this?
      description: Please search to see if an issue already exists for the bug you encountered.
      options:
        - label: I have searched the existing issues
          required: true
  - type: textarea
    id: bug-description
    attributes:
      label: Description of the bug
      description: Tell us what bug you encountered and what should have happened
    validations:
      required: true
  - type: textarea
    id: steps-to-reproduce
    attributes:
      label: Steps To Reproduce
      description: Steps to reproduce the behavior.
      placeholder: |
        Please tell us how to reproduce this bug, for example:
        1. Build with '...' arguments
        2. Run with '....' arguments
        4. Use '...' configuration options
        5. See the error
    validations:
      required: true
  - type: textarea
    id: expected-behavior
    attributes:
      label: Expected behavior
      description: What should be the expected behavior.
      placeholder: A clear and concise description of what you expected to happen.
    validations:
      required: true
  - type: textarea
    id: screenshots
    attributes:
      label: Screenshots / Logs
      description: If applicable, add screenshots to help explain your problem.
      placeholder: Paste your screenshots here.
  - type: textarea
    id: software-info
    attributes:
      label: Software information
      description: Please provide the following information about your environment.
      value: |
        - Operating system:
        - Rust version:
        - Project version:
    validations:
      required: true
  - type: textarea
    id: additional-context
    attributes:
      label: Additional context
      description: Do you want to share any additional context about this bug?
      placeholder: Add any other context about the problem here.


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Description

<!--- Describe your changes in detail -->

## Motivation and Context

<!--- Why is this change required? What problem does it solve?  -->
<!--- If it fixes an open issue, please link to the issue here. -->

## How Has This Been Tested?

<!--- Please describe in detail how you tested your changes.                -->
<!--- Include details of your testing environment, and the tests you ran to -->
<!--- see how your change affects other areas of the code, etc.             -->

## Screenshots / Logs (if applicable)

## Types of Changes

<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [ ] Documentation (no code change)
- [ ] Refactor (refactoring production code)
- [ ] Other <!--- (provide information) -->

## Checklist:

<!--- Go over all the following points, and put an `x` in all the boxes that apply.   -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->

- [ ] My code follows the code style of this project.
- [ ] I have updated the documentation accordingly (if applicable).
- [ ] I have formatted the code with [rustfmt](https://github.com/rust-lang/rustfmt).
  - [ ] `cargo +nightly fmt --all`
- [ ] I checked the lints with [clippy](https://github.com/rust-lang/rust-clippy).
  - [ ] `cargo clippy --tests --verbose -- -D warnings`
- [ ] I have added tests to cover my changes.
- [ ] All new and existing tests passed.
  - [ ] `cargo test`

<!--- Thank you for contributing to git-cliff! ⛰️  -->


================================================
FILE: .github/actions/run-fixtures-test/action.yml
================================================
name: Run a fixtures test
description: Run a fixtures test

inputs:
  fixtures-dir:
    description: Path to the fixtures directory
    required: true
  command:
    description: The git-cliff command to run
    required: false
    default: ""
  date-format:
    description: The date format to use
    required: false
    default: "%Y-%m-%d"
  previous-release-timestamp:
    description: The timestamp of the previous release
    required: false
    default: "1970-01-01 00:00:00"

runs:
  using: composite
  steps:
    - name: Install toolchain
      uses: dtolnay/rust-toolchain@nightly

    - name: Install git-cliff
      run: cargo install --path git-cliff/ --profile dev
      shell: bash

    - name: Set git config
      run: |
        git config --global user.name "github-actions[bot]"
        git config --global user.email "github-actions[bot]@users.noreply.github.com"
      shell: bash

    - name: Create commits and tags
      working-directory: ${{ inputs.fixtures-dir }}
      run: |
        git init
        ./commit.sh
      shell: bash

    - name: Generate a changelog
      working-directory: ${{ inputs.fixtures-dir }}
      shell: bash
      run: |
        set +e
        git cliff --config cliff.toml ${{ inputs.command }} > output.md
        echo "$?" > output.rc
        if [ -f output.md ]; then
          cat output.md
        fi

    - name: Compare the output with the expected output
      working-directory: ${{ inputs.fixtures-dir }}
      env:
        IN_DATE_FORMAT: ${{ inputs.date-format }}
        IN_PREVIOUS_RELEASE_TIMESTAMP: ${{ inputs.previous-release-timestamp }}
      shell: bash
      run: |
        if [ -f expected.md ]; then
          current_date=$(date +"$IN_DATE_FORMAT")
          previous_release_timestamp="$IN_PREVIOUS_RELEASE_TIMESTAMP"
          previous_release_timestamp=$(date -d "$previous_release_timestamp" +%s)
          current_release_timestamp=$(date +%s)
          days_since_last_release=$(( (current_release_timestamp - previous_release_timestamp) / 86400 ))
          sed -i "s/<<DATE>>/$current_date/g" expected.md
          sed -i "s/<<DAYS SINCE LAST RELEASE>>/$days_since_last_release/g" expected.md
          if ! diff --strip-trailing-cr output.md expected.md; then

            echo '> expected'
            cat expected.md

            echo '> output'
            cat output.md

            echo "The generated changelog does not match the expected changelog."
            exit 1
          fi
        fi

    - name: Compare the return code with the expected return code
      working-directory: ${{ inputs.fixtures-dir }}
      shell: bash
      run: |
        if [ -f expected.rc ]; then
          if ! diff --strip-trailing-cr --ignore-all-space output.rc expected.rc; then
            echo "The return code does not match the expected return code."
            exit 1
          fi
        fi


================================================
FILE: .github/bors.toml
================================================
status = [
    "Check",
    "Lints",
    "Formatting",
    "Test suite",
    "Audit check",
    "Links",
    "Check Rust version",
]
delete_merged_branches = true
update_base_for_deletes = true
cut_body_after = "<details>"
commit_title = "chore(pull): merge ${PR_REFS}"


================================================
FILE: .github/config.yml
================================================
# Configuration for welcome - https://github.com/behaviorbot/welcome

# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome

# Comment to be posted to on first time issues
newIssueWelcomeComment: >
  Thanks for opening your first issue at **git-cliff**! Be sure to follow the issue template! ⛰️

# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome

# Comment to be posted to on PRs from first time contributors in your repository
newPRWelcomeComment: >
  Thanks for opening this pull request! Please check out our contributing guidelines! ⛰️

# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge

# Comment to be posted to on pull requests merged by a first time user
firstPRMergeComment: >
  Congrats on merging your first pull request! ⛰️


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  # Maintain dependencies for Cargo
  - package-ecosystem: cargo
    directory: "/"
    schedule:
      interval: monthly
    open-pull-requests-limit: 10
    groups:
      minor:
        update-types:
          - "minor"
      patch:
        update-types:
          - "patch"

  # Maintain dependencies for GitHub Actions
  - package-ecosystem: github-actions
    directory: "/"
    schedule:
      interval: monthly
    open-pull-requests-limit: 10
    groups:
      minor:
        update-types:
          - "minor"
      patch:
        update-types:
          - "patch"

  # Maintain dependencies for NPM
  - package-ecosystem: "npm"
    directory: "/website"
    schedule:
      interval: monthly
    open-pull-requests-limit: 10
    groups:
      minor:
        update-types:
          - "minor"
      patch:
        update-types:
          - "patch"

  - package-ecosystem: npm
    directory: /npm/git-cliff
    schedule:
      interval: monthly
    open-pull-requests-limit: 10
    groups:
      minor:
        update-types:
          - "minor"
      patch:
        update-types:
          - "patch"
    ignore:
      # We intentionally ignore semver-major updates to avoid
      # PR noise when new Node versions are released.
      # Revisit this when updating the supported Node.js range.
      - dependency-name: "@types/node"
        update-types: ["version-update:semver-major"]

  # Maintain dependencies for Docker
  - package-ecosystem: docker
    directory: /
    schedule:
      interval: monthly
    open-pull-requests-limit: 10


================================================
FILE: .github/fixtures/README.md
================================================
# Fixtures

[Test fixtures](https://en.wikipedia.org/wiki/Test_fixture) are a way of testing the `git-cliff`'s functionality against a configuration file (`cliff.toml`) and asserting the output (`expected.md`).

They are being [run](https://github.com/orhun/git-cliff/actions/workflows/test-fixtures.yml) as a part of the GitHub Actions and the workflow file can be viewed [here](../workflows/test-fixtures.yml).

## Adding new fixtures

1. Copy the `new-fixture-template` as `test-<functionality>`.
2. Update the files accordingly to the function that is being tested.
3. Run the fixture locally. (see below)
4. Add the fixture to [`test-fixtures.yml`](../workflows/test-fixtures.yml) matrix.
   - If you need to specify custom arguments to `git-cliff` for the fixture test, you can do it here with using `command`.
5. Commit your changes.

See [this commit](https://github.com/orhun/git-cliff/commit/c94cb6a37ae268953ab29dd35cb43b6a4fec47cc) as an example.

## Running locally

To run the fixtures locally:

```sh
./test-fixtures-locally.sh <fixture_name>
```

## See also

- [Contribution Guidelines](https://github.com/orhun/git-cliff/blob/main/CONTRIBUTING.md)


================================================
FILE: .github/fixtures/new-fixture-template/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\

{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's `scope` and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/new-fixture-template/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
git tag v0.1.0
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2"
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2"
git tag v0.2.0
GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests"


================================================
FILE: .github/fixtures/new-fixture-template/expected.md
================================================
## [unreleased]

### Test

- Add tests

## [0.2.0] - 2022-04-06

### Bug Fixes

- Fix feature 2

### Features

- Add feature 2

## [0.1.0] - 2022-04-06

### Bug Fixes

- Fix feature 1

### Features

- Add feature 1



================================================
FILE: .github/fixtures/test-always-render/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% if commits | length == 0 %}
No significant changes.

{% else %}\
{% for group, commits in commits | group_by(attribute="group") -%}
    ### {{ group | upper_first }}
    etc.
{% endfor %}
{% endif %}\
"""
# render body even when there are no releases to process
render_always = true


================================================
FILE: .github/fixtures/test-always-render/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
git tag v0.1.0


================================================
FILE: .github/fixtures/test-always-render/expected.md
================================================
## [0.2.0] - <<DATE>>

No significant changes.



================================================
FILE: .github/fixtures/test-always-render-unreleased/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% if commits | length == 0 %}
No significant changes.

{% else %}\
{% for group, commits in commits | group_by(attribute="group") -%}
    ### {{ group | upper_first }}
    etc.
{% endfor %}
{% endif %}\
"""
# render body even when there are no releases to process
render_always = true


================================================
FILE: .github/fixtures/test-always-render-unreleased/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
git tag v0.1.0


================================================
FILE: .github/fixtures/test-always-render-unreleased/expected.md
================================================
## [unreleased]

No significant changes.



================================================
FILE: .github/fixtures/test-azure-devops-integration/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# Azure DevOps integration for fetching commit metadata.
[remote.azure_devops]
owner = "shiftme/gitcliff"
repo = "git-cliff-readme-example"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{%- macro remote_url() -%}
  https://dev.azure.com/{{ remote.azure_devops.owner }}/_git/{{ remote.azure_devops.repo }}
{%- endmacro -%}

## What's Changed
{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in \
      [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pullrequest/{{ commit.remote.pr_number }})\
    {%- endif %}
{%- endfor -%}

{% if azure_devops.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in azure_devops.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pullrequest/{{ contributor.pr_number }}) \
    {%- endif %}
{% endfor %}\
\n\n
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = true
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-azure-devops-integration/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://dev.azure.com/shiftme/gitcliff/_git/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-azure-devops-integration/expected.md
================================================
## What's Changed
* feat(config): support multiple file formats by @orhun
* feat(cache): use cache while fetching pages by @orhun

## What's Changed in v1.0.1
* refactor(parser): expose string functions by @orhun
* chore(release): add release script by @orhun

## What's Changed in v1.0.0
* Initial commit by @orhun
* docs(project): add README.md by @orhun
* feat(parser): add ability to parse arrays by @orhun
* fix(args): rename help argument due to conflict by @orhun
* docs(example)!: add tested usage example by @orhun

### New Contributors
* @orhun made their first contribution




================================================
FILE: .github/fixtures/test-azure-devops-integration-custom-range/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# Azure DevOps integration for fetching commit metadata.
[remote.azure_devops]
owner = "shiftme/gitcliff"
repo = "git-cliff-readme-example"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{%- macro remote_url() -%}
  https://dev.azure.com/{{ remote.azure_devops.owner }}/_git/{{ remote.azure_devops.repo }}
{%- endmacro -%}

## What's Changed
{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in \
      [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pullrequest/{{ commit.remote.pr_number }})\
    {%- endif %}
{%- endfor -%}

{% if azure_devops.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in azure_devops.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pullrequest/{{ contributor.pr_number }}) \
    {%- endif %}
{% endfor %}\
\n\n
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = true
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-azure-devops-integration-custom-range/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://dev.azure.com/shiftme/gitcliff/_git/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-azure-devops-integration-custom-range/expected.md
================================================
## What's Changed in v1.0.1
* refactor(parser): expose string functions by @orhun
* chore(release): add release script by @orhun



================================================
FILE: .github/fixtures/test-bitbucket-integration/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# Bitbucket integration for fetching commit metadata.
[remote.bitbucket]
owner = "mcwarman-playground"
repo = "git-cliff-readme-example"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{%- macro remote_url() -%}
  https://bitbucket.org/{{ remote.bitbucket.owner }}/{{ remote.bitbucket.repo }}
{%- endmacro -%}

## What's Changed
{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in \
      [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull-requests/{{ commit.remote.pr_number }})\
    {%- endif %}
{%- endfor -%}

{% if bitbucket.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in bitbucket.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull-requests/{{ contributor.pr_number }}) \
    {%- endif %}
{% endfor %}\
\n\n
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = true
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-bitbucket-integration/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://bitbucket.org/mcwarman-playground/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-bitbucket-integration/expected.md
================================================
## What's Changed
* feat(config): support multiple file formats by @orhun <orhun@archlinux.org>
* feat(cache): use cache while fetching pages by @orhun <orhun@archlinux.org>
* feat(ci): add pipeline config by @mcwarman <7236500+mcwarman@users.noreply.github.com> in [#1](https://bitbucket.org/mcwarman-playground/git-cliff-readme-example/pull-requests/1)

## What's Changed in v1.0.1
* refactor(parser): expose string functions by @orhun <orhun@archlinux.org>
* chore(release): add release script by @orhun <orhun@archlinux.org>

## What's Changed in v1.0.0
* Initial commit by @orhun <orhun@archlinux.org>
* docs(project): add README.md by @orhun <orhun@archlinux.org>
* feat(parser): add ability to parse arrays by @orhun <orhun@archlinux.org>
* fix(args): rename help argument due to conflict by @orhun <orhun@archlinux.org>
* docs(example)!: add tested usage example by @orhun <orhun@archlinux.org>

### New Contributors
* @orhun <orhun@archlinux.org> made their first contribution




================================================
FILE: .github/fixtures/test-bitbucket-integration-custom-range/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# Bitbucket integration for fetching commit metadata.
[remote.bitbucket]
owner = "mcwarman-playground"
repo = "git-cliff-readme-example"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{%- macro remote_url() -%}
  https://bitbucket.org/{{ remote.bitbucket.owner }}/{{ remote.bitbucket.repo }}
{%- endmacro -%}

## What's Changed
{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in \
      [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull-requests/{{ commit.remote.pr_number }})\
    {%- endif %}
{%- endfor -%}

{% if bitbucket.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in bitbucket.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull-requests/{{ contributor.pr_number }}) \
    {%- endif %}
{% endfor %}\
\n\n
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = true
# Split commits on newlines, treating each line as an individual commit.
split_commits = false
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-bitbucket-integration-custom-range/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://bitbucket.org/mcwarman-playground/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-bitbucket-integration-custom-range/expected.md
================================================
## What's Changed in v1.0.1
* refactor(parser): expose string functions by @orhun <orhun@archlinux.org>
* chore(release): add release script by @orhun <orhun@archlinux.org>



================================================
FILE: .github/fixtures/test-bump-initial-tag/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]

[bump]
initial_tag = "1.15.5"


================================================
FILE: .github/fixtures/test-bump-initial-tag/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests"


================================================
FILE: .github/fixtures/test-bump-initial-tag/expected.md
================================================
## [1.15.5]

### Test

- Add tests



================================================
FILE: .github/fixtures/test-bump-initial-tag-cli-arg/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]

[bump]
initial_tag = "test"


================================================
FILE: .github/fixtures/test-bump-initial-tag-cli-arg/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests"


================================================
FILE: .github/fixtures/test-bump-initial-tag-cli-arg/expected.md
================================================
## [2.1.1]

### Test

- Add tests



================================================
FILE: .github/fixtures/test-bump-initial-tag-default/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/test-bump-initial-tag-default/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests"


================================================
FILE: .github/fixtures/test-bump-initial-tag-default/expected.md
================================================
## [0.1.0]

### Test

- Add tests



================================================
FILE: .github/fixtures/test-bump-unreleased-with-tag-message-arg/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
    {% if message %}
        {{ message }}
    {% endif %}\
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# regex for parsing and grouping commits
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/test-bump-unreleased-with-tag-message-arg/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
git tag v0.1.0
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2"
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2"
git tag v0.2.0
GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests"


================================================
FILE: .github/fixtures/test-bump-unreleased-with-tag-message-arg/expected.md
================================================
## [0.2.1]

Some text

### Test

- Add tests



================================================
FILE: .github/fixtures/test-bump-version/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""


================================================
FILE: .github/fixtures/test-bump-version/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat!: add breaking feature"
GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2"


================================================
FILE: .github/fixtures/test-bump-version/expected.md
================================================
## [1.0.0]

### <!-- 0 -->🚀 Features

- [**breaking**] Add breaking feature

### <!-- 1 -->🐛 Bug Fixes

- Fix feature 2

## [0.1.0]

### <!-- 0 -->🚀 Features

- Add feature 1
- Add feature 2



================================================
FILE: .github/fixtures/test-bump-version-custom-minor/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[bump]
features_always_bump_minor = true
breaking_always_bump_major = true
custom_minor_increment_regex = "minor|more"


================================================
FILE: .github/fixtures/test-bump-version-custom-minor/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "minor: add minor"
GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2"


================================================
FILE: .github/fixtures/test-bump-version-custom-minor/expected.md
================================================
## [0.2.0]

### <!-- 1 -->🐛 Bug Fixes

- Fix feature 2

### <!-- 10 -->💼 Other

- Add minor

## [0.1.0]

### <!-- 0 -->🚀 Features

- Add feature 1
- Add feature 2



================================================
FILE: .github/fixtures/test-bump-version-keep-zerover/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[bump]
features_always_bump_minor = false
breaking_always_bump_major = false


================================================
FILE: .github/fixtures/test-bump-version-keep-zerover/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat!: add breaking feature"
GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2"


================================================
FILE: .github/fixtures/test-bump-version-keep-zerover/expected.md
================================================
## [0.2.0]

### Feat

- [**breaking**] Add breaking feature

### Fix

- Fix feature 2

## [0.1.0]

### Feat

- Add feature 1
- Add feature 2



================================================
FILE: .github/fixtures/test-bump-version-major/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""


================================================
FILE: .github/fixtures/test-bump-version-major/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2"


================================================
FILE: .github/fixtures/test-bump-version-major/expected.md
================================================
## [1.0.0]

### <!-- 1 -->🐛 Bug Fixes

- Fix feature 1
- Fix feature 2

## [0.1.0]

### <!-- 0 -->🚀 Features

- Add feature 1
- Add feature 2



================================================
FILE: .github/fixtures/test-bump-version-minor/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""


================================================
FILE: .github/fixtures/test-bump-version-minor/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat!: add breaking feature"
GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2"


================================================
FILE: .github/fixtures/test-bump-version-minor/expected.md
================================================
## [0.2.0]

### <!-- 0 -->🚀 Features

- [**breaking**] Add breaking feature

### <!-- 1 -->🐛 Bug Fixes

- Fix feature 2

## [0.1.0]

### <!-- 0 -->🚀 Features

- Add feature 1
- Add feature 2



================================================
FILE: .github/fixtures/test-bump-version-patch/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""


================================================
FILE: .github/fixtures/test-bump-version-patch/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat!: add breaking feature"
GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2"


================================================
FILE: .github/fixtures/test-bump-version-patch/expected.md
================================================
## [0.1.1]

### <!-- 0 -->🚀 Features

- [**breaking**] Add breaking feature

### <!-- 1 -->🐛 Bug Fixes

- Fix feature 2

## [0.1.0]

### <!-- 0 -->🚀 Features

- Add feature 1
- Add feature 2



================================================
FILE: .github/fixtures/test-bumped-version/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""


================================================
FILE: .github/fixtures/test-bumped-version/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2"


================================================
FILE: .github/fixtures/test-bumped-version/expected.md
================================================
v0.1.1


================================================
FILE: .github/fixtures/test-cli-arg-ignore-tags/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# regex for skipping tags
skip_tags = ""
# regex for ignoring tags
ignore_tags = ""


================================================
FILE: .github/fixtures/test-cli-arg-ignore-tags/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add first beta feature"
git tag v1.0.0-beta.1

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add second beta feature"
git tag v1.0.0-beta.2

# WARNING: If we won't create this commit, 1.0.0 won't be created!
GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "chore: why do i need a commit here?"
git tag v1.0.0

GIT_COMMITTER_DATE="2021-01-23 01:23:49" git commit --allow-empty -m "fix: simple fix"
git tag v1.0.1


================================================
FILE: .github/fixtures/test-cli-arg-ignore-tags/expected.md
================================================
## [1.0.1] - 2021-01-23

### <!-- 1 -->🐛 Bug Fixes

- Simple fix

## [1.0.0] - 2021-01-23

### <!-- 0 -->🚀 Features

- Add first beta feature
- Add second beta feature

### <!-- 7 -->⚙️ Miscellaneous Tasks

- Why do i need a commit here?



================================================
FILE: .github/fixtures/test-cli-arg-skip-tags/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# regex for skipping tags
skip_tags = ""
# regex for ignoring tags
ignore_tags = ""


================================================
FILE: .github/fixtures/test-cli-arg-skip-tags/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add first beta feature"
git tag v1.0.0-beta.1

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add second beta feature"
git tag v1.0.0-beta.2

# WARNING: If we won't create this commit, 1.0.0 won't be created!
GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "chore: why do i need a commit here?"
git tag v1.0.0

GIT_COMMITTER_DATE="2021-01-23 01:23:49" git commit --allow-empty -m "fix: simple fix"
git tag v1.0.1


================================================
FILE: .github/fixtures/test-cli-arg-skip-tags/expected.md
================================================
## [1.0.1] - 2021-01-23

### <!-- 1 -->🐛 Bug Fixes

- Simple fix

## [1.0.0] - 2021-01-23

### <!-- 7 -->⚙️ Miscellaneous Tasks

- Why do i need a commit here?



================================================
FILE: .github/fixtures/test-commit-footers/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
          {% if commit.footers %}\
            {% for footer in commit.footers -%}
                , {{ footer.token }}{{ footer.separator }}{{ footer.value }}\
            {% endfor %}\
          {% endif %}\
    {% endfor %}
{% endfor %}\n
"""


================================================
FILE: .github/fixtures/test-commit-footers/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1" -m "footer: test"

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 2" -m "Signed-off-by: bot"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "fix: fix feature 1" -m "footer1: xyz" -m "footer2: abc"


================================================
FILE: .github/fixtures/test-commit-footers/expected.md
================================================
## [unreleased]

### <!-- 1 -->🐛 Bug Fixes

- Fix feature 1, footer1:xyz, footer2:abc

## [0.1.0] - 2021-01-23

### <!-- 0 -->🚀 Features

- Add feature 1, footer:test
- Add feature 2, Signed-off-by:bot



================================================
FILE: .github/fixtures/test-commit-preprocessors/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
    # Replace issue numbers with links to the issue.
    { pattern = '\(#([0-9]+)\)', replace = "([issue#${1}](https://github.com/orhun/git-cliff/issues/${1}))" },
    # Trim multiple spaces.
    { pattern = "  +", replace = " " },
]


================================================
FILE: .github/fixtures/test-commit-preprocessors/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1 (#1)"
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "refactor: move  classes"
git tag v0.1.0


================================================
FILE: .github/fixtures/test-commit-preprocessors/expected.md
================================================
## [0.1.0] - 2022-04-06

### <!-- 0 -->🚀 Features

- Add feature 1

### <!-- 1 -->🐛 Bug Fixes

- Fix feature 1 ([issue#1](https://github.com/orhun/git-cliff/issues/1))

### <!-- 2 -->🚜 Refactor

- Move classes



================================================
FILE: .github/fixtures/test-commit-range/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}
{{ commit_range.from }}..{{ commit_range.to }}
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's `scope` and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/test-commit-range/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://github.com/orhun/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-commit-range/expected.md
================================================
## [unreleased]

a9d4050212a18f6b3bd76e2e41fbb9045d268b80..df6aef41292f3ffe5887754232e6ea7831c50ba5

### Features

- Support multiple file formats
- Use cache while fetching pages

## [1.0.1] - 2021-07-18

e4fd3cf8e2e6f49c0b57f66416e886c37cbb3715..06412ac1dd4071006c465dde6597a21d4367a158

### Chore

- Add release script

### Refactor

- Expose string functions

## [1.0.0] - 2021-07-18

a78bc368e9ee382a3016c0c4bab41f7de4503bcd..ad27b43e8032671afb4809a1a3ecf12f45c60e0e

### Bug Fixes

- Rename help argument due to conflict

### Features

- Add ability to parse arrays

### Docs

- Add README.md
- Add tested usage example



================================================
FILE: .github/fixtures/test-commit-range-with-given-range/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}
{{ commit_range.from }}..{{ commit_range.to }}
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's `scope` and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/test-commit-range-with-given-range/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://github.com/orhun/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-commit-range-with-given-range/expected.md
================================================
## [unreleased]

a140cef0405e0bcbfb5de44ff59e091527d91b38..a9d4050212a18f6b3bd76e2e41fbb9045d268b80

### Bug Fixes

- Rename help argument due to conflict

### Features

- Add ability to parse arrays
- Support multiple file formats

### Chore

- Add release script

### Docs

- Add tested usage example

### Refactor

- Expose string functions



================================================
FILE: .github/fixtures/test-commit-range-with-sort-commits/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}
{{ commit_range.from }}..{{ commit_range.to }}
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's `scope` and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]
sort_commits = "newest"


================================================
FILE: .github/fixtures/test-commit-range-with-sort-commits/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://github.com/orhun/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-commit-range-with-sort-commits/expected.md
================================================
## [unreleased]

a9d4050212a18f6b3bd76e2e41fbb9045d268b80..df6aef41292f3ffe5887754232e6ea7831c50ba5

### Features

- Use cache while fetching pages
- Support multiple file formats

## [1.0.1] - 2021-07-18

e4fd3cf8e2e6f49c0b57f66416e886c37cbb3715..06412ac1dd4071006c465dde6597a21d4367a158

### Chore

- Add release script

### Refactor

- Expose string functions

## [1.0.0] - 2021-07-18

a78bc368e9ee382a3016c0c4bab41f7de4503bcd..ad27b43e8032671afb4809a1a3ecf12f45c60e0e

### Bug Fixes

- Rename help argument due to conflict

### Features

- Add ability to parse arrays

### Docs

- Add tested usage example
- Add README.md



================================================
FILE: .github/fixtures/test-configure-from-cargo-toml/Cargo.toml
================================================
[package]
name = "test"
version = "0.1.0"
edition = "2021"

[package.metadata.git-cliff.changelog]
# A Tera template to be rendered as the changelog's header.
# See https://keats.github.io/tera/docs/#introduction
header = """
# Changelog\n
All notable changes to this project will be documented in this file.\n
"""
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""
# A Tera template to be rendered as the changelog's footer.
# See https://keats.github.io/tera/docs/#introduction
footer = """
<!-- generated by git-cliff -->
"""
# Remove leading and trailing whitespaces from the changelog's body.
trim = true

[package.metadata.git-cliff.git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/test-configure-from-cargo-toml/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
git tag v0.1.0
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2"
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2"
git tag v0.2.0
GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests"


================================================
FILE: .github/fixtures/test-configure-from-cargo-toml/expected.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

## [unreleased]

### Test

- Add tests

## [0.2.0] - 2022-04-06

### Bug Fixes

- Fix feature 2

### Features

- Add feature 2

## [0.1.0] - 2022-04-06

### Bug Fixes

- Fix feature 1

### Features

- Add feature 1

<!-- generated by git-cliff -->


================================================
FILE: .github/fixtures/test-conventional-commit/cliff.toml
================================================
[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% for group, commits in commits | group_by(attribute="group") %}\
    ## {{ group | striptags | trim | upper_first }}
    {% for commit in commits %}
          {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
          {% if commit.breaking %}[**breaking**]: {{ commit.breaking_description }}{% endif %}
          {{ commit.message }}: {{ commit.body }}\
          {% for footer in commit.footers %}
            - {{ footer.token }}{{ footer.separator }} {{ footer.value }}\
          {% endfor %}
    {% endfor %}
{% endfor %}\
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
  { message = "^feat", group = "Features", default_scope = "app" },
  { message = "^fix" },
]


================================================
FILE: .github/fixtures/test-conventional-commit/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m \
    "feat(web): feature 1, breaking change in footer

Body feature 1

BREAKING CHANGE: breaking change description feature 1
Signed-off-by: user1 <user1@example.com>
Reviewed-by: user2
"

GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m \
    "feat(web)!: feature 2, breaking chain in description

Body feature 2

Signed-off-by: user3 <user3@example.com>
"

GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m \
    "feat!: feature 3, use default scope = app

Body feature 2

Signed-off-by: user3 <user3@example.com>
"

GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m \
    "fix(scope): fix 1, use scope as group

Body fix 1

Fix: #1
"

GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m \
    "fix(front-end): fix 2, no footer

Body fix 2
"

GIT_COMMITTER_DATE="2022-04-06 01:25:14" git commit --allow-empty -m \
    "fix(front-end): fix 3 and 4, no body but footer

Fix: #3
Fix: #4
"

git tag v0.1.0


================================================
FILE: .github/fixtures/test-conventional-commit/expected.md
================================================
## Features

*(web)* [**breaking**]: breaking change description feature 1
feature 1, breaking change in footer: Body feature 1
- BREAKING CHANGE: breaking change description feature 1
- Signed-off-by: user1 <user1@example.com>
- Reviewed-by: user2

*(web)* [**breaking**]: feature 2, breaking chain in description
feature 2, breaking chain in description: Body feature 2
- Signed-off-by: user3 <user3@example.com>

*(app)* [**breaking**]: feature 3, use default scope = app
feature 3, use default scope = app: Body feature 2
- Signed-off-by: user3 <user3@example.com>

## Fix

*(scope)* 
fix 1, use scope as group: Body fix 1
- Fix: #1

*(front-end)* 
fix 2, no footer: Body fix 2

*(front-end)* 
fix 3 and 4, no body but footer: 
- Fix: #3
- Fix: #4



================================================
FILE: .github/fixtures/test-custom-remote-api-url/cliff.toml
================================================
[remote.gitlab]
owner = "archlinux"
repo = "arch-repro-status"
api_url = "https://gitlab.archlinux.org/api/v4"

[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
## What's Changed

{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %}
{%- endfor -%}

{% if gitlab.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in gitlab.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
    {%- endif %}
{%- endfor -%}

{% if version %}
    {% if previous.version %}
      **Full Changelog**: https://gitlab.com/{{ remote.gitlab.owner }}/{{ remote.gitlab.repo }}/compare/{{ previous.version }}...{{ version }}
    {% endif %}
{% else -%}
  {% raw %}\n{% endraw %}
{% endif %}
"""

[git]
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = false
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = []


================================================
FILE: .github/fixtures/test-custom-remote-api-url/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://gitlab.archlinux.org/archlinux/arch-repro-status
git fetch
git checkout 5fe2f324db566756ccaf066fe186100a09a87625


================================================
FILE: .github/fixtures/test-custom-remote-api-url/expected.md
================================================
## What's Changed in v1.4.1
* Update the copyright year in license by @Orhun Parmaksız
* bump dependencies by @Orhun Parmaksız
* update cargo-deny config by @Orhun Parmaksız
* prepare for 1.4.1 by @Orhun Parmaksız

**Full Changelog**: https://gitlab.com/archlinux/arch-repro-status/compare/v1.4.0...v1.4.1



================================================
FILE: .github/fixtures/test-custom-scope/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for group, commits in commits | group_by(attribute="scope") %}
        #### {{ group | upper_first }}
        {% for commit in commits %}
            - {{ commit.message | upper_first }}\
        {% endfor %}
    {% endfor %}\
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/test-custom-scope/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2"
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2"
git tag v0.1.0


================================================
FILE: .github/fixtures/test-custom-scope/expected.md
================================================
## [0.1.0] - 2022-04-06

### Bug Fixes

#### Cli

- Fix feature 1
- Fix feature 2

### Features

#### App

- Add feature 1

#### Gui

- Add feature 2



================================================
FILE: .github/fixtures/test-custom-tag-pattern/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="alpha-") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/test-custom-tag-pattern/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
git tag beta-0.1.0
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
git tag alpha-0.1.0
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2"
git tag beta-0.2.0
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2"
git tag alpha-0.2.0
GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests"


================================================
FILE: .github/fixtures/test-custom-tag-pattern/expected.md
================================================
## [unreleased]

### Test

- Add tests

## [0.2.0] - 2022-04-06

### Bug Fixes

- Fix feature 2

### Features

- Add feature 2

## [0.1.0] - 2022-04-06

### Bug Fixes

- Fix feature 1

### Features

- Add feature 1



================================================
FILE: .github/fixtures/test-date-order/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""


================================================
FILE: .github/fixtures/test-date-order/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 2"
git tag v0.2.0

git checkout v0.1.0
GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: fix feature 1"
git tag v0.1.1


================================================
FILE: .github/fixtures/test-date-order/expected.md
================================================
## [0.1.1] - 2021-01-23

### <!-- 0 -->🚀 Features

- Fix feature 1



================================================
FILE: .github/fixtures/test-fail-on-unmatched-commit/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for group, commits in commits | group_by(attribute="scope") %}
        #### {{ group | upper_first }}
        {% for commit in commits %}
            - {{ commit.message | upper_first }}\
        {% endfor %}
    {% endfor %}\
{% endfor %}\n
"""

[git]
fail_on_unmatched_commit = true
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", skip = true },
    { message = "Initial commit", skip = true },
]
# Prevent commits that are breaking from being excluded by commit parsers.
protect_breaking_commits = true


================================================
FILE: .github/fixtures/test-fail-on-unmatched-commit/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "invalid: text text"
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui)!: add feature 2"
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui)!: fix feature 2"

git tag v0.1.0


================================================
FILE: .github/fixtures/test-fail-on-unmatched-commit/expected.rc
================================================
1

================================================
FILE: .github/fixtures/test-fixtures-locally.sh
================================================
#!/usr/bin/env bash
set -e

SCRIPT_DIR=$(readlink -f "$(dirname "$0")")

if [ -z "$1" ]; then
	echo "Please input a fixture name."
	exit 1
fi

export FIXTURES_DIR="$SCRIPT_DIR/$1"

# Set up a temporary repository
cd "$(mktemp -d)"
git init >&2

# Commit
"$FIXTURES_DIR/commit.sh"

# Check if we are running on Windows with MINGW64 and if cygpath is available
if [ -n "$MSYSTEM" ] && [ "$MSYSTEM" = "MINGW64" ]; then
  echo "Running inside MINGW64 trying to convert paths to Windows format."
  if command -v cygpath > /dev/null 2>&1; then
    # Convert the path to Windows format
    SCRIPT_DIR=$(cygpath -w "$SCRIPT_DIR")
    FIXTURES_DIR=$(cygpath -w "$FIXTURES_DIR")
  else
    echo "WARNING: cygpath command not found in the PATH. The script may not work correctly on Windows."
    exit 1
  fi
fi

# Show results
echo -e "\n---Run git-cliff---" >&2
cargo run --manifest-path "$SCRIPT_DIR/../../Cargo.toml" -- -vv --config "$FIXTURES_DIR/cliff.toml" "${@:2}" -o "$FIXTURES_DIR/output.md"

sed -i "s/2022-04-05/2022-04-06/g" "$FIXTURES_DIR/output.md"

diff --strip-trailing-cr "$FIXTURES_DIR/output.md" "$FIXTURES_DIR/expected.md"


================================================
FILE: .github/fixtures/test-footer-filter/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# regex for parsing and grouping commits
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
    # Accept both separators, ": " and ":".
    # Conventional commits require the separator to be ": ", but the reference implementation of the
    # conventional commits parser currently does not adhere to the specification. See also:
    # https://github.com/conventional-commits/parser/issues/47
    { footer = "^changelog: ?ignore", skip = true },
]


================================================
FILE: .github/fixtures/test-footer-filter/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 00:00:00" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 00:10:00" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0
GIT_COMMITTER_DATE="2022-04-06 01:00:00" git commit --allow-empty -m "refactor: change feature 1" -m "BREAKING CHANGE: feature 1 is now different"
GIT_COMMITTER_DATE="2022-04-06 01:10:00" git commit --allow-empty -m "chore: upgrade dependencies" -m "changelog: ignore"
git tag v0.2.0
GIT_COMMITTER_DATE="2022-04-06 02:00:00" git commit --allow-empty -m "test: add tests" -m "footer: some more info"
GIT_COMMITTER_DATE="2022-04-06 02:10:00" git commit --allow-empty -m "test: add more tests" -m "changelog: ignore"


================================================
FILE: .github/fixtures/test-footer-filter/expected.md
================================================
## [unreleased]

### Test

- Add tests

## [0.2.0] - 2022-04-06

### Refactor

- Change feature 1

## [0.1.0] - 2022-04-06

### Features

- Add feature 1



================================================
FILE: .github/fixtures/test-footer-template/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""
# A Tera template to be rendered as the changelog's footer.
# See https://keats.github.io/tera/docs/#introduction
footer = """
{% for release in releases %}\
    {% if release.version %}\
        {% if release.previous.version %}\
            <!--{{ release.previous.version }}..{{ release.version }}-->
        {% endif %}\
    {% else %}\
        <!--{{ release.previous.version }}..HEAD-->
    {% endif %}\
{% endfor %}\
"""


================================================
FILE: .github/fixtures/test-footer-template/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2"
git tag v0.2.0

GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: add footer"
git tag v3.0.0

GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "test: footer"
GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "perf: footer"


================================================
FILE: .github/fixtures/test-footer-template/expected.md
================================================
## [unreleased]

### <!-- 4 -->⚡ Performance

- Footer

### <!-- 6 -->🧪 Testing

- Footer

## [3.0.0]

### <!-- 0 -->🚀 Features

- Add footer

## [0.2.0]

### <!-- 1 -->🐛 Bug Fixes

- Fix feature 1
- Fix feature 2

## [0.1.0]

### <!-- 0 -->🚀 Features

- Add feature 1
- Add feature 2

<!--v3.0.0..HEAD-->
<!--v0.2.0..v3.0.0-->
<!--v0.1.0..v0.2.0-->



================================================
FILE: .github/fixtures/test-from-context/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}{% if extra.note %} - {{ extra.note }}{% endif %}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}{% if commit.extra.note %} ({{ commit.extra.note }}){% endif %}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# regex for parsing and grouping commits
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/test-from-context/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
git tag v0.1.0
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2"
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2 SHOULD NOT BE IN THE CHANGELOG"
git tag v0.2.0
GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests"


================================================
FILE: .github/fixtures/test-from-context/context.json
================================================
[
  {
    "version": null,
    "message": null,
    "commits": [
      {
        "id": "c7541276668616c136d12a9ccd87087314d66fb6",
        "message": "add tests",
        "body": null,
        "footers": [],
        "group": "test",
        "breaking_description": null,
        "breaking": false,
        "scope": null,
        "links": [],
        "author": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1723730666
        },
        "committer": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1649201113
        },
        "conventional": true,
        "merge_commit": false,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        }
      }
    ],
    "commit_id": null,
    "timestamp": 0,
    "previous": {
      "version": "v0.2.0",
      "message": null,
      "commits": [
        {
          "id": "ce8cecc9834e5cbdb5b4e79c8260cace3c0dd949",
          "message": "feat(gui): add feature 2\n",
          "group": null,
          "scope": null,
          "links": [],
          "author": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1723730666
          },
          "committer": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1649201111
          },
          "conventional": false,
          "merge_commit": false,
          "github": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitlab": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitea": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "bitbucket": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "azure_devops": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          }
        },
        {
          "id": "5061081d6272b1da2146fab49d803c193db309d9",
          "message": "fix(gui): fix feature 2\n",
          "group": null,
          "scope": null,
          "links": [],
          "author": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1723730666
          },
          "committer": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1649201112
          },
          "conventional": false,
          "merge_commit": false,
          "github": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitlab": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitea": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "bitbucket": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "azure_devops": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          }
        }
      ],
      "commit_id": "5061081d6272b1da2146fab49d803c193db309d9",
      "timestamp": 1649201112,
      "previous": null,
      "repository": "/home/johndoe/repo/",
      "commit_range": null,
      "submodule_commits": {},
      "github": {
        "contributors": []
      },
      "gitlab": {
        "contributors": []
      },
      "gitea": {
        "contributors": []
      },
      "bitbucket": {
        "contributors": []
      },
      "azure_devops": {
        "contributors": []
      }
    },
    "repository": "/home/johndoe/repo/",
    "commit_range": null,
    "submodule_commits": {},
    "github": {
      "contributors": []
    },
    "gitlab": {
      "contributors": []
    },
    "gitea": {
      "contributors": []
    },
    "bitbucket": {
      "contributors": []
    },
    "azure_devops": {
      "contributors": []
    }
  },
  {
    "version": "v0.2.0",
    "message": null,
    "commits": [
      {
        "id": "ce8cecc9834e5cbdb5b4e79c8260cace3c0dd949",
        "message": "add feature 2",
        "body": null,
        "footers": [],
        "group": "Features",
        "breaking_description": null,
        "breaking": false,
        "scope": "gui",
        "links": [],
        "author": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1723730666
        },
        "committer": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1649201111
        },
        "conventional": true,
        "merge_commit": false,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        }
      },
      {
        "id": "5061081d6272b1da2146fab49d803c193db309d9",
        "message": "fix feature 2",
        "body": null,
        "footers": [],
        "group": "Bug Fixes",
        "breaking_description": null,
        "breaking": false,
        "scope": "cli",
        "links": [],
        "author": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1723730666
        },
        "committer": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1649201112
        },
        "conventional": true,
        "merge_commit": false,
        "extra": {
          "note": "that was a tough one"
        },
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        }
      }
    ],
    "commit_id": "5061081d6272b1da2146fab49d803c193db309d9",
    "timestamp": 1649201112,
    "previous": {
      "version": "v0.1.0",
      "message": null,
      "commits": [
        {
          "id": "c6ba7fe73c3b639ff2f934f3f98e5f50350ab463",
          "message": "Initial commit\n",
          "group": null,
          "scope": null,
          "links": [],
          "author": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1723730666
          },
          "committer": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1649201108
          },
          "conventional": false,
          "merge_commit": false,
          "github": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitlab": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitea": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "bitbucket": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "azure_devops": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          }
        },
        {
          "id": "9c10e506bf103998e303d8164c7b4a1a841e2471",
          "message": "feat: add feature 1\n",
          "group": null,
          "scope": null,
          "links": [],
          "author": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1723730666
          },
          "committer": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1649201109
          },
          "conventional": false,
          "merge_commit": false,
          "github": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitlab": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitea": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "bitbucket": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "azure_devops": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          }
        },
        {
          "id": "98b1464c2f99a0c6812ce6d3ea4a5b953dd35fe2",
          "message": "fix: fix feature 1\n",
          "group": null,
          "scope": null,
          "links": [],
          "author": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1723730666
          },
          "committer": {
            "name": "John Doe",
            "email": "john@doe.com",
            "timestamp": 1649201110
          },
          "conventional": false,
          "merge_commit": false,
          "github": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitlab": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "gitea": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "bitbucket": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          },
          "azure_devops": {
            "username": null,
            "pr_title": null,
            "pr_number": null,
            "pr_labels": [],
            "is_first_time": false
          }
        }
      ],
      "commit_id": "98b1464c2f99a0c6812ce6d3ea4a5b953dd35fe2",
      "timestamp": 1649201110,
      "previous": null,
      "repository": "/home/johndoe/repo/",
      "commit_range": null,
      "submodule_commits": {},
      "github": {
        "contributors": []
      },
      "gitlab": {
        "contributors": []
      },
      "gitea": {
        "contributors": []
      },
      "bitbucket": {
        "contributors": []
      },
      "azure_devops": {
        "contributors": []
      }
    },
    "extra": {
      "note": "This is so awesome!"
    },
    "repository": "/home/johndoe/repo/",
    "commit_range": null,
    "submodule_commits": {},
    "github": {
      "contributors": []
    },
    "gitlab": {
      "contributors": []
    },
    "gitea": {
      "contributors": []
    },
    "bitbucket": {
      "contributors": []
    },
    "azure_devops": {
      "contributors": []
    }
  },
  {
    "version": "v0.1.0",
    "message": null,
    "commits": [
      {
        "id": "9c10e506bf103998e303d8164c7b4a1a841e2471",
        "message": "add feature 1",
        "body": null,
        "footers": [],
        "group": "Features",
        "breaking_description": null,
        "breaking": false,
        "scope": "app",
        "links": [],
        "author": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1723730666
        },
        "committer": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1649201109
        },
        "conventional": true,
        "merge_commit": false,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        }
      },
      {
        "id": "98b1464c2f99a0c6812ce6d3ea4a5b953dd35fe2",
        "message": "fix feature 1",
        "body": null,
        "footers": [],
        "group": "Bug Fixes",
        "breaking_description": null,
        "breaking": false,
        "scope": "cli",
        "links": [],
        "author": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1723730666
        },
        "committer": {
          "name": "John Doe",
          "email": "john@doe.com",
          "timestamp": 1649201110
        },
        "conventional": true,
        "merge_commit": false,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        }
      }
    ],
    "commit_id": "98b1464c2f99a0c6812ce6d3ea4a5b953dd35fe2",
    "timestamp": 1649201110,
    "previous": {
      "version": null,
      "message": null,
      "commits": [],
      "commit_id": null,
      "timestamp": 0,
      "previous": null,
      "repository": null,
      "commit_range": null,
      "submodule_commits": {},
      "github": {
        "contributors": []
      },
      "gitlab": {
        "contributors": []
      },
      "gitea": {
        "contributors": []
      },
      "bitbucket": {
        "contributors": []
      },
      "azure_devops": {
        "contributors": []
      }
    },
    "repository": "/home/johndoe/repo/",
    "commit_range": null,
    "submodule_commits": {},
    "github": {
      "contributors": []
    },
    "gitlab": {
      "contributors": []
    },
    "gitea": {
      "contributors": []
    },
    "bitbucket": {
      "contributors": []
    },
    "azure_devops": {
      "contributors": []
    }
  }
]

================================================
FILE: .github/fixtures/test-from-context/expected.md
================================================
## [unreleased]

### Test

- Add tests

## [0.2.0] - 2022-04-05 - This is so awesome!

### Bug Fixes

- Fix feature 2 (that was a tough one)

### Features

- Add feature 2

## [0.1.0] - 2022-04-05

### Bug Fixes

- Fix feature 1

### Features

- Add feature 1



================================================
FILE: .github/fixtures/test-from-context-does-not-discard-fields/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% for group, commits in commits | group_by(attribute="group") %}
    ## {{ group | striptags | trim | upper_first }}
    {% for commit in commits %}
          {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
          {% if commit.breaking %}[**breaking**]: {{ commit.breaking_description }}{% endif %}
          {{ commit.message }}: {{ commit.body }}\
          {% for footer in commit.footers %}
            - {{ footer.token }}{{ footer.separator }} {{ footer.value }}\
          {% endfor %}
    {% endfor %}\
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
  { message = "^feat", group = "Features", default_scope = "app" },
  { message = "^fix" },
]


================================================
FILE: .github/fixtures/test-from-context-does-not-discard-fields/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m \
    "feat(web): feature 1, breaking change in footer

Body feature 1

BREAKING CHANGE: breaking change description feature 1
Signed-off-by: user1 <user1@example.com>
Reviewed-by: user2
"

GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m \
    "feat(web)!: feature 2, breaking chain in description

Body feature 2

Signed-off-by: user3 <user3@example.com>
"

GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m \
    "feat!: feature 3, use default scope = app

Body feature 2

Signed-off-by: user3 <user3@example.com>
"

GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m \
    "fix(scope): fix 1, use scope as group

Body fix 1

Fix: #1
"

GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m \
    "fix(front-end): fix 2, no footer

Body fix 2
"

GIT_COMMITTER_DATE="2022-04-06 01:25:14" git commit --allow-empty -m \
    "fix(front-end): fix 3 and 4, no body but footer

Fix: #3
Fix: #4
"

git tag v0.1.0


================================================
FILE: .github/fixtures/test-from-context-does-not-discard-fields/context.json
================================================
[
  {
    "version": "v0.1.0",
    "message": null,
    "commits": [
      {
        "id": "ab06a042344dbd1c4af974ef393049b44ad0ae28",
        "message": "feature 1, breaking change in footer",
        "body": "Body feature 1",
        "footers": [
          {
            "token": "BREAKING CHANGE",
            "separator": ":",
            "value": "breaking change description feature 1",
            "breaking": true
          },
          {
            "token": "Signed-off-by",
            "separator": ":",
            "value": "user1 <user1@example.com>",
            "breaking": false
          },
          {
            "token": "Reviewed-by",
            "separator": ":",
            "value": "user2",
            "breaking": false
          }
        ],
        "group": "Features",
        "breaking_description": "breaking change description feature 1",
        "breaking": true,
        "scope": "web",
        "links": [],
        "author": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1728938297
        },
        "committer": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1649175909
        },
        "conventional": true,
        "merge_commit": false,
        "extra": null,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "raw_message": "feat(web): feature 1, breaking change in footer\n\nBody feature 1\n\nBREAKING CHANGE: breaking change description feature 1\nSigned-off-by: user1 <user1@example.com>\nReviewed-by: user2"
      },
      {
        "id": "a87599e6ecaf05e80ac4d87edd9a852fd8cad189",
        "message": "feature 2, breaking chain in description",
        "body": "Body feature 2",
        "footers": [
          {
            "token": "Signed-off-by",
            "separator": ":",
            "value": "user3 <user3@example.com>",
            "breaking": false
          }
        ],
        "group": "Features",
        "breaking_description": "feature 2, breaking chain in description",
        "breaking": true,
        "scope": "web",
        "links": [],
        "author": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1728938297
        },
        "committer": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1649175910
        },
        "conventional": true,
        "merge_commit": false,
        "extra": null,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "raw_message": "feat(web)!: feature 2, breaking chain in description\n\nBody feature 2\n\nSigned-off-by: user3 <user3@example.com>"
      },
      {
        "id": "9d83e631a1c57eec825f724283041662edd9230b",
        "message": "feature 3, use default scope = app",
        "body": "Body feature 2",
        "footers": [
          {
            "token": "Signed-off-by",
            "separator": ":",
            "value": "user3 <user3@example.com>",
            "breaking": false
          }
        ],
        "group": "Features",
        "breaking_description": "feature 3, use default scope = app",
        "breaking": true,
        "scope": "app",
        "links": [],
        "author": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1728938297
        },
        "committer": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1649175911
        },
        "conventional": true,
        "merge_commit": false,
        "extra": null,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "raw_message": "feat!: feature 3, use default scope = app\n\nBody feature 2\n\nSigned-off-by: user3 <user3@example.com>"
      },
      {
        "id": "3bb5b6f741fd40cc71f09d3c6a339e4b5d0843cc",
        "message": "fix 1, use scope as group",
        "body": "Body fix 1",
        "footers": [
          {
            "token": "Fix",
            "separator": ":",
            "value": "#1",
            "breaking": false
          }
        ],
        "group": "fix",
        "breaking_description": null,
        "breaking": false,
        "scope": "scope",
        "links": [],
        "author": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1728938297
        },
        "committer": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1649175912
        },
        "conventional": true,
        "merge_commit": false,
        "extra": null,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "raw_message": "fix(scope): fix 1, use scope as group\n\nBody fix 1\n\nFix: #1"
      },
      {
        "id": "856472f0e5b238278fe331dcc151a96982c5bbad",
        "message": "fix 2, no footer",
        "body": "Body fix 2",
        "footers": [],
        "group": "fix",
        "breaking_description": null,
        "breaking": false,
        "scope": "front-end",
        "links": [],
        "author": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1728938297
        },
        "committer": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1649175913
        },
        "conventional": true,
        "merge_commit": false,
        "extra": null,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "raw_message": "fix(front-end): fix 2, no footer\n\nBody fix 2"
      },
      {
        "id": "6e7a2b8e670a348ccfbae696fd850d8769c54360",
        "message": "fix 3 and 4, no body but footer",
        "body": null,
        "footers": [
          {
            "token": "Fix",
            "separator": ":",
            "value": "#3",
            "breaking": false
          },
          {
            "token": "Fix",
            "separator": ":",
            "value": "#4",
            "breaking": false
          }
        ],
        "group": "fix",
        "breaking_description": null,
        "breaking": false,
        "scope": "front-end",
        "links": [],
        "author": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1728938297
        },
        "committer": {
          "name": "github-actions[bot]",
          "email": "github-actions[bot]@users.noreply.github.com",
          "timestamp": 1649175914
        },
        "conventional": true,
        "merge_commit": false,
        "extra": null,
        "github": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitlab": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "gitea": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "bitbucket": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "azure_devops": {
          "username": null,
          "pr_title": null,
          "pr_number": null,
          "pr_labels": [],
          "is_first_time": false
        },
        "raw_message": "fix(front-end): fix 3 and 4, no body but footer\n\nFix: #3\nFix: #4"
      }
    ],
    "commit_id": "6e7a2b8e670a348ccfbae696fd850d8769c54360",
    "timestamp": 1649175914,
    "previous": {
      "version": null,
      "message": null,
      "commits": [],
      "commit_id": null,
      "timestamp": 0,
      "previous": null,
      "repository": null,
      "commit_range": null,
      "submodule_commits": {},
      "extra": null,
      "github": {
        "contributors": []
      },
      "gitlab": {
        "contributors": []
      },
      "gitea": {
        "contributors": []
      },
      "bitbucket": {
        "contributors": []
      },
      "azure_devops": {
        "contributors": []
      }
    },
    "repository": "/path/to/repository",
    "commit_range": null,
    "submodule_commits": {},
    "extra": null,
    "github": {
      "contributors": []
    },
    "gitlab": {
      "contributors": []
    },
    "gitea": {
      "contributors": []
    },
    "bitbucket": {
      "contributors": []
    },
    "azure_devops": {
      "contributors": []
    }
  }
]

================================================
FILE: .github/fixtures/test-from-context-does-not-discard-fields/expected.md
================================================

## Features

*(web)* [**breaking**]: breaking change description feature 1
feature 1, breaking change in footer: Body feature 1
- BREAKING CHANGE: breaking change description feature 1
- Signed-off-by: user1 <user1@example.com>
- Reviewed-by: user2

*(web)* [**breaking**]: feature 2, breaking chain in description
feature 2, breaking chain in description: Body feature 2
- Signed-off-by: user3 <user3@example.com>

*(app)* [**breaking**]: feature 3, use default scope = app
feature 3, use default scope = app: Body feature 2
- Signed-off-by: user3 <user3@example.com>

## Fix

*(scope)* 
fix 1, use scope as group: Body fix 1
- Fix: #1

*(front-end)* 
fix 2, no footer: Body fix 2

*(front-end)* 
fix 3 and 4, no body but footer: 
- Fix: #3
- Fix: #4



================================================
FILE: .github/fixtures/test-gitea-integration/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# Gitea integration for fetching commit metadata.
[remote.gitea]
owner = "ThetaDev"
repo = "git-cliff-readme-example"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
## What's Changed
{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %}
{%- endfor -%}

{% if gitea.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in gitea.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
    {%- endif %}
{%- endfor -%}
{% raw %}\n\n{% endraw -%}
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = true
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-gitea-integration/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://codeberg.org/ThetaDev/git-cliff-readme-example.git
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-gitea-integration/expected.md
================================================
## What's Changed
* Initial commit by @ThetaDev
* docs(project): add README.md by @ThetaDev
* feat(parser): add ability to parse arrays by @ThetaDev
* fix(args): rename help argument due to conflict by @ThetaDev
* docs(example)!: add tested usage example by @ThetaDev
* refactor(parser): expose string functions by @ThetaDev
* chore(release): add release script by @ThetaDev
* feat(config): support multiple file formats by @ThetaDev
* feat(cache): use cache while fetching pages by @ThetaDev

### New Contributors
* @ThetaDev made their first contribution



================================================
FILE: .github/fixtures/test-gitea-integration-custom-range/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# Gitea integration for fetching commit metadata.
[remote.gitea]
owner = "ThetaDev"
repo = "git-cliff-readme-example"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
## What's Changed
{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %}
{%- endfor -%}

{% if gitea.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in gitea.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
    {%- endif %}
{%- endfor -%}
{% raw %}\n\n{% endraw -%}
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = true
# Split commits on newlines, treating each line as an individual commit.
split_commits = false
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-gitea-integration-custom-range/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://codeberg.org/ThetaDev/git-cliff-readme-example.git
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-gitea-integration-custom-range/expected.md
================================================
## What's Changed
* feat(config): support multiple file formats by @ThetaDev
* feat(cache): use cache while fetching pages by @ThetaDev



================================================
FILE: .github/fixtures/test-github-integration/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# GitHub integration for fetching commit metadata.
[remote.github]
owner = "orhun"
repo = "git-cliff-readme-example"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
## What's Changed

{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %}
{%- endfor -%}

{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
    {%- endif %}
{%- endfor -%}

{% if version %}
    {% if previous.version %}
      **Full Changelog**: https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/compare/{{ previous.version }}...{{ version }}
    {% endif %}
{% else -%}
  {% raw %}\n{% endraw %}
{% endif %}
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-github-integration/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://github.com/orhun/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-github-integration/expected.md
================================================
## What's Changed
* feat(config): support multiple file formats by @orhun
* feat(cache): use cache while fetching pages by @orhun

## What's Changed in v1.0.1
* refactor(parser): expose string functions by @orhun
* chore(release): add release script by @orhun

**Full Changelog**: https://github.com/orhun/git-cliff-readme-example/compare/v1.0.0...v1.0.1

## What's Changed in v1.0.0
* Initial commit by @orhun
* docs(project): add README.md by @orhun
* feat(parser): add ability to parse arrays by @orhun
* fix(args): rename help argument due to conflict by @orhun
* docs(example)!: add tested usage example by @orhun

### New Contributors
* @orhun made their first contribution



================================================
FILE: .github/fixtures/test-github-integration-custom-range/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# GitHub integration for fetching commit metadata.
[remote.github]
owner = "orhun"
repo = "git-cliff-readme-example"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
## What's Changed

{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %}
{%- endfor -%}

{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
    {%- endif %}
{%- endfor -%}

{% if version %}
    {% if previous.version %}
      **Full Changelog**: https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/compare/{{ previous.version }}...{{ version }}
    {% endif %}
{% else -%}
  {% raw %}\n{% endraw %}
{% endif %}
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = true
# Split commits on newlines, treating each line as an individual commit.
split_commits = false
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-github-integration-custom-range/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://github.com/orhun/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-github-integration-custom-range/expected.md
================================================
## What's Changed in v1.0.1
* refactor(parser): expose string functions by @orhun
* chore(release): add release script by @orhun

**Full Changelog**: https://github.com/orhun/git-cliff-readme-example/compare/v1.0.0...v1.0.1



================================================
FILE: .github/fixtures/test-gitlab-integration/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# GitLab integration for fetching commit metadata.
[remote.gitlab]
owner = "dark0dave"
repo = "dotfiles"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
## What's Changed

{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %}
{%- endfor -%}

{% if gitlab.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in gitlab.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
    {%- endif %}
{%- endfor -%}

{% if version %}
    {% if previous.version %}
      **Full Changelog**: https://gitlab.com/{{ remote.gitlab.owner }}/{{ remote.gitlab.repo }}/compare/{{ previous.version }}...{{ version }}
    {% endif %}
{% else -%}
  {% raw %}\n{% endraw %}
{% endif %}
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-gitlab-integration/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://gitlab.com/dark0dave/dotfiles
git fetch
git checkout 3c048a1b6a32e6d1076581225b06dd41ee5a02ff


================================================
FILE: .github/fixtures/test-gitlab-integration/expected.md
================================================
## What's Changed
* Initial commit by @dark0dave
* Added tmux files by @dark0dave
* Updated readme by @dark0dave
* Updated readme and added zshrc files by @dark0dave
* Added python files by @dark0dave
* Added curl files by @dark0dave
* Zsh update by @dark0dave
* Update README.md by @dark0dave
* Fix for path by @dark0dave
* Update README.md by @dark0dave
* Started setup files by @dark0dave
* Updated tmux to be a little nicer by @dark0dave
* Merge branch 'feature/tmux-improvements' into 'master' by @dark0dave in #2



================================================
FILE: .github/fixtures/test-gitlab-integration-custom-range/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

# GitLab integration for fetching commit metadata.
[remote.gitlab]
owner = "dark0dave"
repo = "dotfiles"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
## What's Changed

{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %}
{%- endfor -%}

{% if gitlab.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
  {% raw %}\n{% endraw -%}
  ### New Contributors
{%- endif %}\
{% for contributor in gitlab.contributors | filter(attribute="is_first_time", value=true) %}
  * @{{ contributor.username }} made their first contribution
    {%- if contributor.pr_number %} in \
      [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
    {%- endif %}
{%- endfor -%}

{% if version %}
    {% if previous.version %}
      **Full Changelog**: https://gitlab.com/{{ remote.gitlab.owner }}/{{ remote.gitlab.repo }}/compare/{{ previous.version }}...{{ version }}
    {% endif %}
{% else -%}
  {% raw %}\n{% endraw %}
{% endif %}
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = true
# Split commits on newlines, treating each line as an individual commit.
split_commits = false
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  # Remove issue numbers.
  { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
]


================================================
FILE: .github/fixtures/test-gitlab-integration-custom-range/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://gitlab.com/dark0dave/dotfiles
git fetch
git checkout 3c048a1b6a32e6d1076581225b06dd41ee5a02ff


================================================
FILE: .github/fixtures/test-gitlab-integration-custom-range/expected.md
================================================
## What's Changed
* Added curl files by @dark0dave
* Zsh update by @dark0dave
* Update README.md by @dark0dave
* Fix for path by @dark0dave
* Update README.md by @dark0dave



================================================
FILE: .github/fixtures/test-header-template/cliff.toml
================================================
[changelog]
# template for the changelog footer
header = """
# Changelog
{% for release in releases %}\
    {% if release.version %}\
        {% if release.previous.version %}\
            <!--{{ release.previous.version }}..{{ release.version }}-->
        {% endif %}\
    {% else %}\
        <!--{{ release.previous.version }}..HEAD-->
    {% endif %}\
{% endfor %}\
"""
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}]
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""


================================================
FILE: .github/fixtures/test-header-template/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 2"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "fix: fix feature 2"
git tag v0.2.0

GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: add footer"
git tag v3.0.0

GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "test: footer"
GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "perf: footer"


================================================
FILE: .github/fixtures/test-header-template/expected.md
================================================
# Changelog
<!--v3.0.0..HEAD-->
<!--v0.2.0..v3.0.0-->
<!--v0.1.0..v0.2.0-->
## [unreleased]

### Perf

- Footer

### Test

- Footer

## [3.0.0]

### Feat

- Add footer

## [0.2.0]

### Fix

- Fix feature 1
- Fix feature 2

## [0.1.0]

### Feat

- Add feature 1
- Add feature 2


================================================
FILE: .github/fixtures/test-ignore-tags/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# Regex to select git tags that do not represent proper releases.
# Takes precedence over `tag_pattern`.
# Changes belonging to these releases will be included in the next release.
skip_tags = "v0.1.0-beta.1"
# Regex to exclude git tags after applying the tag_pattern.
ignore_tags = "v.*-beta.*"


================================================
FILE: .github/fixtures/test-ignore-tags/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add skip feature"
git tag v0.1.0-beta.1

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: fix feature 1"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:48" git commit --allow-empty -m "feat: add feature 2"
git tag v0.2.0-beta.1

GIT_COMMITTER_DATE="2021-01-23 01:23:49" git commit --allow-empty -m "feat: add feature 3"
git tag v0.2.0


================================================
FILE: .github/fixtures/test-ignore-tags/expected.md
================================================
## [0.2.0] - 2021-01-23

### <!-- 0 -->🚀 Features

- Add feature 2
- Add feature 3

## [0.1.0] - 2021-01-23

### <!-- 0 -->🚀 Features

- Add feature 1
- Fix feature 1



================================================
FILE: .github/fixtures/test-invert-ignore-tags/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# regex for skipping tags
skip_tags = "v0.1.0-beta.1"
# regex for ignoring tags
ignore_tags = "v.*-beta.*"
count_tags = "v0.2.0"


================================================
FILE: .github/fixtures/test-invert-ignore-tags/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add skip feature"
git tag v0.1.0-beta.1

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2021-01-23 01:23:47" git commit --allow-empty -m "feat: fix feature 1"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-23 01:23:48" git commit --allow-empty -m "feat: add feature 2"
git tag v0.2.0-beta.1

GIT_COMMITTER_DATE="2021-01-23 01:23:49" git commit --allow-empty -m "feat: add feature 3"
git tag v0.2.0


================================================
FILE: .github/fixtures/test-invert-ignore-tags/expected.md
================================================
## [0.2.0] - 2021-01-23

### <!-- 0 -->🚀 Features

- Add feature 1
- Fix feature 1
- Add feature 2
- Add feature 3



================================================
FILE: .github/fixtures/test-keep-a-changelog-links/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered as the changelog's header.
# See https://keats.github.io/tera/docs/#introduction
header = """
# Changelog\n
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n
"""
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% else %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% endif %}\
    {% endif %}\
{% else %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD)
      {% else %}\
          ## [Unreleased]
      {% endif %}\
    {% else %}\
        ## [Unreleased]
    {% endif %}\
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^.*: add", group = "Added" },
    { message = "^.*: support", group = "Added" },
    { message = "^.*: remove", group = "Removed" },
    { message = "^.*: delete", group = "Removed" },
    { message = "^test", group = "Fixed" },
    { message = "^fix", group = "Fixed" },
    { message = "^.*: fix", group = "Fixed" },
    { message = "^.*", group = "Changed" },
]
# Exclude commits that are not matched by any commit parser.
filter_commits = true
# Regex to select git tags that represent releases.
tag_pattern = "v[0-9]*"
# Regex to select git tags that do not represent proper releases.
# Takes precedence over `tag_pattern`.
# Changes belonging to these releases will be included in the next release.
skip_tags = "v0.1.0-beta.1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2"
git tag v0.2.0

GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links/expected.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased](https://github.com/dummy/dummy/compare/v0.2.0...HEAD)

### Fixed

- Fix feature 1

## [0.2.0](https://github.com/dummy/dummy/compare/v0.1.0...v0.2.0) - 2021-01-24

### Added

- Add feature 2

## [0.1.0](https://github.com/dummy/dummy/releases/tag/v0.1.0) - 2021-01-23

### Added

- Add feature 1



================================================
FILE: .github/fixtures/test-keep-a-changelog-links-current-arg/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered as the changelog's header.
# See https://keats.github.io/tera/docs/#introduction
header = """
# Changelog\n
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n
"""
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% else %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% endif %}\
    {% endif %}\
{% else %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD)
      {% else %}\
          ## [Unreleased]
      {% endif %}\
    {% else %}\
        ## [Unreleased]
    {% endif %}\
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^.*: add", group = "Added" },
    { message = "^.*: support", group = "Added" },
    { message = "^.*: remove", group = "Removed" },
    { message = "^.*: delete", group = "Removed" },
    { message = "^test", group = "Fixed" },
    { message = "^fix", group = "Fixed" },
    { message = "^.*: fix", group = "Fixed" },
    { message = "^.*", group = "Changed" },
]
# Exclude commits that are not matched by any commit parser.
filter_commits = true
# Regex to select git tags that represent releases.
tag_pattern = "v[0-9]*"
# Regex to select git tags that do not represent proper releases.
# Takes precedence over `tag_pattern`.
# Changes belonging to these releases will be included in the next release.
skip_tags = "v0.1.0-beta.1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-current-arg/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2"
git tag v0.2.0


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-current-arg/expected.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.2.0](https://github.com/dummy/dummy/compare/v0.1.0...v0.2.0) - 2021-01-24

### Added

- Add feature 2



================================================
FILE: .github/fixtures/test-keep-a-changelog-links-latest-arg/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered as the changelog's header.
# See https://keats.github.io/tera/docs/#introduction
header = """
# Changelog\n
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n
"""
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% else %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% endif %}\
    {% endif %}\
{% else %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD)
      {% else %}\
          ## [Unreleased]
      {% endif %}\
    {% else %}\
        ## [Unreleased]
    {% endif %}\
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^.*: add", group = "Added" },
    { message = "^.*: support", group = "Added" },
    { message = "^.*: remove", group = "Removed" },
    { message = "^.*: delete", group = "Removed" },
    { message = "^test", group = "Fixed" },
    { message = "^fix", group = "Fixed" },
    { message = "^.*: fix", group = "Fixed" },
    { message = "^.*", group = "Changed" },
]
# Exclude commits that are not matched by any commit parser.
filter_commits = true
# Regex to select git tags that represent releases.
tag_pattern = "v[0-9]*"
# Regex to select git tags that do not represent proper releases.
# Takes precedence over `tag_pattern`.
# Changes belonging to these releases will be included in the next release.
skip_tags = "v0.1.0-beta.1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-latest-arg/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2"
git tag v0.2.0

GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-latest-arg/expected.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.2.0](https://github.com/dummy/dummy/compare/v0.1.0...v0.2.0) - 2021-01-24

### Added

- Add feature 2



================================================
FILE: .github/fixtures/test-keep-a-changelog-links-no-tags/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered as the changelog's header.
# See https://keats.github.io/tera/docs/#introduction
header = """
# Changelog\n
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n
"""
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% else %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% endif %}\
    {% endif %}\
{% else %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD)
      {% else %}\
          ## [Unreleased]
      {% endif %}\
    {% else %}\
        ## [Unreleased]
    {% endif %}\
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^.*: add", group = "Added" },
    { message = "^.*: support", group = "Added" },
    { message = "^.*: remove", group = "Removed" },
    { message = "^.*: delete", group = "Removed" },
    { message = "^test", group = "Fixed" },
    { message = "^fix", group = "Fixed" },
    { message = "^.*: fix", group = "Fixed" },
    { message = "^.*", group = "Changed" },
]
# Exclude commits that are not matched by any commit parser.
filter_commits = true
# Regex to select git tags that represent releases.
tag_pattern = "v[0-9]*"
# Regex to select git tags that do not represent proper releases.
# Takes precedence over `tag_pattern`.
# Changes belonging to these releases will be included in the next release.
skip_tags = "v0.1.0-beta.1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-no-tags/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"

GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2"

GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-no-tags/expected.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- Add feature 1
- Add feature 2

### Fixed

- Fix feature 1



================================================
FILE: .github/fixtures/test-keep-a-changelog-links-one-tag/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered as the changelog's header.
# See https://keats.github.io/tera/docs/#introduction
header = """
# Changelog\n
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n
"""
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% else %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% endif %}\
    {% endif %}\
{% else %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD)
      {% else %}\
          ## [Unreleased]
      {% endif %}\
    {% else %}\
        ## [Unreleased]
    {% endif %}\
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^.*: add", group = "Added" },
    { message = "^.*: support", group = "Added" },
    { message = "^.*: remove", group = "Removed" },
    { message = "^.*: delete", group = "Removed" },
    { message = "^test", group = "Fixed" },
    { message = "^fix", group = "Fixed" },
    { message = "^.*: fix", group = "Fixed" },
    { message = "^.*", group = "Changed" },
]
# Exclude commits that are not matched by any commit parser.
filter_commits = true
# Regex to select git tags that represent releases.
tag_pattern = "v[0-9]*"
# Regex to select git tags that do not represent proper releases.
# Takes precedence over `tag_pattern`.
# Changes belonging to these releases will be included in the next release.
skip_tags = "v0.1.0-beta.1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-one-tag/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-one-tag/expected.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.1.0](https://github.com/dummy/dummy/releases/tag/v0.1.0) - 2021-01-23

### Added

- Add feature 1



================================================
FILE: .github/fixtures/test-keep-a-changelog-links-one-tag-bump-arg/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered as the changelog's header.
# See https://keats.github.io/tera/docs/#introduction
header = """
# Changelog\n
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n
"""
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% else %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% endif %}\
    {% endif %}\
{% else %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD)
      {% else %}\
          ## [Unreleased]
      {% endif %}\
    {% else %}\
        ## [Unreleased]
    {% endif %}\
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^.*: add", group = "Added" },
    { message = "^.*: support", group = "Added" },
    { message = "^.*: remove", group = "Removed" },
    { message = "^.*: delete", group = "Removed" },
    { message = "^test", group = "Fixed" },
    { message = "^fix", group = "Fixed" },
    { message = "^.*: fix", group = "Fixed" },
    { message = "^.*", group = "Changed" },
]
# Exclude commits that are not matched by any commit parser.
filter_commits = true
# Regex to select git tags that represent releases.
tag_pattern = "v[0-9]*"
# Regex to select git tags that do not represent proper releases.
# Takes precedence over `tag_pattern`.
# Changes belonging to these releases will be included in the next release.
skip_tags = "v0.1.0-beta.1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-one-tag-bump-arg/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "Initial commit"

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-one-tag-bump-arg/expected.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.1.1](https://github.com/dummy/dummy/compare/v0.1.0...v0.1.1) - <<DATE>>

### Fixed

- Fix feature 1

## [0.1.0](https://github.com/dummy/dummy/releases/tag/v0.1.0) - 2021-01-23

### Added

- Add feature 1



================================================
FILE: .github/fixtures/test-keep-a-changelog-links-tag-arg/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered as the changelog's header.
# See https://keats.github.io/tera/docs/#introduction
header = """
# Changelog\n
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n
"""
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% else %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% endif %}\
    {% endif %}\
{% else %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD)
      {% else %}\
          ## [Unreleased]
      {% endif %}\
    {% else %}\
        ## [Unreleased]
    {% endif %}\
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^.*: add", group = "Added" },
    { message = "^.*: support", group = "Added" },
    { message = "^.*: remove", group = "Removed" },
    { message = "^.*: delete", group = "Removed" },
    { message = "^test", group = "Fixed" },
    { message = "^fix", group = "Fixed" },
    { message = "^.*: fix", group = "Fixed" },
    { message = "^.*", group = "Changed" },
]
# Exclude commits that are not matched by any commit parser.
filter_commits = true
# Regex to select git tags that represent releases.
tag_pattern = "v[0-9]*"
# Regex to select git tags that do not represent proper releases.
# Takes precedence over `tag_pattern`.
# Changes belonging to these releases will be included in the next release.
skip_tags = "v0.1.0-beta.1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-tag-arg/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2"
git tag v0.2.0

GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-tag-arg/expected.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.3.0](https://github.com/dummy/dummy/compare/v0.2.0...v0.3.0) - <<DATE>>

### Fixed

- Fix feature 1

## [0.2.0](https://github.com/dummy/dummy/compare/v0.1.0...v0.2.0) - 2021-01-24

### Added

- Add feature 2

## [0.1.0](https://github.com/dummy/dummy/releases/tag/v0.1.0) - 2021-01-23

### Added

- Add feature 1



================================================
FILE: .github/fixtures/test-keep-a-changelog-links-unreleased-arg/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered as the changelog's header.
# See https://keats.github.io/tera/docs/#introduction
header = """
# Changelog\n
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n
"""
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/compare/{{ previous.version }}...{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% else %}\
          ## [{{ version | trim_start_matches(pat="v") }}](https://github.com/dummy/dummy/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
      {% endif %}\
    {% endif %}\
{% else %}\
    {% if previous %}\
      {% if previous.version %}\
          ## [Unreleased](https://github.com/dummy/dummy/compare/{{ previous.version }}...HEAD)
      {% else %}\
          ## [Unreleased]
      {% endif %}\
    {% else %}\
        ## [Unreleased]
    {% endif %}\
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "^.*: add", group = "Added" },
    { message = "^.*: support", group = "Added" },
    { message = "^.*: remove", group = "Removed" },
    { message = "^.*: delete", group = "Removed" },
    { message = "^test", group = "Fixed" },
    { message = "^fix", group = "Fixed" },
    { message = "^.*: fix", group = "Fixed" },
    { message = "^.*", group = "Changed" },
]
# Exclude commits that are not matched by any commit parser.
filter_commits = true
# Regex to select git tags that represent releases.
tag_pattern = "v[0-9]*"
# Regex to select git tags that do not represent proper releases.
# Takes precedence over `tag_pattern`.
# Changes belonging to these releases will be included in the next release.
skip_tags = "v0.1.0-beta.1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-unreleased-arg/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0

GIT_COMMITTER_DATE="2021-01-24 01:23:46" git commit --allow-empty -m "feat: add feature 2"
git tag v0.2.0

GIT_COMMITTER_DATE="2021-01-25 01:23:47" git commit --allow-empty -m "fix: fix feature 1"


================================================
FILE: .github/fixtures/test-keep-a-changelog-links-unreleased-arg/expected.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased](https://github.com/dummy/dummy/compare/v0.2.0...HEAD)

### Fixed

- Fix feature 1



================================================
FILE: .github/fixtures/test-latest-with-one-tag/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""


================================================
FILE: .github/fixtures/test-latest-with-one-tag/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2021-01-23 01:23:45" git commit --allow-empty -m "feat: initial commit"

GIT_COMMITTER_DATE="2021-01-23 01:23:46" git commit --allow-empty -m "feat: add feature 1"
git tag v0.1.0


================================================
FILE: .github/fixtures/test-latest-with-one-tag/expected.md
================================================
## [0.1.0] - 2021-01-23

### <!-- 0 -->🚀 Features

- Initial commit
- Add feature 1



================================================
FILE: .github/fixtures/test-limit-commits/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# Limit the total number of commits contained in the changelog.
limit_commits = 2


================================================
FILE: .github/fixtures/test-limit-commits/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1 (#1)"
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "refactor: move  classes"
git tag v0.1.0


================================================
FILE: .github/fixtures/test-limit-commits/expected.md
================================================
## [0.1.0] - 2022-04-06

### <!-- 1 -->🐛 Bug Fixes

- Fix feature 1 (#1)

### <!-- 2 -->🚜 Refactor

- Move  classes



================================================
FILE: .github/fixtures/test-monorepo-include-path/cliff.toml
================================================
[changelog]
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""

[git]
# regex for parsing and grouping commits
commit_parsers = [
    { message = "^feat", group = "Features", default_scope = "app" },
    { message = "^fix", group = "Bug Fixes", scope = "cli" },
]


================================================
FILE: .github/fixtures/test-monorepo-include-path/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://github.com/orhun/git-cliff
git fetch
mv cliff.toml cliff.toml.bak
git checkout 076feb74b4d8c8634669f57d4e2765c39490d80e
mv cliff.toml.bak cliff.toml


================================================
FILE: .github/fixtures/test-monorepo-include-path/expected.md
================================================
## [unreleased]

### Bug Fixes

- Include the root commit when `--latest` is used with one tag (#901)
- Match PR and release metadata correctly (#907)
- Fix missing commit fields in context (#837) (#920)
- Preserve first time contributors (#925)

### Features

- Allow overriding the remote API URL via config (#896)



================================================
FILE: .github/fixtures/test-no-exec/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}\
    {% endfor %}
{% endfor %}\n
"""
# An array of regex based postprocessors to modify the changelog.
postprocessors = [
  { pattern = '.*', replace_command = 'this_command_does_not_exist' },
]

[git]
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
  { message = "^feat", group = "Features", default_scope = "app" },
  { message = "^fix", group = "Bug Fixes", scope = "cli" },
]
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
  { pattern = '.*', replace_command = "this_command_does_not_exist" },
]


================================================
FILE: .github/fixtures/test-no-exec/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1"
git tag v0.1.0
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "feat(gui): add feature 2"
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty -m "fix(gui): fix feature 2"
git tag v0.2.0
GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty -m "test: add tests"


================================================
FILE: .github/fixtures/test-no-exec/expected.md
================================================
## [unreleased]

### Test

- Add tests

## [0.2.0] - 2022-04-06

### Bug Fixes

- Fix feature 2

### Features

- Add feature 2

## [0.1.0] - 2022-04-06

### Bug Fixes

- Fix feature 1

### Features

- Add feature 1



================================================
FILE: .github/fixtures/test-offline/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[remote]
# Should make us avoid all calls to external services
offline = true

# GitHub integration for fetching commit metadata.
[remote.github]
owner = "orhun"
repo = "git-cliff-readme-example"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
## What's Changed

{%- if version %} in {{ version }}{%- endif -%}
{% for commit in commits %}
  * {{ commit.message | split(pat="\n") | first | trim }}\
    {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}
    {% if commit.remote.pr_number %} in #{{ commit.remote.pr_number }}{%- endif %}
{%- endfor -%}

{% if version %}
    {% if previous.version %}
      **Full Changelog**: https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/compare/{{ previous.version }}...{{ version }}
    {% endif %}
{% else -%}
  {% raw %}\n{% endraw %}
{% endif %}
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false


================================================
FILE: .github/fixtures/test-offline/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://github.com/orhun/git-cliff-readme-example
git pull origin master
git fetch --tags


================================================
FILE: .github/fixtures/test-offline/expected.md
================================================
## What's Changed
* feat(config): support multiple file formats
* feat(cache): use cache while fetching pages

## What's Changed in v1.0.1
* refactor(parser): expose string functions
* chore(release): add release script

**Full Changelog**: https://github.com/orhun/git-cliff-readme-example/compare/v1.0.0...v1.0.1

## What's Changed in v1.0.0
* Initial commit
* docs(project): add README.md
* feat(parser): add ability to parse arrays
* fix(args): rename help argument due to conflict
* docs(example)!: add tested usage example



================================================
FILE: .github/fixtures/test-override-scope/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## Unreleased
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for group, commits in commits | group_by(attribute="scope") %}
        #### {{ group | upper_first }}
        {% for commit in commits %}
            - {{ commit.message | upper_first }}\
        {% endfor %}
    {% endfor %}\
{% endfor %}\n
"""

[git]
conventional_commits = true
filter_unconventional = false
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's `scope` and can decide to exclude commits from further processing.
commit_parsers = [
    { message = "([Xx]enon)", scope = "Xenon" }
]


================================================
FILE: .github/fixtures/test-override-scope/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "fix(Xenon): first commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix(Xenon): second commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix(xenon): third commit"
git tag v0.1.0


================================================
FILE: .github/fixtures/test-override-scope/expected.md
================================================
## 0.1.0 - 2022-04-06

### Fix

#### Xenon

- First commit
- Second commit
- Third commit



================================================
FILE: .github/fixtures/test-regex-json-array/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[remote.github]
owner = "orhun"
repo = "git-cliff-readme-example-one-pr-one-commit"

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
    ## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | split(pat="\n") | nth(n=0) | trim_end }} \
        {%- if commit.remote.pr_number -%}
            ([PR #{{ commit.remote.pr_number }}](https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}/pull/{{ commit.remote.pr_number }}))\
        {%- endif -%}
    {% endfor %}
{% endfor %}\n
"""

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = false
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's `scope` and can decide to exclude commits from further processing.
commit_parsers = [
    { field = "remote.pr_labels", pattern = "area/documentation", group = "<!-- 05 -->📝 Documentation" },
    { field = "remote.pr_labels", pattern = "breaking change", group = "<!-- 00 -->💥 Breaking Changes" },
    { field = "remote.pr_labels", pattern = "type/bug", group = "<!-- 03 -->🐛 Bug Fixes" },
    { field = "remote.pr_labels", pattern = "type/enhancement", group = "<!-- 02 -->✨ Enhancements" },
    { field = "remote.pr_labels", pattern = "type/refactor", group = "<!-- 04 -->🧹 Refactoring" },
    { field = "remote.pr_labels", pattern = "type/update", group = "<!-- 01 -->🚀 Feature Updates" },
    { message = ".*", group = "<!-- 06 -->🌀 Miscellaneous" },
]


================================================
FILE: .github/fixtures/test-regex-json-array/commit.sh
================================================
#!/usr/bin/env bash
set -e

git remote add origin https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit
git pull origin main
git fetch --tags


================================================
FILE: .github/fixtures/test-regex-json-array/expected.md
================================================
## [unreleased]

### <!-- 02 -->✨ Enhancements

- feat(cache): use cache while fetching pages([PR #7](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/7))
- feat(config): support multiple file formats([PR #8](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/8))
- feat(parser): add ability to parse arrays([PR #9](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/9))

## [1.0.1] - 2025-06-18

### <!-- 01 -->🚀 Feature Updates

- chore(release): add release script([PR #6](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/6))

### <!-- 03 -->🐛 Bug Fixes

- fix(args): rename help argument due to conflict([PR #5](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/5))

## [1.0.0] - 2025-06-18

### <!-- 00 -->💥 Breaking Changes

- refactor(parser): expose string functions([PR #3](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/3))

### <!-- 05 -->📝 Documentation

- docs(project): add README.md([PR #2](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/2))
- docs(example)!: add tested usage example([PR #4](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/4))

### <!-- 06 -->🌀 Miscellaneous

- chore: initialize main
- initial commit([PR #1](https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit/pull/1))



================================================
FILE: .github/fixtures/test-regex-label-grouping/cliff.toml
================================================
[changelog]
body = """
### What's changed
{% for group, commits in commits | group_by(attribute="group") %}
  #### {{ group }}
  {% for commit in commits -%}
    - {{ commit.message }}
  {% endfor -%}\n
{% endfor %}\n
"""

[git]
commit_parsers = [
  { field = "author.name", pattern = "testa", group = "<!-- 0 -->TEST A" },
  { field = "author.name", pattern = "testb", group = "<!-- 1 -->TEST B" },
  { field = "author.name", pattern = "testc", group = "<!-- 2 -->TEST C" },
]


================================================
FILE: .github/fixtures/test-regex-label-grouping/commit.sh
================================================
#!/usr/bin/env bash
set -e

GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty --author="testa <testa@address.com>" -m "feat: add feature 1"
GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty --author="testa <testa@address.com>" -m "feat: add feature 2"
GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty --author="testb <testb@address.com>" -m "feat: add feature 3"
GIT_COMMITTER_DATE="2022-04-06 01:25:12" git commit --allow-empty --author="testb <testb@address.com>" -m "feat: add feature 4"
GIT_COMMITTER_DATE="2022-04-06 01:25:13" git commit --allow-empty --author="testc <testc@address.com>" -m "feat: add feature 5"
GIT_COMMITTER_DATE="2022-04-06 01:25:14" git commit --allow-empty --author="testc <testc@address.com>" -m "feat: add feature 6"    


================================================
FILE: .github/fixtures/test-regex-label-grouping/expected.md
================================================
### What's changed

#### <!-- 0 -->TEST A
- add feature 1
- add feature 2

#### <!-- 1 -->TEST B
- add feature 3
- add feature 4

#### <!-- 2 -->TEST C
- add feature 5
- add feature 6



================================================
FILE: .github/fixtures/test-regex-replace-parser/cliff.toml
================================================
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration

[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.g
Download .txt
gitextract_m2e076c7/

├── .cliffignore
├── .dockerignore
├── .editorconfig
├── .envrc
├── .git-blame-ignore-revs
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── feature_request.yml
│   │   └── integration.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── actions/
│   │   └── run-fixtures-test/
│   │       └── action.yml
│   ├── bors.toml
│   ├── config.yml
│   ├── dependabot.yml
│   ├── fixtures/
│   │   ├── README.md
│   │   ├── new-fixture-template/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-always-render/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-always-render-unreleased/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-azure-devops-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-azure-devops-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bitbucket-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bitbucket-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-initial-tag/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-initial-tag-cli-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-initial-tag-default/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-unreleased-with-tag-message-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-custom-minor/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-keep-zerover/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-major/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-minor/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bump-version-patch/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-bumped-version/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-cli-arg-ignore-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-cli-arg-skip-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-footers/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-preprocessors/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-range-with-given-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-commit-range-with-sort-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-configure-from-cargo-toml/
│   │   │   ├── Cargo.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-conventional-commit/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-custom-remote-api-url/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-custom-scope/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-custom-tag-pattern/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-date-order/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-fail-on-unmatched-commit/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.rc
│   │   ├── test-fixtures-locally.sh
│   │   ├── test-footer-filter/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-footer-template/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-from-context/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   ├── context.json
│   │   │   └── expected.md
│   │   ├── test-from-context-does-not-discard-fields/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   ├── context.json
│   │   │   └── expected.md
│   │   ├── test-gitea-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-gitea-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-github-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-github-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-gitlab-integration/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-gitlab-integration-custom-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-header-template/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-ignore-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-invert-ignore-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-current-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-latest-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-no-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-one-tag/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-one-tag-bump-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-tag-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-keep-a-changelog-links-unreleased-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-latest-with-one-tag/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-limit-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-monorepo-include-path/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-no-exec/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-offline/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-override-scope/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-regex-json-array/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-regex-label-grouping/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-regex-replace-parser/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-release-statistics/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-remote-config/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-require-conventional-negative/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.rc
│   │   ├── test-require-conventional-skipped/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-skip-breaking-changes/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-skip-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-skip-tags/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-split-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-submodules/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-submodules-include-path/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-submodules-include-path-config/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-submodules-range/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-tag-message/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-topo-order/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-topo-order-arg/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-topo-order-commits/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-unchanged-tag-date/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   ├── test-unreleased-tag-missing-release-commit/
│   │   │   ├── cliff.toml
│   │   │   ├── commit.sh
│   │   │   └── expected.md
│   │   └── test-workdir-include-path/
│   │       ├── cliff.toml
│   │       ├── commit.sh
│   │       └── expected.md
│   ├── mergify.yml
│   └── workflows/
│       ├── cd.yml
│       ├── check-semver.yml
│       ├── ci.yml
│       ├── codeql.yml
│       ├── dependency-review.yml
│       ├── docker.yml
│       ├── test-fixtures.yml
│       └── website.yml
├── .gitignore
├── .lycheeignore
├── .well-known/
│   └── funding-manifest-urls
├── CHANGELOG.md
├── CNAME
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── Dockerfile
├── LICENSE-APACHE
├── LICENSE-MIT
├── README.md
├── RELEASE.md
├── SECURITY.md
├── cliff.toml
├── codecov.yml
├── config/
│   └── cliff.toml
├── examples/
│   ├── azure-devops-keepachangelog.toml
│   ├── cocogitto.toml
│   ├── detailed.toml
│   ├── github-keepachangelog.toml
│   ├── github.toml
│   ├── keepachangelog.toml
│   ├── minimal.toml
│   ├── scoped.toml
│   ├── scopesorted.toml
│   ├── statistics.toml
│   └── unconventional.toml
├── flake.nix
├── git-cliff/
│   ├── Cargo.toml
│   ├── examples/
│   │   └── basic.rs
│   └── src/
│       ├── args.rs
│       ├── bin/
│       │   ├── completions.rs
│       │   └── mangen.rs
│       ├── lib.rs
│       ├── logger.rs
│       ├── main.rs
│       └── profiler.rs
├── git-cliff-core/
│   ├── Cargo.toml
│   ├── src/
│   │   ├── changelog.rs
│   │   ├── command.rs
│   │   ├── commit.rs
│   │   ├── config.rs
│   │   ├── contributor.rs
│   │   ├── embed.rs
│   │   ├── error.rs
│   │   ├── lib.rs
│   │   ├── release.rs
│   │   ├── remote/
│   │   │   ├── azure_devops.rs
│   │   │   ├── bitbucket.rs
│   │   │   ├── gitea.rs
│   │   │   ├── github.rs
│   │   │   ├── gitlab.rs
│   │   │   └── mod.rs
│   │   ├── repo.rs
│   │   ├── statistics.rs
│   │   ├── summary.rs
│   │   ├── tag.rs
│   │   └── template.rs
│   └── tests/
│       └── integration_test.rs
├── lychee.toml
├── npm/
│   ├── git-cliff/
│   │   ├── .gitignore
│   │   ├── .yarn/
│   │   │   └── releases/
│   │   │       └── yarn-4.1.0.cjs
│   │   ├── .yarnrc.yml
│   │   ├── eslint.config.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── cli.ts
│   │   │   ├── getExePath.ts
│   │   │   ├── index.ts
│   │   │   ├── options.ts
│   │   │   └── optionsToStringArgs.ts
│   │   ├── tsconfig.json
│   │   └── tsup.config.ts
│   └── package.json.tmpl
├── pypi/
│   ├── .gitignore
│   └── pyproject.toml
├── release.sh
├── rust-toolchain.toml
├── rustfmt.toml
├── typos.toml
└── website/
    ├── .gitignore
    ├── README.md
    ├── babel.config.js
    ├── blog/
    │   ├── authors.yml
    │   ├── git-cliff-0.5.0.md
    │   ├── git-cliff-1.2.0.md
    │   ├── git-cliff-1.3.0.md
    │   ├── git-cliff-1.4.0.md
    │   ├── git-cliff-2.0.0.md
    │   ├── git-cliff-2.10.0.md
    │   ├── git-cliff-2.11.0.md
    │   ├── git-cliff-2.12.0.md
    │   ├── git-cliff-2.2.0.md
    │   ├── git-cliff-2.3.0.md
    │   ├── git-cliff-2.4.0.md
    │   ├── git-cliff-2.5.0.md
    │   ├── git-cliff-2.6.0.md
    │   ├── git-cliff-2.7.0.md
    │   ├── git-cliff-2.8.0.md
    │   └── git-cliff-2.9.0.md
    ├── docs/
    │   ├── configuration/
    │   │   ├── bump.md
    │   │   ├── changelog.md
    │   │   ├── git.md
    │   │   ├── index.md
    │   │   └── remote.md
    │   ├── development/
    │   │   ├── _category_.json
    │   │   ├── contributing.md
    │   │   └── profiling.md
    │   ├── docker.md
    │   ├── github-actions/
    │   │   ├── _category_.json
    │   │   ├── git-cliff-action.md
    │   │   ├── setup-git-cliff.md
    │   │   └── taiki-e-install-action.md
    │   ├── gitlab.md
    │   ├── index.md
    │   ├── installation/
    │   │   ├── alpine-linux.md
    │   │   ├── arch-linux.md
    │   │   ├── binary-releases.md
    │   │   ├── build-from-source.md
    │   │   ├── conda-forge.md
    │   │   ├── crates-io.md
    │   │   ├── gentoo-linux.md
    │   │   ├── homebrew.md
    │   │   ├── index.md
    │   │   ├── macports.md
    │   │   ├── mise.md
    │   │   ├── nix.md
    │   │   ├── npm.md
    │   │   ├── pypi.md
    │   │   └── winget.md
    │   ├── integration/
    │   │   ├── _category_.json
    │   │   ├── azure-devops.md
    │   │   ├── bitbucket.md
    │   │   ├── gitea.md
    │   │   ├── github.md
    │   │   ├── gitlab.md
    │   │   ├── python.md
    │   │   └── rust.md
    │   ├── sourcehut.md
    │   ├── templating/
    │   │   ├── _category_.json
    │   │   ├── context.md
    │   │   ├── examples.md
    │   │   └── syntax.md
    │   ├── tips-and-tricks.md
    │   └── usage/
    │       ├── _category_.json
    │       ├── adding-commits.md
    │       ├── adding-tag-messages.md
    │       ├── args.md
    │       ├── bump-version.md
    │       ├── examples.md
    │       ├── initializing.md
    │       ├── jujutsu.md
    │       ├── load-context.md
    │       ├── monorepos.md
    │       ├── multiple-repos.md
    │       ├── print-context.md
    │       ├── skipping-commits.md
    │       └── submodules.md
    ├── docusaurus.config.js
    ├── package.json
    ├── sidebars.js
    ├── src/
    │   ├── components/
    │   │   ├── HomepageFeatures/
    │   │   │   ├── index.tsx
    │   │   │   └── styles.module.css
    │   │   └── Testimonials/
    │   │       ├── index.tsx
    │   │       └── styles.module.css
    │   ├── css/
    │   │   └── custom.css
    │   └── pages/
    │       ├── index.module.css
    │       └── index.tsx
    ├── static/
    │   ├── .nojekyll
    │   ├── 10k/
    │   │   └── index.html
    │   ├── favicon/
    │   │   └── site.webmanifest
    │   └── issues/
    │       └── index.html
    └── tsconfig.json
Download .txt
Showing preview only (580K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6125 symbols across 38 files)

FILE: git-cliff-core/src/changelog.rs
  type Changelog (line 24) | pub struct Changelog<'a> {
  function new (line 37) | pub fn new(releases: Vec<Release<'a>>, config: Config, range: Option<&st...
  function build (line 53) | fn build(releases: Vec<Release<'a>>, config: Config) -> Result<Self> {
  function from_context (line 72) | pub fn from_context<R: Read>(input: &mut R, config: Config) -> Result<Se...
  function add_context (line 83) | pub fn add_context(
  function process_commit (line 94) | fn process_commit(
  function check_conventional_commits (line 116) | fn check_conventional_commits(commits: &Vec<Commit<'a>>) -> Result<()> {
  function check_unmatched_commits (line 144) | fn check_unmatched_commits(commits: &Vec<Commit<'a>>) -> Result<()> {
  function process_commit_list (line 171) | fn process_commit_list(
  function process_commits (line 211) | fn process_commits(&mut self) -> Result<()> {
  function process_releases (line 244) | fn process_releases(&mut self) {
  function get_github_metadata (line 309) | fn get_github_metadata(&self, ref_name: Option<&str>) -> Result<crate::r...
  function get_gitlab_metadata (line 359) | fn get_gitlab_metadata(&self, ref_name: Option<&str>) -> Result<crate::r...
  function get_gitea_metadata (line 421) | fn get_gitea_metadata(&self, ref_name: Option<&str>) -> Result<crate::re...
  function get_bitbucket_metadata (line 471) | fn get_bitbucket_metadata(
  function get_azure_devops_metadata (line 522) | fn get_azure_devops_metadata(
  function add_remote_context (line 564) | pub fn add_remote_context(&mut self) -> Result<()> {
  function add_remote_data (line 574) | pub fn add_remote_data(&mut self, range: Option<&str>) -> Result<()> {
  function bump_version (line 644) | pub fn bump_version(&mut self) -> Result<Option<String>> {
  function generate (line 664) | pub fn generate<W: Write + ?Sized>(&self, out: &mut W) -> Result<()> {
  function prepend (line 727) | pub fn prepend<W: Write + ?Sized>(&self, mut changelog: String, out: &mu...
  function write_context (line 738) | pub fn write_context<W: Write + ?Sized>(&self, out: &mut W) -> Result<()> {
  function get_body_template (line 748) | fn get_body_template(config: &Config, trim: bool) -> Result<Template> {
  function get_test_data (line 779) | fn get_test_data() -> (Config, Vec<Release<'static>>) {
  function changelog_generator (line 1343) | fn changelog_generator() -> Result<()> {
  function changelog_generator_render_always (line 1441) | fn changelog_generator_render_always() -> Result<()> {
  function changelog_generator_split_commits (line 1475) | fn changelog_generator_split_commits() -> Result<()> {
  function changelog_adds_additional_context (line 1639) | fn changelog_adds_additional_context() -> Result<()> {

FILE: git-cliff-core/src/command.rs
  function run (line 11) | pub fn run(command: &str, input: Option<String>, envs: Vec<(&str, &str)>...
  function run_os_command (line 61) | fn run_os_command() -> Result<()> {

FILE: git-cliff-core/src/commit.rs
  type Link (line 19) | pub struct Link {
  type Footer (line 28) | struct Footer<'a> {
  function from (line 45) | fn from(footer: &'a ConventionalFooter<'a>) -> Self {
  type Signature (line 57) | pub struct Signature {
    method from (line 68) | fn from(signature: CommitSignature<'a>) -> Self {
  type Range (line 79) | pub struct Range {
    method new (line 89) | pub fn new(from: &Commit, to: &Commit) -> Self {
  type Commit (line 100) | pub struct Commit<'a> {
  function from (line 158) | fn from(message: String) -> Self {
  function from (line 181) | fn from(commit: &GitCommit<'_>) -> Self {
  function new (line 196) | pub fn new(id: String, message: String) -> Self {
  function raw_message (line 206) | pub fn raw_message(&self) -> &str {
  function process (line 215) | pub fn process(&self, config: &GitConfig) -> Result<Self> {
  function into_conventional (line 239) | pub fn into_conventional(mut self) -> Result<Self> {
  function preprocess (line 255) | pub fn preprocess(mut self, preprocessors: &[TextProcessor]) -> Result<S...
  function skip_commit (line 268) | fn skip_commit(&self, parser: &CommitParser, protect_breaking: bool) -> ...
  function parse (line 279) | pub fn parse(
  function parse_links (line 396) | pub fn parse_links(mut self, parsers: &[LinkParser]) -> Self {
  function footers (line 421) | fn footers(&self) -> impl Iterator<Item = Footer<'_>> {
  method serialize (line 430) | fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::E...
  function commits_to_conventional_commits (line 507) | pub(crate) fn commits_to_conventional_commits<'de, 'a, D: Deserializer<'...
  function conventional_commit (line 522) | fn conventional_commit() -> Result<()> {
  function conventional_footers (line 564) | fn conventional_footers() {
  function parse_link (line 616) | fn parse_link() -> Result<()> {
  function parse_commit (line 673) | fn parse_commit() {
  function parse_body (line 709) | fn parse_body() -> Result<()> {
  function parse_commit_field (line 770) | fn parse_commit_field() -> Result<()> {
  function commit_sha (line 924) | fn commit_sha() -> Result<()> {
  function field_name_regex (line 955) | fn field_name_regex() -> Result<()> {

FILE: git-cliff-core/src/config.rs
  constant DEFAULT_INITIAL_TAG (line 15) | const DEFAULT_INITIAL_TAG: &str = "0.1.0";
  type ManifestInfo (line 19) | struct ManifestInfo {
  type Config (line 51) | pub struct Config {
    method read_from_manifest (line 455) | pub fn read_from_manifest() -> Result<Option<String>> {
    method load (line 468) | pub fn load(path: &Path) -> Result<Config> {
    method retrieve_xdg_config_on_macos (line 500) | pub fn retrieve_xdg_config_on_macos() -> PathBuf {
    method retrieve_config_path (line 512) | pub fn retrieve_config_path() -> Option<PathBuf> {
  type ChangelogConfig (line 68) | pub struct ChangelogConfig {
  type GitConfig (line 87) | pub struct GitConfig {
  function serialize (line 154) | pub fn serialize<S>(patterns: &[Pattern], serializer: S) -> Result<S::Ok...
  function deserialize (line 165) | pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Pattern>, D::E...
  type RemoteConfig (line 179) | pub struct RemoteConfig {
    method is_any_set (line 203) | pub fn is_any_set(&self) -> bool {
    method enable_native_tls (line 228) | pub fn enable_native_tls(&mut self) {
  type Remote (line 254) | pub struct Remote {
    method fmt (line 277) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    method new (line 290) | pub fn new<S: Into<String>>(owner: S, repo: S) -> Self {
    method is_set (line 303) | pub fn is_set(&self) -> bool {
  function default_true (line 272) | fn default_true() -> bool {
  method eq (line 283) | fn eq(&self, other: &Self) -> bool {
  type BumpType (line 311) | pub enum BumpType {
  type Bump (line 322) | pub struct Bump {
    method get_initial_tag (line 374) | pub fn get_initial_tag(&self) -> String {
  type CommitParser (line 387) | pub struct CommitParser {
  type TextProcessor (line 416) | pub struct TextProcessor {
    method replace (line 428) | pub fn replace(&self, rendered: &mut String, command_envs: Vec<(&str, ...
  type LinkParser (line 442) | pub struct LinkParser {
  type Err (line 534) | type Err = error::Error;
  method from_str (line 537) | fn from_str(contents: &str) -> Result<Self> {
  function load (line 564) | fn load() -> Result<()> {
  function remote_config (line 603) | fn remote_config() {

FILE: git-cliff-core/src/contributor.rs
  type RemoteContributor (line 7) | pub struct RemoteContributor {
  method hash (line 21) | fn hash<H: Hasher>(&self, state: &mut H) {

FILE: git-cliff-core/src/embed.rs
  type EmbeddedConfig (line 16) | pub struct EmbeddedConfig;
    method get_config (line 20) | pub fn get_config() -> Result<String> {
    method parse (line 32) | pub fn parse() -> Result<Config> {
  type BuiltinConfig (line 42) | pub struct BuiltinConfig;
    method get_config (line 46) | pub fn get_config(mut name: String) -> Result<String> {
    method parse (line 63) | pub fn parse(name: String) -> Result<(Config, String)> {

FILE: git-cliff-core/src/error.rs
  type Error (line 5) | pub enum Error {
  type Result (line 122) | pub type Result<T> = core::result::Result<T, Error>;
  function mock_function (line 129) | fn mock_function() -> super::Result<Commit<'static>> {
  function throw_parse_error (line 134) | fn throw_parse_error() {

FILE: git-cliff-core/src/lib.rs
  constant DEFAULT_CONFIG (line 48) | pub const DEFAULT_CONFIG: &str = "cliff.toml";
  constant DEFAULT_OUTPUT (line 50) | pub const DEFAULT_OUTPUT: &str = "CHANGELOG.md";
  constant IGNORE_FILE (line 52) | pub const IGNORE_FILE: &str = ".cliffignore";

FILE: git-cliff-core/src/release.rs
  type Release (line 21) | pub struct Release<'a> {
  function calculate_next_version (line 88) | pub fn calculate_next_version(&self) -> Result<String> {
  function with_statistics (line 98) | pub fn with_statistics(mut self) -> Self {
  function calculate_next_version_with_config (line 107) | pub(super) fn calculate_next_version_with_config(&self, config: &Bump) -...
  type Releases (line 179) | pub struct Releases<'a> {
  function as_json (line 186) | pub fn as_json(&self) -> Result<String> {
  function bump_version (line 197) | fn bump_version() -> Result<()> {
  function with_statistics (line 389) | fn with_statistics() -> Result<()> {
  function update_github_metadata (line 410) | fn update_github_metadata() -> Result<()> {
  function update_gitlab_metadata (line 782) | fn update_gitlab_metadata() -> Result<()> {
  function update_gitea_metadata (line 1152) | fn update_gitea_metadata() -> Result<()> {
  function update_bitbucket_metadata (line 1496) | fn update_bitbucket_metadata() -> Result<()> {
  function update_azure_devops_metadata (line 1794) | fn update_azure_devops_metadata() -> Result<()> {

FILE: git-cliff-core/src/remote/azure_devops.rs
  constant START_FETCHING_MSG (line 11) | pub const START_FETCHING_MSG: &str = "Retrieving data from Azure DevOps....
  constant FINISHED_FETCHING_MSG (line 14) | pub const FINISHED_FETCHING_MSG: &str = "Done fetching Azure DevOps data.";
  constant TEMPLATE_VARIABLES (line 17) | pub(crate) const TEMPLATE_VARIABLES: &[&str] = &[
  type AzureDevOpsCommit (line 28) | pub struct AzureDevOpsCommit {
  method id (line 39) | fn id(&self) -> String {
  method username (line 43) | fn username(&self) -> Option<String> {
  method timestamp (line 47) | fn timestamp(&self) -> Option<i64> {
  type AzureDevOpsCommitsResponse (line 59) | pub struct AzureDevOpsCommitsResponse {
  type AzureDevOpsCommitAuthor (line 68) | pub struct AzureDevOpsCommitAuthor {
  type AzureDevOpsPullRequest (line 81) | pub struct AzureDevOpsPullRequest {
  method number (line 101) | fn number(&self) -> i64 {
  method title (line 105) | fn title(&self) -> Option<String> {
  method labels (line 109) | fn labels(&self) -> Vec<String> {
  method merge_commit (line 113) | fn merge_commit(&self) -> Option<String> {
  type AzureDevOpsPullRequestsResponse (line 122) | pub struct AzureDevOpsPullRequestsResponse {
  type AzureDevOpsPullRequestLabel (line 131) | pub struct AzureDevOpsPullRequestLabel {
  type AzureDevOpsCommitRef (line 138) | pub struct AzureDevOpsCommitRef {
  type AzureDevOpsUser (line 146) | pub struct AzureDevOpsUser {
  type AzureDevOpsClient (line 157) | pub struct AzureDevOpsClient {
    type Error (line 166) | type Error = Error;
    method try_from (line 167) | fn try_from(remote: Remote) -> Result<Self> {
    method commits_url (line 190) | fn commits_url(api_url: &str, remote: &Remote, ref_name: Option<&str>,...
    method pull_requests_url (line 212) | fn pull_requests_url(api_url: &str, remote: &Remote, page: i32) -> Str...
    method get_commits (line 228) | pub async fn get_commits(&self, ref_name: Option<&str>) -> Result<Vec<...
    method get_pull_requests (line 236) | pub async fn get_pull_requests(&self) -> Result<Vec<Box<dyn RemotePull...
    method get_commit_stream (line 241) | fn get_commit_stream(
    method get_pull_request_stream (line 279) | fn get_pull_request_stream(
  constant API_URL (line 176) | const API_URL: &'static str = "https://dev.azure.com";
  constant API_URL_ENV (line 177) | const API_URL_ENV: &'static str = "AZURE_DEVOPS_API_URL";
  method remote (line 179) | fn remote(&self) -> Remote {
  method client (line 183) | fn client(&self) -> ClientWithMiddleware {
  function commits_url (line 323) | fn commits_url() {
  function commits_url_with_tag (line 342) | fn commits_url_with_tag() {
  function commits_url_pagination (line 360) | fn commits_url_pagination() {
  function pull_requests_url (line 377) | fn pull_requests_url() {
  function client_try_from_remote (line 396) | fn client_try_from_remote() {
  function pull_request_with_commit_ref_no_commit_id (line 415) | fn pull_request_with_commit_ref_no_commit_id() {

FILE: git-cliff-core/src/remote/bitbucket.rs
  constant START_FETCHING_MSG (line 11) | pub const START_FETCHING_MSG: &str = "Retrieving data from Bitbucket...";
  constant FINISHED_FETCHING_MSG (line 14) | pub const FINISHED_FETCHING_MSG: &str = "Done fetching Bitbucket data.";
  constant TEMPLATE_VARIABLES (line 17) | pub(crate) const TEMPLATE_VARIABLES: &[&str] = &["bitbucket", "commit.bi...
  constant BITBUCKET_MAX_PAGE_PRS (line 20) | pub(crate) const BITBUCKET_MAX_PAGE_PRS: usize = 50;
  type BitbucketCommit (line 24) | pub struct BitbucketCommit {
  method id (line 34) | fn id(&self) -> String {
  method username (line 38) | fn username(&self) -> Option<String> {
  method timestamp (line 42) | fn timestamp(&self) -> Option<i64> {
  type BitbucketPagination (line 51) | pub struct BitbucketPagination<T> {
  type BitbucketCommitAuthor (line 69) | pub struct BitbucketCommitAuthor {
  type PullRequestLabel (line 78) | pub struct PullRequestLabel {
  type BitbucketPullRequestMergeCommit (line 85) | pub struct BitbucketPullRequestMergeCommit {
  type BitbucketPullRequest (line 92) | pub struct BitbucketPullRequest {
  method number (line 104) | fn number(&self) -> i64 {
  method title (line 108) | fn title(&self) -> Option<String> {
  method labels (line 112) | fn labels(&self) -> Vec<String> {
  method merge_commit (line 116) | fn merge_commit(&self) -> Option<String> {
  type BitbucketClient (line 123) | pub struct BitbucketClient {
    type Error (line 132) | type Error = Error;
    method try_from (line 133) | fn try_from(remote: Remote) -> Result<Self> {
    method commits_url (line 156) | fn commits_url(api_url: &str, remote: &Remote, ref_name: Option<&str>,...
    method pull_requests_url (line 170) | fn pull_requests_url(api_url: &str, remote: &Remote, page: i32) -> Str...
    method get_commits (line 180) | pub async fn get_commits(&self, ref_name: Option<&str>) -> Result<Vec<...
    method get_pull_requests (line 189) | pub async fn get_pull_requests(&self) -> Result<Vec<Box<dyn RemotePull...
    method get_commit_stream (line 195) | fn get_commit_stream(
    method get_pull_request_stream (line 234) | fn get_pull_request_stream(
  constant API_URL (line 142) | const API_URL: &'static str = "https://api.bitbucket.org/2.0/repositories";
  constant API_URL_ENV (line 143) | const API_URL_ENV: &'static str = "BITBUCKET_API_URL";
  method remote (line 145) | fn remote(&self) -> Remote {
  method client (line 149) | fn client(&self) -> ClientWithMiddleware {
  function timestamp (line 277) | fn timestamp() {

FILE: git-cliff-core/src/remote/gitea.rs
  constant START_FETCHING_MSG (line 11) | pub const START_FETCHING_MSG: &str = "Retrieving data from Gitea...";
  constant FINISHED_FETCHING_MSG (line 14) | pub const FINISHED_FETCHING_MSG: &str = "Done fetching Gitea data.";
  constant TEMPLATE_VARIABLES (line 17) | pub(crate) const TEMPLATE_VARIABLES: &[&str] = &["gitea", "commit.gitea"...
  type GiteaCommit (line 21) | pub struct GiteaCommit {
  method id (line 31) | fn id(&self) -> String {
  method username (line 35) | fn username(&self) -> Option<String> {
  method timestamp (line 39) | fn timestamp(&self) -> Option<i64> {
  type GiteaCommitAuthor (line 46) | pub struct GiteaCommitAuthor {
  type PullRequestLabel (line 54) | pub struct PullRequestLabel {
  type GiteaPullRequest (line 61) | pub struct GiteaPullRequest {
  method number (line 73) | fn number(&self) -> i64 {
  method title (line 77) | fn title(&self) -> Option<String> {
  method labels (line 81) | fn labels(&self) -> Vec<String> {
  method merge_commit (line 85) | fn merge_commit(&self) -> Option<String> {
  type GiteaClient (line 92) | pub struct GiteaClient {
    type Error (line 101) | type Error = Error;
    method try_from (line 102) | fn try_from(remote: Remote) -> Result<Self> {
    method commits_url (line 125) | fn commits_url(api_url: &str, remote: &Remote, ref_name: Option<&str>,...
    method pull_requests_url (line 139) | fn pull_requests_url(api_url: &str, remote: &Remote, page: i32) -> Str...
    method get_commits (line 149) | pub async fn get_commits(&self, ref_name: Option<&str>) -> Result<Vec<...
    method get_pull_requests (line 157) | pub async fn get_pull_requests(&self) -> Result<Vec<Box<dyn RemotePull...
    method get_commit_stream (line 162) | fn get_commit_stream(
    method get_pull_request_stream (line 200) | fn get_pull_request_stream(
  constant API_URL (line 111) | const API_URL: &'static str = "https://codeberg.org";
  constant API_URL_ENV (line 112) | const API_URL_ENV: &'static str = "GITEA_API_URL";
  method remote (line 114) | fn remote(&self) -> Remote {
  method client (line 118) | fn client(&self) -> ClientWithMiddleware {
  function timestamp (line 242) | fn timestamp() {

FILE: git-cliff-core/src/remote/github.rs
  constant START_FETCHING_MSG (line 11) | pub const START_FETCHING_MSG: &str = "Retrieving data from GitHub...";
  constant FINISHED_FETCHING_MSG (line 14) | pub const FINISHED_FETCHING_MSG: &str = "Done fetching GitHub data.";
  constant TEMPLATE_VARIABLES (line 17) | pub(crate) const TEMPLATE_VARIABLES: &[&str] = &["github", "commit.githu...
  type GitHubCommit (line 21) | pub struct GitHubCommit {
  type GitHubCommitDetails (line 32) | pub struct GitHubCommitDetails {
  type GitHubCommitDetailsAuthor (line 39) | pub struct GitHubCommitDetailsAuthor {
  method id (line 45) | fn id(&self) -> String {
  method username (line 49) | fn username(&self) -> Option<String> {
  method timestamp (line 53) | fn timestamp(&self) -> Option<i64> {
  type GitHubCommitAuthor (line 62) | pub struct GitHubCommitAuthor {
  type PullRequestLabel (line 70) | pub struct PullRequestLabel {
  type GitHubPullRequest (line 77) | pub struct GitHubPullRequest {
  method number (line 89) | fn number(&self) -> i64 {
  method title (line 93) | fn title(&self) -> Option<String> {
  method labels (line 97) | fn labels(&self) -> Vec<String> {
  method merge_commit (line 101) | fn merge_commit(&self) -> Option<String> {
  type GitHubClient (line 108) | pub struct GitHubClient {
    type Error (line 117) | type Error = Error;
    method try_from (line 118) | fn try_from(remote: Remote) -> Result<Self> {
    method commits_url (line 141) | fn commits_url(api_url: &str, remote: &Remote, ref_name: Option<&str>,...
    method pull_requests_url (line 155) | fn pull_requests_url(api_url: &str, remote: &Remote, page: i32) -> Str...
    method get_commits (line 165) | pub async fn get_commits(&self, ref_name: Option<&str>) -> Result<Vec<...
    method get_pull_requests (line 173) | pub async fn get_pull_requests(&self) -> Result<Vec<Box<dyn RemotePull...
    method get_commit_stream (line 178) | fn get_commit_stream(
    method get_pull_request_stream (line 216) | fn get_pull_request_stream(
  constant API_URL (line 127) | const API_URL: &'static str = "https://api.github.com";
  constant API_URL_ENV (line 128) | const API_URL_ENV: &'static str = "GITHUB_API_URL";
  method remote (line 130) | fn remote(&self) -> Remote {
  method client (line 134) | fn client(&self) -> ClientWithMiddleware {
  function timestamp (line 258) | fn timestamp() {

FILE: git-cliff-core/src/remote/gitlab.rs
  constant START_FETCHING_MSG (line 11) | pub const START_FETCHING_MSG: &str = "Retrieving data from GitLab...";
  constant FINISHED_FETCHING_MSG (line 14) | pub const FINISHED_FETCHING_MSG: &str = "Done fetching GitLab data.";
  constant TEMPLATE_VARIABLES (line 17) | pub(crate) const TEMPLATE_VARIABLES: &[&str] = &["gitlab", "commit.gitla...
  type GitLabProject (line 24) | pub struct GitLabProject {
  type GitLabCommit (line 46) | pub struct GitLabCommit {
  method id (line 76) | fn id(&self) -> String {
  method username (line 82) | fn username(&self) -> Option<String> {
  method timestamp (line 86) | fn timestamp(&self) -> Option<i64> {
  type GitLabMergeRequest (line 98) | pub struct GitLabMergeRequest {
  method number (line 128) | fn number(&self) -> i64 {
  method title (line 133) | fn title(&self) -> Option<String> {
  method labels (line 137) | fn labels(&self) -> Vec<String> {
  method merge_commit (line 141) | fn merge_commit(&self) -> Option<String> {
  type GitLabUser (line 152) | pub struct GitLabUser {
  type GitLabClient (line 169) | pub struct GitLabClient {
    type Error (line 178) | type Error = Error;
    method try_from (line 179) | fn try_from(remote: Remote) -> Result<Self> {
    method project_url (line 202) | fn project_url(api_url: &str, remote: &Remote) -> String {
    method commits_url (line 212) | fn commits_url(project_id: i64, api_url: &str, ref_name: Option<&str>,...
    method pull_requests_url (line 225) | fn pull_requests_url(project_id: i64, api_url: &str, page: i32) -> Str...
    method get_project (line 233) | pub async fn get_project(&self) -> Result<GitLabProject> {
    method get_commits (line 241) | pub async fn get_commits(
    method get_pull_requests (line 255) | pub async fn get_pull_requests(
    method get_commit_stream (line 263) | fn get_commit_stream(
    method get_pull_request_stream (line 303) | fn get_pull_request_stream(
  constant API_URL (line 188) | const API_URL: &'static str = "https://gitlab.com/api/v4";
  constant API_URL_ENV (line 189) | const API_URL_ENV: &'static str = "GITLAB_API_URL";
  method remote (line 191) | fn remote(&self) -> Remote {
  method client (line 195) | fn client(&self) -> ClientWithMiddleware {
  function gitlab_project_url_encodes_owner (line 346) | fn gitlab_project_url_encodes_owner() {
  function timestamp (line 360) | fn timestamp() {
  function pull_request_no_merge_commit (line 372) | fn pull_request_no_merge_commit() {
  function pull_request_squash_commit (line 381) | fn pull_request_squash_commit() {

FILE: git-cliff-core/src/remote/mod.rs
  constant USER_AGENT (line 43) | pub(crate) const USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), env!...
  constant REQUEST_TIMEOUT (line 46) | pub(crate) const REQUEST_TIMEOUT: u64 = 30;
  constant REQUEST_KEEP_ALIVE (line 49) | pub(crate) const REQUEST_KEEP_ALIVE: u64 = 60;
  constant MAX_PAGE_SIZE (line 52) | pub(crate) const MAX_PAGE_SIZE: usize = 100;
  type RemoteCommit (line 55) | pub trait RemoteCommit: DynClone {
    method id (line 57) | fn id(&self) -> String;
    method username (line 59) | fn username(&self) -> Option<String>;
    method timestamp (line 61) | fn timestamp(&self) -> Option<i64>;
    method convert_to_unix_timestamp (line 63) | fn convert_to_unix_timestamp(&self, date: &str) -> i64 {
  type RemotePullRequest (line 73) | pub trait RemotePullRequest: DynClone {
    method number (line 75) | fn number(&self) -> i64;
    method title (line 77) | fn title(&self) -> Option<String>;
    method labels (line 79) | fn labels(&self) -> Vec<String>;
    method merge_commit (line 81) | fn merge_commit(&self) -> Option<String>;
  type RemoteMetadata (line 87) | pub type RemoteMetadata = (Vec<Box<dyn RemoteCommit>>, Vec<Box<dyn Remot...
  type RemoteReleaseMetadata (line 91) | pub struct RemoteReleaseMetadata {
  method create_client (line 98) | fn create_client(&self, accept_header: &str) -> Result<ClientWithMiddlew...
  type RemoteClient (line 145) | pub trait RemoteClient {
    constant API_URL (line 147) | const API_URL: &'static str;
    constant API_URL_ENV (line 151) | const API_URL_ENV: &'static str;
    method api_url (line 154) | fn api_url(&self) -> String {
    method remote (line 162) | fn remote(&self) -> Remote;
    method client (line 165) | fn client(&self) -> ClientWithMiddleware;
    method get_json (line 170) | async fn get_json<T: DeserializeOwned>(&self, url: &str) -> Result<T> {

FILE: git-cliff-core/src/repo.rs
  constant CHANGED_FILES_CACHE (line 25) | const CHANGED_FILES_CACHE: &str = "changed_files_cache";
  type Repository (line 30) | pub struct Repository {
    method open (line 52) | fn open(path: PathBuf, search_parents: bool) -> Result<Self> {
    method discover (line 104) | pub fn discover(path: PathBuf) -> Result<Self> {
    method init (line 113) | pub fn init(path: PathBuf) -> Result<Self> {
    method root_path (line 118) | pub fn root_path(&self) -> Result<PathBuf> {
    method path (line 136) | pub fn path(&self) -> &PathBuf {
    method set_commit_range (line 144) | fn set_commit_range(
    method commits (line 163) | pub fn commits(
    method submodules_range (line 207) | pub fn submodules_range(
    method normalize_pattern (line 255) | fn normalize_pattern(pattern: Pattern) -> Pattern {
    method should_retain_commit (line 273) | fn should_retain_commit(
    method commit_changed_files (line 323) | fn commit_changed_files(&self, commit: &Commit) -> Vec<PathBuf> {
    method commit_changed_files_no_cache (line 371) | fn commit_changed_files_no_cache(&self, commit: &Commit) -> Vec<PathBu...
    method current_tag (line 415) | pub fn current_tag(&self) -> Option<Tag> {
    method resolve_tag (line 431) | pub fn resolve_tag(&self, name: &str) -> Tag {
    method find_commit (line 452) | pub fn find_commit(&self, id: &str) -> Option<Commit<'_>> {
    method should_include_tag (line 467) | fn should_include_tag(&self, head_commit: &Commit, tag_commit: &Commit...
    method tags (line 477) | pub fn tags(
    method upstream_remote (line 537) | pub fn upstream_remote(&self) -> Result<Remote> {
  type SubmoduleRange (line 39) | pub struct SubmoduleRange {
  function find_remote (line 565) | fn find_remote(url: &str) -> Result<Remote> {
  function url_path_segments (line 582) | fn url_path_segments(url: &str) -> Result<Remote> {
  function ssh_path_segments (line 609) | fn ssh_path_segments(url: &str) -> Result<Remote> {
  function get_last_commit_hash (line 645) | fn get_last_commit_hash() -> Result<String> {
  function get_root_commit_hash (line 657) | fn get_root_commit_hash() -> Result<String> {
  function get_last_tag (line 669) | fn get_last_tag() -> Result<String> {
  function get_repository (line 681) | fn get_repository() -> Result<Repository> {
  function http_url_repo_owner (line 691) | fn http_url_repo_owner() -> Result<()> {
  function ssh_url_repo_owner (line 700) | fn ssh_url_repo_owner() -> Result<()> {
  function get_latest_commit (line 709) | fn get_latest_commit() -> Result<()> {
  function commit_search (line 718) | fn commit_search() -> Result<()> {
  function get_latest_tag (line 729) | fn get_latest_tag() -> Result<()> {
  function git_tags (line 741) | fn git_tags() -> Result<()> {
  function git_upstream_remote (line 772) | fn git_upstream_remote() -> Result<()> {
  function resolves_existing_tag_with_name_and_message (line 790) | fn resolves_existing_tag_with_name_and_message() -> Result<()> {
  function resolves_tag_when_no_tags_exist (line 807) | fn resolves_tag_when_no_tags_exist() -> Result<()> {
  function includes_root_commit (line 816) | fn includes_root_commit() -> Result<()> {
  function create_temp_repo (line 826) | fn create_temp_repo() -> (Repository, TempDir) {
  function repository_path_not_found (line 862) | fn repository_path_not_found() {
  function discover_jujutsu_repo (line 876) | fn discover_jujutsu_repo() {
  function propagate_error_if_no_repo_found (line 913) | fn propagate_error_if_no_repo_found() {
  function repository_path_does_not_exist (line 931) | fn repository_path_does_not_exist() {
  function open_jujutsu_repo (line 945) | fn open_jujutsu_repo() {
  function propagate_error_if_no_repo_exist (line 983) | fn propagate_error_if_no_repo_exist() {
  function create_commit_with_files (line 1000) | fn create_commit_with_files<'a>(
  function test_should_retain_commit (line 1032) | fn test_should_retain_commit() {

FILE: git-cliff-core/src/statistics.rs
  type LinkCount (line 12) | pub struct LinkCount {
  type Statistics (line 23) | pub struct Statistics {
    method from (line 52) | fn from(release: &Release) -> Self {
  function from_release (line 135) | fn from_release() -> Result<()> {

FILE: git-cliff-core/src/summary.rs
  type CommitProcessingErrorKind (line 12) | pub enum CommitProcessingErrorKind {
    method from (line 30) | fn from(err: AppError) -> Self {
    method from (line 36) | fn from(err: &AppError) -> Self {
    method should_warn (line 68) | pub fn should_warn(self) -> bool {
  method fmt (line 52) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type Summary (line 84) | pub struct Summary {
    method record_ok (line 96) | pub fn record_ok(&mut self) {
    method record_err (line 101) | pub fn record_err(&mut self, err: &AppError) {
  function commit_processing_error_kind_from_app_error (line 118) | fn commit_processing_error_kind_from_app_error() {
  function commit_processing_error_kind_from_app_error_owned (line 153) | fn commit_processing_error_kind_from_app_error_owned() {
  function commit_processing_error_kind_should_warn_or_not (line 188) | fn commit_processing_error_kind_should_warn_or_not() {
  function commit_processing_error_kind_display_is_human_readable (line 199) | fn commit_processing_error_kind_display_is_human_readable() {
  function summary_record_ok_increments_processed_only (line 230) | fn summary_record_ok_increments_processed_only() {
  function summary_record_err_increments_processed_and_error_kind (line 238) | fn summary_record_err_increments_processed_and_error_kind() {
  function summary_record_err_accumulates_same_kind (line 250) | fn summary_record_err_accumulates_same_kind() {

FILE: git-cliff-core/src/tag.rs
  type Tag (line 5) | pub struct Tag {
  function create_tag_with_name_and_message (line 17) | fn create_tag_with_name_and_message() {
  function create_tag_with_name_and_no_message (line 27) | fn create_tag_with_name_and_no_message() {
  function debug_print_tag_with_message (line 37) | fn debug_print_tag_with_message() {

FILE: git-cliff-core/src/template.rs
  type Template (line 13) | pub struct Template {
    method new (line 25) | pub fn new(name: &str, mut content: String, trim: bool) -> Result<Self> {
    method upper_first_filter (line 55) | fn upper_first_filter(value: &Value, _: &HashMap<String, Value>) -> Te...
    method replace_regex (line 66) | fn replace_regex(value: &Value, args: &HashMap<String, Value>) -> Tera...
    method find_regex (line 95) | fn find_regex(value: &Value, args: &HashMap<String, Value>) -> TeraRes...
    method split_regex (line 119) | fn split_regex(value: &Value, args: &HashMap<String, Value>) -> TeraRe...
    method find_identifiers (line 142) | fn find_identifiers(node: &ast::Node, names: &mut HashSet<String>) {
    method get_template_variables (line 200) | fn get_template_variables(name: &str, tera: &Tera) -> Result<Vec<Strin...
    method contains_variable (line 211) | pub(crate) fn contains_variable(&self, variables: &[&str]) -> bool {
    method render (line 218) | pub fn render<C: Serialize, T: Serialize, S: Into<String> + Clone>(
  function get_fake_release_data (line 262) | fn get_fake_release_data() -> Release<'static> {
  function render_template (line 305) | fn render_template() -> Result<()> {
  function render_trimmed_template (line 344) | fn render_trimmed_template() -> Result<()> {
  function test_upper_first_filter (line 360) | fn test_upper_first_filter() -> Result<()> {
  function test_replace_regex_filter (line 371) | fn test_replace_regex_filter() -> Result<()> {
  function test_find_regex_filter (line 383) | fn test_find_regex_filter() -> Result<()> {
  function test_split_regex_filter (line 395) | fn test_split_regex_filter() -> Result<()> {

FILE: git-cliff-core/tests/integration_test.rs
  function generate_changelog (line 13) | fn generate_changelog() -> Result<()> {

FILE: git-cliff/examples/basic.rs
  function main (line 5) | fn main() -> Result<()> {

FILE: git-cliff/src/args.rs
  type Strip (line 15) | pub enum Strip {
  type Sort (line 22) | pub enum Sort {
  constant STYLES (line 27) | const STYLES: Styles = Styles::styled()
  type Opt (line 54) | pub struct Opt {
    method parse_dir (line 472) | fn parse_dir(dir: &str) -> Result<PathBuf, String> {
  type RemoteValue (line 372) | pub struct RemoteValue(pub Remote);
  type Parser (line 375) | type Parser = RemoteValueParser;
  method value_parser (line 376) | fn value_parser() -> Self::Parser {
  type RemoteValueParser (line 383) | pub struct RemoteValueParser;
  type Value (line 386) | type Value = RemoteValue;
  method parse_ref (line 387) | fn parse_ref(
  type BumpOption (line 419) | pub enum BumpOption {
  type Parser (line 425) | type Parser = BumpOptionParser;
  method value_parser (line 426) | fn value_parser() -> Self::Parser {
  type BumpOptionParser (line 433) | pub struct BumpOptionParser;
  type Value (line 436) | type Value = BumpOption;
  method parse_ref (line 437) | fn parse_ref(
  function verify_cli (line 486) | fn verify_cli() {
  function path_tilde_expansion (line 491) | fn path_tilde_expansion() {
  function remote_value_parser (line 498) | fn remote_value_parser() -> Result<(), clap::Error> {
  function bump_option_parser (line 547) | fn bump_option_parser() -> Result<(), clap::Error> {

FILE: git-cliff/src/bin/completions.rs
  function main (line 12) | fn main() -> Result<()> {

FILE: git-cliff/src/bin/mangen.rs
  function main (line 13) | fn main() -> Result<()> {

FILE: git-cliff/src/lib.rs
  function check_new_version (line 33) | pub fn check_new_version() {
  function determine_commit_range (line 49) | fn determine_commit_range(
  function process_submodules (line 114) | fn process_submodules(
  function init_config (line 161) | pub fn init_config(name: Option<&str>, config_path: &Path) -> Result<()> {
  function process_repository (line 189) | fn process_repository<'a>(
  function run (line 489) | pub fn run<'a>(args: Opt) -> Result<Changelog<'a>> {
  function run_with_changelog_modifier (line 516) | pub fn run_with_changelog_modifier<'a>(
  function write_changelog (line 802) | pub fn write_changelog<W: io::Write>(

FILE: git-cliff/src/logger.rs
  constant LOGGER_ENV (line 13) | const LOGGER_ENV: &str = "RUST_LOG";
  type Padded (line 19) | struct Padded<T> {
  function fmt (line 25) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  function max_target_width (line 31) | fn max_target_width(target: &str) -> usize {
  function colored_level (line 42) | fn colored_level(style: &mut Style, level: Level) -> StyledValue<'_, &'s...
  function init (line 79) | pub fn init() -> Result<()> {

FILE: git-cliff/src/main.rs
  function main (line 14) | fn main() -> Result<()> {

FILE: git-cliff/src/profiler.rs
  function start_profiling (line 4) | pub(crate) fn start_profiling() -> Option<pprof::ProfilerGuard<'static>> {
  function finish_profiling (line 19) | pub(crate) fn finish_profiling(profiler_guard: Option<pprof::ProfilerGua...

FILE: npm/git-cliff/.yarn/releases/yarn-4.1.0.cjs
  function Tl (line 4) | function Tl(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}
  function i_e (line 4) | function i_e(t){return Tl("EBUSY",t)}
  function s_e (line 4) | function s_e(t,e){return Tl("ENOSYS",`${t}, ${e}`)}
  function o_e (line 4) | function o_e(t){return Tl("EINVAL",`invalid argument, ${t}`)}
  function Io (line 4) | function Io(t){return Tl("EBADF",`bad file descriptor, ${t}`)}
  function a_e (line 4) | function a_e(t){return Tl("ENOENT",`no such file or directory, ${t}`)}
  function l_e (line 4) | function l_e(t){return Tl("ENOTDIR",`not a directory, ${t}`)}
  function c_e (line 4) | function c_e(t){return Tl("EISDIR",`illegal operation on a directory, ${...
  function u_e (line 4) | function u_e(t){return Tl("EEXIST",`file already exists, ${t}`)}
  function A_e (line 4) | function A_e(t){return Tl("EROFS",`read-only filesystem, ${t}`)}
  function f_e (line 4) | function f_e(t){return Tl("ENOTEMPTY",`directory not empty, ${t}`)}
  function p_e (line 4) | function p_e(t){return Tl("EOPNOTSUPP",`operation not supported, ${t}`)}
  function LR (line 4) | function LR(){return Tl("ERR_DIR_CLOSED","Directory handle was closed")}
  function Q7 (line 4) | function Q7(){return new ey}
  function h_e (line 4) | function h_e(){return vD(Q7())}
  function vD (line 4) | function vD(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r...
  function g_e (line 4) | function g_e(t){let e=new ty;for(let r in t)if(Object.hasOwn(t,r)){let o...
  function _R (line 4) | function _R(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs...
  method constructor (line 4) | constructor(){this.name="";this.path="";this.mode=0}
  method isBlockDevice (line 4) | isBlockDevice(){return!1}
  method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
  method isDirectory (line 4) | isDirectory(){return(this.mode&61440)===16384}
  method isFIFO (line 4) | isFIFO(){return!1}
  method isFile (line 4) | isFile(){return(this.mode&61440)===32768}
  method isSocket (line 4) | isSocket(){return!1}
  method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&61440)===40960}
  method constructor (line 4) | constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atim...
  method isBlockDevice (line 4) | isBlockDevice(){return!1}
  method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
  method isDirectory (line 4) | isDirectory(){return(this.mode&61440)===16384}
  method isFIFO (line 4) | isFIFO(){return!1}
  method isFile (line 4) | isFile(){return(this.mode&61440)===32768}
  method isSocket (line 4) | isSocket(){return!1}
  method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&61440)===40960}
  method constructor (line 4) | constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);...
  method isBlockDevice (line 4) | isBlockDevice(){return!1}
  method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
  method isDirectory (line 4) | isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}
  method isFIFO (line 4) | isFIFO(){return!1}
  method isFile (line 4) | isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}
  method isSocket (line 4) | isSocket(){return!1}
  method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}
  function C_e (line 4) | function C_e(t){let e,r;if(e=t.match(y_e))t=e[1];else if(r=t.match(E_e))...
  function w_e (line 4) | function w_e(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(d_e))?t=...
  function DD (line 4) | function DD(t,e){return t===ue?R7(e):jR(e)}
  function SD (line 4) | async function SD(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.i...
  function T7 (line 4) | async function T7(t,e,r,o,a){let n=t.pathUtils.normalize(e),u=r.pathUtil...
  function GR (line 4) | async function GR(t,e,r,o,a,n,u){let A=u.didParentExist?await N7(r,o):nu...
  function N7 (line 4) | async function N7(t,e){try{return await t.lstatPromise(e)}catch{return n...
  function B_e (line 4) | async function B_e(t,e,r,o,a,n,u,A,p){if(a!==null&&!a.isDirectory())if(p...
  function v_e (line 4) | async function v_e(t,e,r,o,a,n,u,A,p,h){let E=await n.checksumFilePromis...
  function D_e (line 4) | async function D_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(...
  function S_e (line 4) | async function S_e(t,e,r,o,a,n,u,A,p){return p.linkStrategy?.type==="Har...
  function P_e (line 4) | async function P_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(...
  function PD (line 4) | function PD(t,e,r,o){let a=()=>{let n=r.shift();if(typeof n>"u")return n...
  method constructor (line 4) | constructor(e,r,o={}){this.path=e;this.nextDirent=r;this.opts=o;this.clo...
  method throwIfClosed (line 4) | throwIfClosed(){if(this.closed)throw LR()}
  method [Symbol.asyncIterator] (line 4) | async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==nu...
  method read (line 4) | read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.reso...
  method readSync (line 4) | readSync(){return this.throwIfClosed(),this.nextDirent()}
  method close (line 4) | close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}
  method closeSync (line 4) | closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}
  function O7 (line 4) | function O7(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: e...
  method constructor (line 4) | constructor(r,o,{bigint:a=!1}={}){super();this.status="ready";this.chang...
  method create (line 4) | static create(r,o,a){let n=new ry(r,o,a);return n.start(),n}
  method start (line 4) | start(){O7(this.status,"ready"),this.status="running",this.startTimeout=...
  method stop (line 4) | stop(){O7(this.status,"running"),this.status="stopped",this.startTimeout...
  method stat (line 4) | stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}c...
  method makeInterval (line 4) | makeInterval(r){let o=setInterval(()=>{let a=this.stat(),n=this.lastStat...
  method registerChangeListener (line 4) | registerChangeListener(r,o){this.addListener("change",r),this.changeList...
  method unregisterChangeListener (line 4) | unregisterChangeListener(r){this.removeListener("change",r);let o=this.c...
  method unregisterAllChangeListeners (line 4) | unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())...
  method hasChangeListeners (line 4) | hasChangeListeners(){return this.changeListeners.size>0}
  method ref (line 4) | ref(){for(let r of this.changeListeners.values())r.ref();return this}
  method unref (line 4) | unref(){for(let r of this.changeListeners.values())r.unref();return this}
  function ny (line 4) | function ny(t,e,r,o){let a,n,u,A;switch(typeof r){case"function":a=!1,n=...
  function Mg (line 4) | function Mg(t,e,r){let o=bD.get(t);if(typeof o>"u")return;let a=o.get(e)...
  function Ug (line 4) | function Ug(t){let e=bD.get(t);if(!(typeof e>"u"))for(let r of e.keys())...
  function b_e (line 4) | function b_e(t){let e=t.match(/\r?\n/g);if(e===null)return H7.EOL;let r=...
  function _g (line 7) | function _g(t,e){return e.replace(/\r?\n/g,b_e(t))}
  method constructor (line 7) | constructor(e){this.pathUtils=e}
  method genTraversePromise (line 7) | async*genTraversePromise(e,{stableSort:r=!1}={}){let o=[e];for(;o.length...
  method checksumFilePromise (line 7) | async checksumFilePromise(e,{algorithm:r="sha512"}={}){let o=await this....
  method removePromise (line 7) | async removePromise(e,{recursive:r=!0,maxRetries:o=5}={}){let a;try{a=aw...
  method removeSync (line 7) | removeSync(e,{recursive:r=!0}={}){let o;try{o=this.lstatSync(e)}catch(a)...
  method mkdirpPromise (line 7) | async mkdirpPromise(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===th...
  method mkdirpSync (line 7) | mkdirpSync(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUt...
  method copyPromise (line 7) | async copyPromise(e,r,{baseFs:o=this,overwrite:a=!0,stableSort:n=!1,stab...
  method copySync (line 7) | copySync(e,r,{baseFs:o=this,overwrite:a=!0}={}){let n=o.lstatSync(r),u=t...
  method changeFilePromise (line 7) | async changeFilePromise(e,r,o={}){return Buffer.isBuffer(r)?this.changeF...
  method changeFileBufferPromise (line 7) | async changeFileBufferPromise(e,r,{mode:o}={}){let a=Buffer.alloc(0);try...
  method changeFileTextPromise (line 7) | async changeFileTextPromise(e,r,{automaticNewlines:o,mode:a}={}){let n="...
  method changeFileSync (line 7) | changeFileSync(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBuffer...
  method changeFileBufferSync (line 7) | changeFileBufferSync(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=this.r...
  method changeFileTextSync (line 7) | changeFileTextSync(e,r,{automaticNewlines:o=!1,mode:a}={}){let n="";try{...
  method movePromise (line 7) | async movePromise(e,r){try{await this.renamePromise(e,r)}catch(o){if(o.c...
  method moveSync (line 7) | moveSync(e,r){try{this.renameSync(e,r)}catch(o){if(o.code==="EXDEV")this...
  method lockPromise (line 7) | async lockPromise(e,r){let o=`${e}.flock`,a=1e3/60,n=Date.now(),u=null,A...
  method readJsonPromise (line 7) | async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{...
  method readJsonSync (line 7) | readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(...
  method writeJsonPromise (line 7) | async writeJsonPromise(e,r,{compact:o=!1}={}){let a=o?0:2;return await t...
  method writeJsonSync (line 8) | writeJsonSync(e,r,{compact:o=!1}={}){let a=o?0:2;return this.writeFileSy...
  method preserveTimePromise (line 9) | async preserveTimePromise(e,r){let o=await this.lstatPromise(e),a=await ...
  method preserveTimeSync (line 9) | async preserveTimeSync(e,r){let o=this.lstatSync(e),a=r();typeof a<"u"&&...
  method constructor (line 9) | constructor(){super(V)}
  method getExtractHint (line 9) | getExtractHint(e){return this.baseFs.getExtractHint(e)}
  method resolve (line 9) | resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}
  method getRealPath (line 9) | getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}
  method openPromise (line 9) | async openPromise(e,r,o){return this.baseFs.openPromise(this.mapToBase(e...
  method openSync (line 9) | openSync(e,r,o){return this.baseFs.openSync(this.mapToBase(e),r,o)}
  method opendirPromise (line 9) | async opendirPromise(e,r){return Object.assign(await this.baseFs.opendir...
  method opendirSync (line 9) | opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapTo...
  method readPromise (line 9) | async readPromise(e,r,o,a,n){return await this.baseFs.readPromise(e,r,o,...
  method readSync (line 9) | readSync(e,r,o,a,n){return this.baseFs.readSync(e,r,o,a,n)}
  method writePromise (line 9) | async writePromise(e,r,o,a,n){return typeof r=="string"?await this.baseF...
  method writeSync (line 9) | writeSync(e,r,o,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r...
  method closePromise (line 9) | async closePromise(e){return this.baseFs.closePromise(e)}
  method closeSync (line 9) | closeSync(e){this.baseFs.closeSync(e)}
  method createReadStream (line 9) | createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this....
  method createWriteStream (line 9) | createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?thi...
  method realpathPromise (line 9) | async realpathPromise(e){return this.mapFromBase(await this.baseFs.realp...
  method realpathSync (line 9) | realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.ma...
  method existsPromise (line 9) | async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}
  method existsSync (line 9) | existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}
  method accessSync (line 9) | accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}
  method accessPromise (line 9) | async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase...
  method statPromise (line 9) | async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}
  method statSync (line 9) | statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}
  method fstatPromise (line 9) | async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}
  method fstatSync (line 9) | fstatSync(e,r){return this.baseFs.fstatSync(e,r)}
  method lstatPromise (line 9) | lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}
  method lstatSync (line 9) | lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}
  method fchmodPromise (line 9) | async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}
  method fchmodSync (line 9) | fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}
  method chmodPromise (line 9) | async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e...
  method chmodSync (line 9) | chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}
  method fchownPromise (line 9) | async fchownPromise(e,r,o){return this.baseFs.fchownPromise(e,r,o)}
  method fchownSync (line 9) | fchownSync(e,r,o){return this.baseFs.fchownSync(e,r,o)}
  method chownPromise (line 9) | async chownPromise(e,r,o){return this.baseFs.chownPromise(this.mapToBase...
  method chownSync (line 9) | chownSync(e,r,o){return this.baseFs.chownSync(this.mapToBase(e),r,o)}
  method renamePromise (line 9) | async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase...
  method renameSync (line 9) | renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.map...
  method copyFilePromise (line 9) | async copyFilePromise(e,r,o=0){return this.baseFs.copyFilePromise(this.m...
  method copyFileSync (line 9) | copyFileSync(e,r,o=0){return this.baseFs.copyFileSync(this.mapToBase(e),...
  method appendFilePromise (line 9) | async appendFilePromise(e,r,o){return this.baseFs.appendFilePromise(this...
  method appendFileSync (line 9) | appendFileSync(e,r,o){return this.baseFs.appendFileSync(this.fsMapToBase...
  method writeFilePromise (line 9) | async writeFilePromise(e,r,o){return this.baseFs.writeFilePromise(this.f...
  method writeFileSync (line 9) | writeFileSync(e,r,o){return this.baseFs.writeFileSync(this.fsMapToBase(e...
  method unlinkPromise (line 9) | async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}
  method unlinkSync (line 9) | unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}
  method utimesPromise (line 9) | async utimesPromise(e,r,o){return this.baseFs.utimesPromise(this.mapToBa...
  method utimesSync (line 9) | utimesSync(e,r,o){return this.baseFs.utimesSync(this.mapToBase(e),r,o)}
  method lutimesPromise (line 9) | async lutimesPromise(e,r,o){return this.baseFs.lutimesPromise(this.mapTo...
  method lutimesSync (line 9) | lutimesSync(e,r,o){return this.baseFs.lutimesSync(this.mapToBase(e),r,o)}
  method mkdirPromise (line 9) | async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e...
  method mkdirSync (line 9) | mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}
  method rmdirPromise (line 9) | async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e...
  method rmdirSync (line 9) | rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}
  method linkPromise (line 9) | async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),...
  method linkSync (line 9) | linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBa...
  method symlinkPromise (line 9) | async symlinkPromise(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.is...
  method symlinkSync (line 9) | symlinkSync(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(...
  method readFilePromise (line 9) | async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMap...
  method readFileSync (line 9) | readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}
  method readdirPromise (line 9) | readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}
  method readdirSync (line 9) | readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}
  method readlinkPromise (line 9) | async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readl...
  method readlinkSync (line 9) | readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.ma...
  method truncatePromise (line 9) | async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapTo...
  method truncateSync (line 9) | truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}
  method ftruncatePromise (line 9) | async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}
  method ftruncateSync (line 9) | ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}
  method watch (line 9) | watch(e,r,o){return this.baseFs.watch(this.mapToBase(e),r,o)}
  method watchFile (line 9) | watchFile(e,r,o){return this.baseFs.watchFile(this.mapToBase(e),r,o)}
  method unwatchFile (line 9) | unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}
  method fsMapToBase (line 9) | fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}
  method constructor (line 9) | constructor(r,{baseFs:o,pathUtils:a}){super(a);this.target=r,this.baseFs=o}
  method getRealPath (line 9) | getRealPath(){return this.target}
  method getBaseFs (line 9) | getBaseFs(){return this.baseFs}
  method mapFromBase (line 9) | mapFromBase(r){return r}
  method mapToBase (line 9) | mapToBase(r){return r}
  function G7 (line 9) | function G7(t){let e=t;return typeof t.path=="string"&&(e.path=ue.toPort...
  method constructor (line 9) | constructor(r=q7.default){super();this.realFs=r}
  method getExtractHint (line 9) | getExtractHint(){return!1}
  method getRealPath (line 9) | getRealPath(){return Bt.root}
  method resolve (line 9) | resolve(r){return V.resolve(r)}
  method openPromise (line 9) | async openPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.op...
  method openSync (line 9) | openSync(r,o,a){return this.realFs.openSync(ue.fromPortablePath(r),o,a)}
  method opendirPromise (line 9) | async opendirPromise(r,o){return await new Promise((a,n)=>{typeof o<"u"?...
  method opendirSync (line 9) | opendirSync(r,o){let n=typeof o<"u"?this.realFs.opendirSync(ue.fromPorta...
  method readPromise (line 9) | async readPromise(r,o,a=0,n=0,u=-1){return await new Promise((A,p)=>{thi...
  method readSync (line 9) | readSync(r,o,a,n,u){return this.realFs.readSync(r,o,a,n,u)}
  method writePromise (line 9) | async writePromise(r,o,a,n,u){return await new Promise((A,p)=>typeof o==...
  method writeSync (line 9) | writeSync(r,o,a,n,u){return typeof o=="string"?this.realFs.writeSync(r,o...
  method closePromise (line 9) | async closePromise(r){await new Promise((o,a)=>{this.realFs.close(r,this...
  method closeSync (line 9) | closeSync(r){this.realFs.closeSync(r)}
  method createReadStream (line 9) | createReadStream(r,o){let a=r!==null?ue.fromPortablePath(r):r;return thi...
  method createWriteStream (line 9) | createWriteStream(r,o){let a=r!==null?ue.fromPortablePath(r):r;return th...
  method realpathPromise (line 9) | async realpathPromise(r){return await new Promise((o,a)=>{this.realFs.re...
  method realpathSync (line 9) | realpathSync(r){return ue.toPortablePath(this.realFs.realpathSync(ue.fro...
  method existsPromise (line 9) | async existsPromise(r){return await new Promise(o=>{this.realFs.exists(u...
  method accessSync (line 9) | accessSync(r,o){return this.realFs.accessSync(ue.fromPortablePath(r),o)}
  method accessPromise (line 9) | async accessPromise(r,o){return await new Promise((a,n)=>{this.realFs.ac...
  method existsSync (line 9) | existsSync(r){return this.realFs.existsSync(ue.fromPortablePath(r))}
  method statPromise (line 9) | async statPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.st...
  method statSync (line 9) | statSync(r,o){return o?this.realFs.statSync(ue.fromPortablePath(r),o):th...
  method fstatPromise (line 9) | async fstatPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.f...
  method fstatSync (line 9) | fstatSync(r,o){return o?this.realFs.fstatSync(r,o):this.realFs.fstatSync...
  method lstatPromise (line 9) | async lstatPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.l...
  method lstatSync (line 9) | lstatSync(r,o){return o?this.realFs.lstatSync(ue.fromPortablePath(r),o):...
  method fchmodPromise (line 9) | async fchmodPromise(r,o){return await new Promise((a,n)=>{this.realFs.fc...
  method fchmodSync (line 9) | fchmodSync(r,o){return this.realFs.fchmodSync(r,o)}
  method chmodPromise (line 9) | async chmodPromise(r,o){return await new Promise((a,n)=>{this.realFs.chm...
  method chmodSync (line 9) | chmodSync(r,o){return this.realFs.chmodSync(ue.fromPortablePath(r),o)}
  method fchownPromise (line 9) | async fchownPromise(r,o,a){return await new Promise((n,u)=>{this.realFs....
  method fchownSync (line 9) | fchownSync(r,o,a){return this.realFs.fchownSync(r,o,a)}
  method chownPromise (line 9) | async chownPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.c...
  method chownSync (line 9) | chownSync(r,o,a){return this.realFs.chownSync(ue.fromPortablePath(r),o,a)}
  method renamePromise (line 9) | async renamePromise(r,o){return await new Promise((a,n)=>{this.realFs.re...
  method renameSync (line 9) | renameSync(r,o){return this.realFs.renameSync(ue.fromPortablePath(r),ue....
  method copyFilePromise (line 9) | async copyFilePromise(r,o,a=0){return await new Promise((n,u)=>{this.rea...
  method copyFileSync (line 9) | copyFileSync(r,o,a=0){return this.realFs.copyFileSync(ue.fromPortablePat...
  method appendFilePromise (line 9) | async appendFilePromise(r,o,a){return await new Promise((n,u)=>{let A=ty...
  method appendFileSync (line 9) | appendFileSync(r,o,a){let n=typeof r=="string"?ue.fromPortablePath(r):r;...
  method writeFilePromise (line 9) | async writeFilePromise(r,o,a){return await new Promise((n,u)=>{let A=typ...
  method writeFileSync (line 9) | writeFileSync(r,o,a){let n=typeof r=="string"?ue.fromPortablePath(r):r;a...
  method unlinkPromise (line 9) | async unlinkPromise(r){return await new Promise((o,a)=>{this.realFs.unli...
  method unlinkSync (line 9) | unlinkSync(r){return this.realFs.unlinkSync(ue.fromPortablePath(r))}
  method utimesPromise (line 9) | async utimesPromise(r,o,a){return await new Promise((n,u)=>{this.realFs....
  method utimesSync (line 9) | utimesSync(r,o,a){this.realFs.utimesSync(ue.fromPortablePath(r),o,a)}
  method lutimesPromise (line 9) | async lutimesPromise(r,o,a){return await new Promise((n,u)=>{this.realFs...
  method lutimesSync (line 9) | lutimesSync(r,o,a){this.realFs.lutimesSync(ue.fromPortablePath(r),o,a)}
  method mkdirPromise (line 9) | async mkdirPromise(r,o){return await new Promise((a,n)=>{this.realFs.mkd...
  method mkdirSync (line 9) | mkdirSync(r,o){return this.realFs.mkdirSync(ue.fromPortablePath(r),o)}
  method rmdirPromise (line 9) | async rmdirPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.r...
  method rmdirSync (line 9) | rmdirSync(r,o){return this.realFs.rmdirSync(ue.fromPortablePath(r),o)}
  method linkPromise (line 9) | async linkPromise(r,o){return await new Promise((a,n)=>{this.realFs.link...
  method linkSync (line 9) | linkSync(r,o){return this.realFs.linkSync(ue.fromPortablePath(r),ue.from...
  method symlinkPromise (line 9) | async symlinkPromise(r,o,a){return await new Promise((n,u)=>{this.realFs...
  method symlinkSync (line 9) | symlinkSync(r,o,a){return this.realFs.symlinkSync(ue.fromPortablePath(r....
  method readFilePromise (line 9) | async readFilePromise(r,o){return await new Promise((a,n)=>{let u=typeof...
  method readFileSync (line 9) | readFileSync(r,o){let a=typeof r=="string"?ue.fromPortablePath(r):r;retu...
  method readdirPromise (line 9) | async readdirPromise(r,o){return await new Promise((a,n)=>{o?o.recursive...
  method readdirSync (line 9) | readdirSync(r,o){return o?o.recursive&&process.platform==="win32"?o.with...
  method readlinkPromise (line 9) | async readlinkPromise(r){return await new Promise((o,a)=>{this.realFs.re...
  method readlinkSync (line 9) | readlinkSync(r){return ue.toPortablePath(this.realFs.readlinkSync(ue.fro...
  method truncatePromise (line 9) | async truncatePromise(r,o){return await new Promise((a,n)=>{this.realFs....
  method truncateSync (line 9) | truncateSync(r,o){return this.realFs.truncateSync(ue.fromPortablePath(r)...
  method ftruncatePromise (line 9) | async ftruncatePromise(r,o){return await new Promise((a,n)=>{this.realFs...
  method ftruncateSync (line 9) | ftruncateSync(r,o){return this.realFs.ftruncateSync(r,o)}
  method watch (line 9) | watch(r,o,a){return this.realFs.watch(ue.fromPortablePath(r),o,a)}
  method watchFile (line 9) | watchFile(r,o,a){return this.realFs.watchFile(ue.fromPortablePath(r),o,a)}
  method unwatchFile (line 9) | unwatchFile(r,o){return this.realFs.unwatchFile(ue.fromPortablePath(r),o)}
  method makeCallback (line 9) | makeCallback(r,o){return(a,n)=>{a?o(a):r(n)}}
  method constructor (line 9) | constructor(r,{baseFs:o=new Tn}={}){super(V);this.target=this.pathUtils....
  method getRealPath (line 9) | getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),th...
  method resolve (line 9) | resolve(r){return this.pathUtils.isAbsolute(r)?V.normalize(r):this.baseF...
  method mapFromBase (line 9) | mapFromBase(r){return r}
  method mapToBase (line 9) | mapToBase(r){return this.pathUtils.isAbsolute(r)?r:this.pathUtils.join(t...
  method constructor (line 9) | constructor(r,{baseFs:o=new Tn}={}){super(V);this.target=this.pathUtils....
  method getRealPath (line 9) | getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),th...
  method getTarget (line 9) | getTarget(){return this.target}
  method getBaseFs (line 9) | getBaseFs(){return this.baseFs}
  method mapToBase (line 9) | mapToBase(r){let o=this.pathUtils.normalize(r);if(this.pathUtils.isAbsol...
  method mapFromBase (line 9) | mapFromBase(r){return this.pathUtils.resolve(W7,this.pathUtils.relative(...
  method constructor (line 9) | constructor(r,o){super(o);this.instance=null;this.factory=r}
  method baseFs (line 9) | get baseFs(){return this.instance||(this.instance=this.factory()),this.i...
  method baseFs (line 9) | set baseFs(r){this.instance=r}
  method mapFromBase (line 9) | mapFromBase(r){return r}
  method mapToBase (line 9) | mapToBase(r){return r}
  method constructor (line 9) | constructor({baseFs:r=new Tn,filter:o=null,magicByte:a=42,maxOpenFiles:n...
  method getExtractHint (line 9) | getExtractHint(r){return this.baseFs.getExtractHint(r)}
  method getRealPath (line 9) | getRealPath(){return this.baseFs.getRealPath()}
  method saveAndClose (line 9) | saveAndClose(){if(Ug(this),this.mountInstances)for(let[r,{childFs:o}]of ...
  method discardAndClose (line 9) | discardAndClose(){if(Ug(this),this.mountInstances)for(let[r,{childFs:o}]...
  method resolve (line 9) | resolve(r){return this.baseFs.resolve(r)}
  method remapFd (line 9) | remapFd(r,o){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,o...
  method openPromise (line 9) | async openPromise(r,o,a){return await this.makeCallPromise(r,async()=>aw...
  method openSync (line 9) | openSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,o,...
  method opendirPromise (line 9) | async opendirPromise(r,o){return await this.makeCallPromise(r,async()=>a...
  method opendirSync (line 9) | opendirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.opendirSync(...
  method readPromise (line 9) | async readPromise(r,o,a,n,u){if((r&wa)!==this.magic)return await this.ba...
  method readSync (line 9) | readSync(r,o,a,n,u){if((r&wa)!==this.magic)return this.baseFs.readSync(r...
  method writePromise (line 9) | async writePromise(r,o,a,n,u){if((r&wa)!==this.magic)return typeof o=="s...
  method writeSync (line 9) | writeSync(r,o,a,n,u){if((r&wa)!==this.magic)return typeof o=="string"?th...
  method closePromise (line 9) | async closePromise(r){if((r&wa)!==this.magic)return await this.baseFs.cl...
  method closeSync (line 9) | closeSync(r){if((r&wa)!==this.magic)return this.baseFs.closeSync(r);let ...
  method createReadStream (line 9) | createReadStream(r,o){return r===null?this.baseFs.createReadStream(r,o):...
  method createWriteStream (line 9) | createWriteStream(r,o){return r===null?this.baseFs.createWriteStream(r,o...
  method realpathPromise (line 9) | async realpathPromise(r){return await this.makeCallPromise(r,async()=>aw...
  method realpathSync (line 9) | realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(...
  method existsPromise (line 9) | async existsPromise(r){return await this.makeCallPromise(r,async()=>awai...
  method existsSync (line 9) | existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(...
  method accessPromise (line 9) | async accessPromise(r,o){return await this.makeCallPromise(r,async()=>aw...
  method accessSync (line 9) | accessSync(r,o){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,...
  method statPromise (line 9) | async statPromise(r,o){return await this.makeCallPromise(r,async()=>awai...
  method statSync (line 9) | statSync(r,o){return this.makeCallSync(r,()=>this.baseFs.statSync(r,o),(...
  method fstatPromise (line 9) | async fstatPromise(r,o){if((r&wa)!==this.magic)return this.baseFs.fstatP...
  method fstatSync (line 9) | fstatSync(r,o){if((r&wa)!==this.magic)return this.baseFs.fstatSync(r,o);...
  method lstatPromise (line 9) | async lstatPromise(r,o){return await this.makeCallPromise(r,async()=>awa...
  method lstatSync (line 9) | lstatSync(r,o){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,o)...
  method fchmodPromise (line 9) | async fchmodPromise(r,o){if((r&wa)!==this.magic)return this.baseFs.fchmo...
  method fchmodSync (line 9) | fchmodSync(r,o){if((r&wa)!==this.magic)return this.baseFs.fchmodSync(r,o...
  method chmodPromise (line 9) | async chmodPromise(r,o){return await this.makeCallPromise(r,async()=>awa...
  method chmodSync (line 9) | chmodSync(r,o){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,o)...
  method fchownPromise (line 9) | async fchownPromise(r,o,a){if((r&wa)!==this.magic)return this.baseFs.fch...
  method fchownSync (line 9) | fchownSync(r,o,a){if((r&wa)!==this.magic)return this.baseFs.fchownSync(r...
  method chownPromise (line 9) | async chownPromise(r,o,a){return await this.makeCallPromise(r,async()=>a...
  method chownSync (line 9) | chownSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,...
  method renamePromise (line 9) | async renamePromise(r,o){return await this.makeCallPromise(r,async()=>aw...
  method renameSync (line 9) | renameSync(r,o){return this.makeCallSync(r,()=>this.makeCallSync(o,()=>t...
  method copyFilePromise (line 9) | async copyFilePromise(r,o,a=0){let n=async(u,A,p,h)=>{if((a&Gg.constants...
  method copyFileSync (line 9) | copyFileSync(r,o,a=0){let n=(u,A,p,h)=>{if((a&Gg.constants.COPYFILE_FICL...
  method appendFilePromise (line 9) | async appendFilePromise(r,o,a){return await this.makeCallPromise(r,async...
  method appendFileSync (line 9) | appendFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.appendF...
  method writeFilePromise (line 9) | async writeFilePromise(r,o,a){return await this.makeCallPromise(r,async(...
  method writeFileSync (line 9) | writeFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.writeFil...
  method unlinkPromise (line 9) | async unlinkPromise(r){return await this.makeCallPromise(r,async()=>awai...
  method unlinkSync (line 9) | unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(...
  method utimesPromise (line 9) | async utimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>...
  method utimesSync (line 9) | utimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(...
  method lutimesPromise (line 9) | async lutimesPromise(r,o,a){return await this.makeCallPromise(r,async()=...
  method lutimesSync (line 9) | lutimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSyn...
  method mkdirPromise (line 9) | async mkdirPromise(r,o){return await this.makeCallPromise(r,async()=>awa...
  method mkdirSync (line 9) | mkdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,o)...
  method rmdirPromise (line 9) | async rmdirPromise(r,o){return await this.makeCallPromise(r,async()=>awa...
  method rmdirSync (line 9) | rmdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,o)...
  method linkPromise (line 9) | async linkPromise(r,o){return await this.makeCallPromise(o,async()=>awai...
  method linkSync (line 9) | linkSync(r,o){return this.makeCallSync(o,()=>this.baseFs.linkSync(r,o),(...
  method symlinkPromise (line 9) | async symlinkPromise(r,o,a){return await this.makeCallPromise(o,async()=...
  method symlinkSync (line 9) | symlinkSync(r,o,a){return this.makeCallSync(o,()=>this.baseFs.symlinkSyn...
  method readFilePromise (line 9) | async readFilePromise(r,o){return this.makeCallPromise(r,async()=>await ...
  method readFileSync (line 9) | readFileSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readFileSyn...
  method readdirPromise (line 9) | async readdirPromise(r,o){return await this.makeCallPromise(r,async()=>a...
  method readdirSync (line 9) | readdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readdirSync(...
  method readlinkPromise (line 9) | async readlinkPromise(r){return await this.makeCallPromise(r,async()=>aw...
  method readlinkSync (line 9) | readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(...
  method truncatePromise (line 9) | async truncatePromise(r,o){return await this.makeCallPromise(r,async()=>...
  method truncateSync (line 9) | truncateSync(r,o){return this.makeCallSync(r,()=>this.baseFs.truncateSyn...
  method ftruncatePromise (line 9) | async ftruncatePromise(r,o){if((r&wa)!==this.magic)return this.baseFs.ft...
  method ftruncateSync (line 9) | ftruncateSync(r,o){if((r&wa)!==this.magic)return this.baseFs.ftruncateSy...
  method watch (line 9) | watch(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,o,a),(n,...
  method watchFile (line 9) | watchFile(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,...
  method unwatchFile (line 9) | unwatchFile(r,o){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(...
  method makeCallPromise (line 9) | async makeCallPromise(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="stri...
  method makeCallSync (line 9) | makeCallSync(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")retur...
  method findMount (line 9) | findMount(r){if(this.filter&&!this.filter.test(r))return null;let o="";f...
  method limitOpenFiles (line 9) | limitOpenFiles(r){if(this.mountInstances===null)return;let o=Date.now(),...
  method getMountPromise (line 9) | async getMountPromise(r,o){if(this.mountInstances){let a=this.mountInsta...
  method getMountSync (line 9) | getMountSync(r,o){if(this.mountInstances){let a=this.mountInstances.get(...
  method constructor (line 9) | constructor(){super(V)}
  method getExtractHint (line 9) | getExtractHint(){throw Zt()}
  method getRealPath (line 9) | getRealPath(){throw Zt()}
  method resolve (line 9) | resolve(){throw Zt()}
  method openPromise (line 9) | async openPromise(){throw Zt()}
  method openSync (line 9) | openSync(){throw Zt()}
  method opendirPromise (line 9) | async opendirPromise(){throw Zt()}
  method opendirSync (line 9) | opendirSync(){throw Zt()}
  method readPromise (line 9) | async readPromise(){throw Zt()}
  method readSync (line 9) | readSync(){throw Zt()}
  method writePromise (line 9) | async writePromise(){throw Zt()}
  method writeSync (line 9) | writeSync(){throw Zt()}
  method closePromise (line 9) | async closePromise(){throw Zt()}
  method closeSync (line 9) | closeSync(){throw Zt()}
  method createWriteStream (line 9) | createWriteStream(){throw Zt()}
  method createReadStream (line 9) | createReadStream(){throw Zt()}
  method realpathPromise (line 9) | async realpathPromise(){throw Zt()}
  method realpathSync (line 9) | realpathSync(){throw Zt()}
  method readdirPromise (line 9) | async readdirPromise(){throw Zt()}
  method readdirSync (line 9) | readdirSync(){throw Zt()}
  method existsPromise (line 9) | async existsPromise(e){throw Zt()}
  method existsSync (line 9) | existsSync(e){throw Zt()}
  method accessPromise (line 9) | async accessPromise(){throw Zt()}
  method accessSync (line 9) | accessSync(){throw Zt()}
  method statPromise (line 9) | async statPromise(){throw Zt()}
  method statSync (line 9) | statSync(){throw Zt()}
  method fstatPromise (line 9) | async fstatPromise(e){throw Zt()}
  method fstatSync (line 9) | fstatSync(e){throw Zt()}
  method lstatPromise (line 9) | async lstatPromise(e){throw Zt()}
  method lstatSync (line 9) | lstatSync(e){throw Zt()}
  method fchmodPromise (line 9) | async fchmodPromise(){throw Zt()}
  method fchmodSync (line 9) | fchmodSync(){throw Zt()}
  method chmodPromise (line 9) | async chmodPromise(){throw Zt()}
  method chmodSync (line 9) | chmodSync(){throw Zt()}
  method fchownPromise (line 9) | async fchownPromise(){throw Zt()}
  method fchownSync (line 9) | fchownSync(){throw Zt()}
  method chownPromise (line 9) | async chownPromise(){throw Zt()}
  method chownSync (line 9) | chownSync(){throw Zt()}
  method mkdirPromise (line 9) | async mkdirPromise(){throw Zt()}
  method mkdirSync (line 9) | mkdirSync(){throw Zt()}
  method rmdirPromise (line 9) | async rmdirPromise(){throw Zt()}
  method rmdirSync (line 9) | rmdirSync(){throw Zt()}
  method linkPromise (line 9) | async linkPromise(){throw Zt()}
  method linkSync (line 9) | linkSync(){throw Zt()}
  method symlinkPromise (line 9) | async symlinkPromise(){throw Zt()}
  method symlinkSync (line 9) | symlinkSync(){throw Zt()}
  method renamePromise (line 9) | async renamePromise(){throw Zt()}
  method renameSync (line 9) | renameSync(){throw Zt()}
  method copyFilePromise (line 9) | async copyFilePromise(){throw Zt()}
  method copyFileSync (line 9) | copyFileSync(){throw Zt()}
  method appendFilePromise (line 9) | async appendFilePromise(){throw Zt()}
  method appendFileSync (line 9) | appendFileSync(){throw Zt()}
  method writeFilePromise (line 9) | async writeFilePromise(){throw Zt()}
  method writeFileSync (line 9) | writeFileSync(){throw Zt()}
  method unlinkPromise (line 9) | async unlinkPromise(){throw Zt()}
  method unlinkSync (line 9) | unlinkSync(){throw Zt()}
  method utimesPromise (line 9) | async utimesPromise(){throw Zt()}
  method utimesSync (line 9) | utimesSync(){throw Zt()}
  method lutimesPromise (line 9) | async lutimesPromise(){throw Zt()}
  method lutimesSync (line 9) | lutimesSync(){throw Zt()}
  method readFilePromise (line 9) | async readFilePromise(){throw Zt()}
  method readFileSync (line 9) | readFileSync(){throw Zt()}
  method readlinkPromise (line 9) | async readlinkPromise(){throw Zt()}
  method readlinkSync (line 9) | readlinkSync(){throw Zt()}
  method truncatePromise (line 9) | async truncatePromise(){throw Zt()}
  method truncateSync (line 9) | truncateSync(){throw Zt()}
  method ftruncatePromise (line 9) | async ftruncatePromise(e,r){throw Zt()}
  method ftruncateSync (line 9) | ftruncateSync(e,r){throw Zt()}
  method watch (line 9) | watch(){throw Zt()}
  method watchFile (line 9) | watchFile(){throw Zt()}
  method unwatchFile (line 9) | unwatchFile(){throw Zt()}
  method constructor (line 9) | constructor(r){super(ue);this.baseFs=r}
  method mapFromBase (line 9) | mapFromBase(r){return ue.fromPortablePath(r)}
  method mapToBase (line 9) | mapToBase(r){return ue.toPortablePath(r)}
  method constructor (line 9) | constructor({baseFs:r=new Tn}={}){super(V);this.baseFs=r}
  method makeVirtualPath (line 9) | static makeVirtualPath(r,o,a){if(V.basename(r)!=="__virtual__")throw new...
  method resolveVirtual (line 9) | static resolveVirtual(r){let o=r.match(KR);if(!o||!o[3]&&o[5])return r;l...
  method getExtractHint (line 9) | getExtractHint(r){return this.baseFs.getExtractHint(r)}
  method getRealPath (line 9) | getRealPath(){return this.baseFs.getRealPath()}
  method realpathSync (line 9) | realpathSync(r){let o=r.match(KR);if(!o)return this.baseFs.realpathSync(...
  method realpathPromise (line 9) | async realpathPromise(r){let o=r.match(KR);if(!o)return await this.baseF...
  method mapToBase (line 9) | mapToBase(r){if(r==="")return r;if(this.pathUtils.isAbsolute(r))return m...
  method mapFromBase (line 9) | mapFromBase(r){return r}
  function Q_e (line 9) | function Q_e(t,e){return typeof VR.default.isUtf8<"u"?VR.default.isUtf8(...
  method constructor (line 9) | constructor(r){super(ue);this.baseFs=r}
  method mapFromBase (line 9) | mapFromBase(r){return r}
  method mapToBase (line 9) | mapToBase(r){if(typeof r=="string")return r;if(r instanceof URL)return(0...
  method constructor (line 9) | constructor(e,r){this[F_e]=1;this[R_e]=void 0;this[T_e]=void 0;this[N_e]...
  method fd (line 9) | get fd(){return this[mf]}
  method appendFile (line 9) | async appendFile(e,r){try{this[Tc](this.appendFile);let o=(typeof r=="st...
  method chown (line 9) | async chown(e,r){try{return this[Tc](this.chown),await this[Bo].fchownPr...
  method chmod (line 9) | async chmod(e){try{return this[Tc](this.chmod),await this[Bo].fchmodProm...
  method createReadStream (line 9) | createReadStream(e){return this[Bo].createReadStream(null,{...e,fd:this....
  method createWriteStream (line 9) | createWriteStream(e){return this[Bo].createWriteStream(null,{...e,fd:thi...
  method datasync (line 9) | datasync(){throw new Error("Method not implemented.")}
  method sync (line 9) | sync(){throw new Error("Method not implemented.")}
  method read (line 9) | async read(e,r,o,a){try{this[Tc](this.read);let n;return Buffer.isBuffer...
  method readFile (line 9) | async readFile(e){try{this[Tc](this.readFile);let r=(typeof e=="string"?...
  method readLines (line 9) | readLines(e){return(0,rY.createInterface)({input:this.createReadStream(e...
  method stat (line 9) | async stat(e){try{return this[Tc](this.stat),await this[Bo].fstatPromise...
  method truncate (line 9) | async truncate(e){try{return this[Tc](this.truncate),await this[Bo].ftru...
  method utimes (line 9) | utimes(e,r){throw new Error("Method not implemented.")}
  method writeFile (line 9) | async writeFile(e,r){try{this[Tc](this.writeFile);let o=(typeof r=="stri...
  method write (line 9) | async write(...e){try{if(this[Tc](this.write),ArrayBuffer.isView(e[0])){...
  method writev (line 9) | async writev(e,r){try{this[Tc](this.writev);let o=0;if(typeof r<"u")for(...
  method readv (line 9) | readv(e,r){throw new Error("Method not implemented.")}
  method close (line 9) | close(){if(this[mf]===-1)return Promise.resolve();if(this[Gp])return thi...
  method [(Bo,mf,F_e=sy,R_e=Gp,T_e=kD,N_e=QD,Tc)] (line 9) | [(Bo,mf,F_e=sy,R_e=Gp,T_e=kD,N_e=QD,Tc)](e){if(this[mf]===-1){let r=new ...
  method [Nc] (line 9) | [Nc](){if(this[sy]--,this[sy]===0){let e=this[mf];this[mf]=-1,this[Bo].c...
  function Kw (line 9) | function Kw(t,e){e=new xD(e);let r=(o,a,n)=>{let u=o[a];o[a]=n,typeof u?...
  function FD (line 9) | function FD(t,e){let r=Object.create(t);return Kw(r,e),r}
  function oY (line 9) | function oY(t){let e=Math.ceil(Math.random()*4294967296).toString(16).pa...
  function aY (line 9) | function aY(){if(JR)return JR;let t=ue.toPortablePath(lY.default.tmpdir(...
  method detachTemp (line 9) | detachTemp(t){Lc.delete(t)}
  method mktempSync (line 9) | mktempSync(t){let{tmpdir:e,realTmpdir:r}=aY();for(;;){let o=oY("xfs-");t...
  method mktempPromise (line 9) | async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=aY();for(;;){let o=oY(...
  method rmtempPromise (line 9) | async rmtempPromise(){await Promise.all(Array.from(Lc.values()).map(asyn...
  method rmtempSync (line 9) | rmtempSync(){for(let t of Lc)try{oe.removeSync(t),Lc.delete(t)}catch{}}
  function O_e (line 9) | function O_e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT...
  function AY (line 9) | function AY(t,e,r){return!t.isSymbolicLink()&&!t.isFile()?!1:O_e(e,r)}
  function fY (line 9) | function fY(t,e,r){uY.stat(t,function(o,a){r(o,o?!1:AY(a,t,e))})}
  function M_e (line 9) | function M_e(t,e){return AY(uY.statSync(t),t,e)}
  function dY (line 9) | function dY(t,e,r){gY.stat(t,function(o,a){r(o,o?!1:mY(a,e))})}
  function U_e (line 9) | function U_e(t,e){return mY(gY.statSync(t),e)}
  function mY (line 9) | function mY(t,e){return t.isFile()&&__e(t,e)}
  function __e (line 9) | function __e(t,e){var r=t.mode,o=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:pr...
  function zR (line 9) | function zR(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Pro...
  function H_e (line 9) | function H_e(t,e){try{return RD.sync(t,e||{})}catch(r){if(e&&e.ignoreErr...
  function FY (line 9) | function FY(t,e){let r=t.options.env||process.env,o=process.cwd(),a=t.op...
  function W_e (line 9) | function W_e(t){return FY(t)||FY(t,!0)}
  function K_e (line 9) | function K_e(t){return t=t.replace(ZR,"^$1"),t}
  function V_e (line 9) | function V_e(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.r...
  function X_e (line 9) | function X_e(t){let r=Buffer.alloc(150),o;try{o=eT.openSync(t,"r"),eT.re...
  function n8e (line 9) | function n8e(t){t.file=jY(t);let e=t.file&&$_e(t.file);return e?(t.args....
  function i8e (line 9) | function i8e(t){if(!e8e)return t;let e=n8e(t),r=!t8e.test(e);if(t.option...
  function s8e (line 9) | function s8e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[]...
  function rT (line 9) | function rT(t,e){return Object.assign(new Error(`${e} ${t.command} ENOEN...
  function o8e (line 9) | function o8e(t,e){if(!tT)return;let r=t.emit;t.emit=function(o,a){if(o==...
  function WY (line 9) | function WY(t,e){return tT&&t===1&&!e.file?rT(e.original,"spawn"):null}
  function a8e (line 9) | function a8e(t,e){return tT&&t===1&&!e.file?rT(e.original,"spawnSync"):n...
  function zY (line 9) | function zY(t,e,r){let o=nT(t,e,r),a=JY.spawn(o.command,o.args,o.options...
  function l8e (line 9) | function l8e(t,e,r){let o=nT(t,e,r),a=JY.spawnSync(o.command,o.args,o.op...
  function c8e (line 9) | function c8e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function qg (line 9) | function qg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.lo...
  function o (line 9) | function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 9) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 9) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function u (line 9) | function u(h){return r[h.type](h)}
  function A (line 9) | function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=...
  function p (line 9) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function u8e (line 9) | function u8e(t,e){e=e!==void 0?e:{};var r={},o={Start:hg},a=hg,n=functio...
  function ND (line 12) | function ND(t,e={isGlobPattern:()=>!1}){try{return(0,$Y.parse)(t,e)}catc...
  function cy (line 12) | function cy(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:o},a...
  function LD (line 12) | function LD(t){return`${uy(t.chain)}${t.then?` ${oT(t.then)}`:""}`}
  function oT (line 12) | function oT(t){return`${t.type} ${LD(t.line)}`}
  function uy (line 12) | function uy(t){return`${lT(t)}${t.then?` ${aT(t.then)}`:""}`}
  function aT (line 12) | function aT(t){return`${t.type} ${uy(t.chain)}`}
  function lT (line 12) | function lT(t){switch(t.type){case"command":return`${t.envs.length>0?`${...
  function TD (line 12) | function TD(t){return`${t.name}=${t.args[0]?Yg(t.args[0]):""}`}
  function cT (line 12) | function cT(t){switch(t.type){case"redirection":return Jw(t);case"argume...
  function Jw (line 12) | function Jw(t){return`${t.subtype} ${t.args.map(e=>Yg(e)).join(" ")}`}
  function Yg (line 12) | function Yg(t){return t.segments.map(e=>uT(e)).join("")}
  function uT (line 12) | function uT(t){let e=(o,a)=>a?`"${o}"`:o,r=o=>o===""?"''":o.match(/[()}<...
  function OD (line 12) | function OD(t){let e=a=>{switch(a){case"addition":return"+";case"subtrac...
  function p8e (line 13) | function p8e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function Wg (line 13) | function Wg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.lo...
  function o (line 13) | function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 13) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 13) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function u (line 13) | function u(h){return r[h.type](h)}
  function A (line 13) | function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=...
  function p (line 13) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function h8e (line 13) | function h8e(t,e){e=e!==void 0?e:{};var r={},o={resolution:ke},a=ke,n="/...
  function MD (line 13) | function MD(t){let e=t.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The...
  function UD (line 13) | function UD(t){let e="";return t.from&&(e+=t.from.fullName,t.from.descri...
  function aW (line 13) | function aW(t){return typeof t>"u"||t===null}
  function g8e (line 13) | function g8e(t){return typeof t=="object"&&t!==null}
  function d8e (line 13) | function d8e(t){return Array.isArray(t)?t:aW(t)?[]:[t]}
  function m8e (line 13) | function m8e(t,e){var r,o,a,n;if(e)for(n=Object.keys(e),r=0,o=n.length;r...
  function y8e (line 13) | function y8e(t,e){var r="",o;for(o=0;o<e;o+=1)r+=t;return r}
  function E8e (line 13) | function E8e(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}
  function zw (line 13) | function zw(t,e){Error.call(this),this.name="YAMLException",this.reason=...
  function AT (line 13) | function AT(t,e,r,o,a){this.name=t,this.buffer=e,this.position=r,this.li...
  function I8e (line 17) | function I8e(t){var e={};return t!==null&&Object.keys(t).forEach(functio...
  function B8e (line 17) | function B8e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(C8e.i...
  function fT (line 17) | function fT(t,e,r){var o=[];return t.include.forEach(function(a){r=fT(a,...
  function D8e (line 17) | function D8e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;...
  function fy (line 17) | function fy(t){this.include=t.include||[],this.implicit=t.implicit||[],t...
  function Q8e (line 17) | function Q8e(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~...
  function F8e (line 17) | function F8e(){return null}
  function R8e (line 17) | function R8e(t){return t===null}
  function N8e (line 17) | function N8e(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="...
  function L8e (line 17) | function L8e(t){return t==="true"||t==="True"||t==="TRUE"}
  function O8e (line 17) | function O8e(t){return Object.prototype.toString.call(t)==="[object Bool...
  function _8e (line 17) | function _8e(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}
  function H8e (line 17) | function H8e(t){return 48<=t&&t<=55}
  function j8e (line 17) | function j8e(t){return 48<=t&&t<=57}
  function G8e (line 17) | function G8e(t){if(t===null)return!1;var e=t.length,r=0,o=!1,a;if(!e)ret...
  function q8e (line 17) | function q8e(t){var e=t,r=1,o,a,n=[];return e.indexOf("_")!==-1&&(e=e.re...
  function Y8e (line 17) | function Y8e(t){return Object.prototype.toString.call(t)==="[object Numb...
  function V8e (line 17) | function V8e(t){return!(t===null||!K8e.test(t)||t[t.length-1]==="_")}
  function J8e (line 17) | function J8e(t){var e,r,o,a;return e=t.replace(/_/g,"").toLowerCase(),r=...
  function X8e (line 17) | function X8e(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".na...
  function Z8e (line 17) | function Z8e(t){return Object.prototype.toString.call(t)==="[object Numb...
  function rHe (line 17) | function rHe(t){return t===null?!1:TW.exec(t)!==null||NW.exec(t)!==null}
  function nHe (line 17) | function nHe(t){var e,r,o,a,n,u,A,p=0,h=null,E,I,v;if(e=TW.exec(t),e===n...
  function iHe (line 17) | function iHe(t){return t.toISOString()}
  function oHe (line 17) | function oHe(t){return t==="<<"||t===null}
  function lHe (line 18) | function lHe(t){if(t===null)return!1;var e,r,o=0,a=t.length,n=gT;for(r=0...
  function cHe (line 18) | function cHe(t){var e,r,o=t.replace(/[\r\n=]/g,""),a=o.length,n=gT,u=0,A...
  function uHe (line 18) | function uHe(t){var e="",r=0,o,a,n=t.length,u=gT;for(o=0;o<n;o++)o%3===0...
  function AHe (line 18) | function AHe(t){return zg&&zg.isBuffer(t)}
  function gHe (line 18) | function gHe(t){if(t===null)return!0;var e=[],r,o,a,n,u,A=t;for(r=0,o=A....
  function dHe (line 18) | function dHe(t){return t!==null?t:[]}
  function EHe (line 18) | function EHe(t){if(t===null)return!0;var e,r,o,a,n,u=t;for(n=new Array(u...
  function CHe (line 18) | function CHe(t){if(t===null)return[];var e,r,o,a,n,u=t;for(n=new Array(u...
  function BHe (line 18) | function BHe(t){if(t===null)return!0;var e,r=t;for(e in r)if(IHe.call(r,...
  function vHe (line 18) | function vHe(t){return t!==null?t:{}}
  function PHe (line 18) | function PHe(){return!0}
  function bHe (line 18) | function bHe(){}
  function xHe (line 18) | function xHe(){return""}
  function kHe (line 18) | function kHe(t){return typeof t>"u"}
  function FHe (line 18) | function FHe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)...
  function RHe (line 18) | function RHe(t){var e=t,r=/\/([gim]*)$/.exec(t),o="";return e[0]==="/"&&...
  function THe (line 18) | function THe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multi...
  function NHe (line 18) | function NHe(t){return Object.prototype.toString.call(t)==="[object RegE...
  function OHe (line 18) | function OHe(t){if(t===null)return!1;try{var e="("+t+")",r=jD.parse(e,{r...
  function MHe (line 18) | function MHe(t){var e="("+t+")",r=jD.parse(e,{range:!0}),o=[],a;if(r.typ...
  function UHe (line 18) | function UHe(t){return t.toString()}
  function _He (line 18) | function _He(t){return Object.prototype.toString.call(t)==="[object Func...
  function oK (line 18) | function oK(t){return Object.prototype.toString.call(t)}
  function Hu (line 18) | function Hu(t){return t===10||t===13}
  function Zg (line 18) | function Zg(t){return t===9||t===32}
  function Ia (line 18) | function Ia(t){return t===9||t===32||t===10||t===13}
  function hy (line 18) | function hy(t){return t===44||t===91||t===93||t===123||t===125}
  function KHe (line 18) | function KHe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-9...
  function VHe (line 18) | function VHe(t){return t===120?2:t===117?4:t===85?8:0}
  function JHe (line 18) | function JHe(t){return 48<=t&&t<=57?t-48:-1}
  function aK (line 18) | function aK(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t==...
  function zHe (line 19) | function zHe(t){return t<=65535?String.fromCharCode(t):String.fromCharCo...
  function XHe (line 19) | function XHe(t,e){this.input=t,this.filename=e.filename||null,this.schem...
  function EK (line 19) | function EK(t,e){return new AK(e,new HHe(t.filename,t.input,t.position,t...
  function Pr (line 19) | function Pr(t,e){throw EK(t,e)}
  function YD (line 19) | function YD(t,e){t.onWarning&&t.onWarning.call(null,EK(t,e))}
  function qp (line 19) | function qp(t,e,r,o){var a,n,u,A;if(e<r){if(A=t.input.slice(e,r),o)for(a...
  function cK (line 19) | function cK(t,e,r,o){var a,n,u,A;for(yf.isObject(r)||Pr(t,"cannot merge ...
  function gy (line 19) | function gy(t,e,r,o,a,n,u,A){var p,h;if(Array.isArray(a))for(a=Array.pro...
  function mT (line 19) | function mT(t){var e;e=t.input.charCodeAt(t.position),e===10?t.position+...
  function Wi (line 19) | function Wi(t,e,r){for(var o=0,a=t.input.charCodeAt(t.position);a!==0;){...
  function WD (line 19) | function WD(t){var e=t.position,r;return r=t.input.charCodeAt(e),!!((r==...
  function yT (line 19) | function yT(t,e){e===1?t.result+=" ":e>1&&(t.result+=yf.repeat(`
  function ZHe (line 20) | function ZHe(t,e,r){var o,a,n,u,A,p,h,E,I=t.kind,v=t.result,x;if(x=t.inp...
  function $He (line 20) | function $He(t,e){var r,o,a;if(r=t.input.charCodeAt(t.position),r!==39)r...
  function e6e (line 20) | function e6e(t,e){var r,o,a,n,u,A;if(A=t.input.charCodeAt(t.position),A!...
  function t6e (line 20) | function t6e(t,e){var r=!0,o,a=t.tag,n,u=t.anchor,A,p,h,E,I,v={},x,C,R,L...
  function r6e (line 20) | function r6e(t,e){var r,o,a=dT,n=!1,u=!1,A=e,p=0,h=!1,E,I;if(I=t.input.c...
  function uK (line 26) | function uK(t,e){var r,o=t.tag,a=t.anchor,n=[],u,A=!1,p;for(t.anchor!==n...
  function n6e (line 26) | function n6e(t,e,r){var o,a,n,u,A=t.tag,p=t.anchor,h={},E={},I=null,v=nu...
  function i6e (line 26) | function i6e(t){var e,r=!1,o=!1,a,n,u;if(u=t.input.charCodeAt(t.position...
  function s6e (line 26) | function s6e(t){var e,r;if(r=t.input.charCodeAt(t.position),r!==38)retur...
  function o6e (line 26) | function o6e(t){var e,r,o;if(o=t.input.charCodeAt(t.position),o!==42)ret...
  function dy (line 26) | function dy(t,e,r,o,a){var n,u,A,p=1,h=!1,E=!1,I,v,x,C,R;if(t.listener!=...
  function a6e (line 26) | function a6e(t){var e=t.position,r,o,a,n=!1,u;for(t.version=null,t.check...
  function CK (line 26) | function CK(t,e){t=String(t),e=e||{},t.length!==0&&(t.charCodeAt(t.lengt...
  function wK (line 27) | function wK(t,e,r){e!==null&&typeof e=="object"&&typeof r>"u"&&(r=e,e=nu...
  function IK (line 27) | function IK(t,e){var r=CK(t,e);if(r.length!==0){if(r.length===1)return r...
  function l6e (line 27) | function l6e(t,e,r){return typeof e=="object"&&e!==null&&typeof r>"u"&&(...
  function c6e (line 27) | function c6e(t,e){return IK(t,yf.extend({schema:fK},e))}
  function x6e (line 27) | function x6e(t,e){var r,o,a,n,u,A,p;if(e===null)return{};for(r={},o=Obje...
  function vK (line 27) | function vK(t){var e,r,o;if(e=t.toString(16).toUpperCase(),t<=255)r="x",...
  function k6e (line 27) | function k6e(t){this.schema=t.schema||u6e,this.indent=Math.max(1,t.inden...
  function DK (line 27) | function DK(t,e){for(var r=eI.repeat(" ",e),o=0,a=-1,n="",u,A=t.length;o...
  function ET (line 29) | function ET(t,e){return`
  function Q6e (line 30) | function Q6e(t,e){var r,o,a;for(r=0,o=t.implicitTypes.length;r<o;r+=1)if...
  function wT (line 30) | function wT(t){return t===h6e||t===f6e}
  function my (line 30) | function my(t){return 32<=t&&t<=126||161<=t&&t<=55295&&t!==8232&&t!==823...
  function F6e (line 30) | function F6e(t){return my(t)&&!wT(t)&&t!==65279&&t!==p6e&&t!==$w}
  function SK (line 30) | function SK(t,e){return my(t)&&t!==65279&&t!==TK&&t!==LK&&t!==OK&&t!==MK...
  function R6e (line 30) | function R6e(t){return my(t)&&t!==65279&&!wT(t)&&t!==w6e&&t!==v6e&&t!==N...
  function _K (line 30) | function _K(t){var e=/^\n* /;return e.test(t)}
  function T6e (line 30) | function T6e(t,e,r,o,a){var n,u,A,p=!1,h=!1,E=o!==-1,I=-1,v=R6e(t.charCo...
  function N6e (line 30) | function N6e(t,e,r,o){t.dump=function(){if(e.length===0)return"''";if(!t...
  function PK (line 30) | function PK(t,e){var r=_K(t)?String(e):"",o=t[t.length-1]===`
  function bK (line 34) | function bK(t){return t[t.length-1]===`
  function L6e (line 35) | function L6e(t,e){for(var r=/(\n+)([^\n]*)/g,o=function(){var h=t.indexOf(`
  function xK (line 38) | function xK(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,o,a=0...
  function O6e (line 41) | function O6e(t){for(var e="",r,o,a,n=0;n<t.length;n++){if(r=t.charCodeAt...
  function M6e (line 41) | function M6e(t,e,r){var o="",a=t.tag,n,u;for(n=0,u=r.length;n<u;n+=1)$g(...
  function U6e (line 41) | function U6e(t,e,r,o){var a="",n=t.tag,u,A;for(u=0,A=r.length;u<A;u+=1)$...
  function _6e (line 41) | function _6e(t,e,r){var o="",a=t.tag,n=Object.keys(r),u,A,p,h,E;for(u=0,...
  function H6e (line 41) | function H6e(t,e,r,o){var a="",n=t.tag,u=Object.keys(r),A,p,h,E,I,v;if(t...
  function kK (line 41) | function kK(t,e,r){var o,a,n,u,A,p;for(a=r?t.explicitTypes:t.implicitTyp...
  function $g (line 41) | function $g(t,e,r,o,a,n){t.tag=null,t.dump=r,kK(t,r,!1)||kK(t,r,!0);var ...
  function j6e (line 41) | function j6e(t,e){var r=[],o=[],a,n;for(CT(t,r,o),a=0,n=o.length;a<n;a+=...
  function CT (line 41) | function CT(t,e,r){var o,a,n;if(t!==null&&typeof t=="object")if(a=e.inde...
  function YK (line 41) | function YK(t,e){e=e||{};var r=new k6e(e);return r.noRefs||j6e(t,r),$g(r...
  function G6e (line 42) | function G6e(t,e){return YK(t,eI.extend({schema:A6e},e))}
  function JD (line 42) | function JD(t){return function(){throw new Error("Function "+t+" is depr...
  function Y6e (line 42) | function Y6e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function ed (line 42) | function ed(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.lo...
  function o (line 42) | function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 42) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 42) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function u (line 42) | function u(h){return r[h.type](h)}
  function A (line 42) | function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=...
  function p (line 42) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function W6e (line 42) | function W6e(t,e){e=e!==void 0?e:{};var r={},o={Start:pu},a=pu,n=functio...
  function eV (line 51) | function eV(t){return t.match(K6e)?t:JSON.stringify(t)}
  function rV (line 51) | function rV(t){return typeof t>"u"?!0:typeof t=="object"&&t!==null&&!Arr...
  function BT (line 51) | function BT(t,e,r){if(t===null)return`null
  function Ba (line 61) | function Ba(t){try{let e=BT(t,0,!1);return e!==`
  function V6e (line 62) | function V6e(t){return t.endsWith(`
  function z6e (line 64) | function z6e(t){if(J6e.test(t))return V6e(t);let e=(0,XD.safeLoad)(t,{sc...
  function Ki (line 64) | function Ki(t){return z6e(t)}
  method constructor (line 64) | constructor(e){this.data=e}
  function aV (line 64) | function aV(t){return typeof t=="string"?!!ju[t]:Object.keys(t).every(fu...
  method constructor (line 64) | constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageEr...
  method constructor (line 64) | constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanio...
  method constructor (line 75) | constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type...
  function $6e (line 80) | function $6e(t){let e=t.split(`
  function Do (line 82) | function Do(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,`
  function Ko (line 90) | function Ko(t){return{...t,[nI]:!0}}
  function Gu (line 90) | function Gu(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&...
  function rS (line 90) | function rS(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(...
  function iI (line 90) | function iI(t,e){return e.length===1?new it(`${t}${rS(e[0],{mergeName:!0...
  function nd (line 92) | function nd(t,e,r){if(typeof r>"u")return e;let o=[],a=[],n=A=>{let p=e;...
  function jn (line 92) | function jn(t){return t===null?"null":t===void 0?"undefined":t===""?"an ...
  function Ey (line 92) | function Ey(t,e){if(t.length===0)return"nothing";if(t.length===1)return ...
  function Wp (line 92) | function Wp(t,e){var r,o,a;return typeof e=="number"?`${(r=t?.p)!==null&...
  function QT (line 92) | function QT(t,e,r){return t===1?e:r}
  function pr (line 92) | function pr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}
  function sje (line 92) | function sje(t,e){return r=>{t[e]=r}}
  function Yu (line 92) | function Yu(t,e){return r=>{let o=t[e];return t[e]=r,Yu(t,e).bind(null,o)}}
  function sI (line 92) | function sI(t,e,r){let o=()=>(t(r()),a),a=()=>(t(e),o);return o}
  function FT (line 92) | function FT(){return Hr({test:(t,e)=>!0})}
  function pV (line 92) | function pV(t){return Hr({test:(e,r)=>e!==t?pr(r,`Expected ${jn(t)} (got...
  function Cy (line 92) | function Cy(){return Hr({test:(t,e)=>typeof t!="string"?pr(e,`Expected a...
  function Ks (line 92) | function Ks(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>ty...
  function aje (line 92) | function aje(){return Hr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(...
  function RT (line 92) | function RT(){return Hr({test:(t,e)=>{var r;if(typeof t!="number"){if(ty...
  function lje (line 92) | function lje(t){return Hr({test:(e,r)=>{var o;if(typeof r?.coercions>"u"...
  function cje (line 92) | function cje(){return Hr({test:(t,e)=>{var r;if(!(t instanceof Date)){if...
  function nS (line 92) | function nS(t,{delimiter:e}={}){return Hr({test:(r,o)=>{var a;let n=r;if...
  function uje (line 92) | function uje(t,{delimiter:e}={}){let r=nS(t,{delimiter:e});return Hr({te...
  function Aje (line 92) | function Aje(t,e){let r=nS(iS([t,e])),o=sS(e,{keys:t});return Hr({test:(...
  function iS (line 92) | function iS(t,{delimiter:e}={}){let r=dV(t.length);return Hr({test:(o,a)...
  function sS (line 92) | function sS(t,{keys:e=null}={}){let r=nS(iS([e??Cy(),t]));return Hr({tes...
  function fje (line 92) | function fje(t,e={}){return sS(t,e)}
  function hV (line 92) | function hV(t,{extra:e=null}={}){let r=Object.keys(t),o=Hr({test:(a,n)=>...
  function pje (line 92) | function pje(t){return hV(t,{extra:sS(FT())})}
  function gV (line 92) | function gV(t){return()=>t}
  function Hr (line 92) | function Hr({test:t}){return gV(t)()}
  function gje (line 92) | function gje(t,e){if(!e(t))throw new Kp}
  function dje (line 92) | function dje(t,e){let r=[];if(!e(t,{errors:r}))throw new Kp({errors:r})}
  function mje (line 92) | function mje(t,e){}
  function yje (line 92) | function yje(t,e,{coerce:r=!1,errors:o,throw:a}={}){let n=o?[]:void 0;if...
  function Eje (line 92) | function Eje(t,e){let r=iS(t);return(...o)=>{if(!r(o))throw new Kp;retur...
  function Cje (line 92) | function Cje(t){return Hr({test:(e,r)=>e.length>=t?!0:pr(r,`Expected to ...
  function wje (line 92) | function wje(t){return Hr({test:(e,r)=>e.length<=t?!0:pr(r,`Expected to ...
  function dV (line 92) | function dV(t){return Hr({test:(e,r)=>e.length!==t?pr(r,`Expected to hav...
  function Ije (line 92) | function Ije({map:t}={}){return Hr({test:(e,r)=>{let o=new Set,a=new Set...
  function Bje (line 92) | function Bje(){return Hr({test:(t,e)=>t<=0?!0:pr(e,`Expected to be negat...
  function vje (line 92) | function vje(){return Hr({test:(t,e)=>t>=0?!0:pr(e,`Expected to be posit...
  function NT (line 92) | function NT(t){return Hr({test:(e,r)=>e>=t?!0:pr(r,`Expected to be at le...
  function Dje (line 92) | function Dje(t){return Hr({test:(e,r)=>e<=t?!0:pr(r,`Expected to be at m...
  function Sje (line 92) | function Sje(t,e){return Hr({test:(r,o)=>r>=t&&r<=e?!0:pr(o,`Expected to...
  function Pje (line 92) | function Pje(t,e){return Hr({test:(r,o)=>r>=t&&r<e?!0:pr(o,`Expected to ...
  function LT (line 92) | function LT({unsafe:t=!1}={}){return Hr({test:(e,r)=>e!==Math.round(e)?p...
  function oI (line 92) | function oI(t){return Hr({test:(e,r)=>t.test(e)?!0:pr(r,`Expected to mat...
  function bje (line 92) | function bje(){return Hr({test:(t,e)=>t!==t.toLowerCase()?pr(e,`Expected...
  function xje (line 92) | function xje(){return Hr({test:(t,e)=>t!==t.toUpperCase()?pr(e,`Expected...
  function kje (line 92) | function kje(){return Hr({test:(t,e)=>ije.test(t)?!0:pr(e,`Expected to b...
  function Qje (line 92) | function Qje(){return Hr({test:(t,e)=>fV.test(t)?!0:pr(e,`Expected to be...
  function Fje (line 92) | function Fje({alpha:t=!1}){return Hr({test:(e,r)=>(t?tje.test(e):rje.tes...
  function Rje (line 92) | function Rje(){return Hr({test:(t,e)=>nje.test(t)?!0:pr(e,`Expected to b...
  function Tje (line 92) | function Tje(t=FT()){return Hr({test:(e,r)=>{let o;try{o=JSON.parse(e)}c...
  function oS (line 92) | function oS(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Hr({test:(o,...
  function aI (line 92) | function aI(t,...e){let r=Array.isArray(e[0])?e[0]:e;return oS(t,r)}
  function Nje (line 92) | function Nje(t){return Hr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}
  function Lje (line 92) | function Lje(t){return Hr({test:(e,r)=>e===null?!0:t(e,r)})}
  function Oje (line 92) | function Oje(t,e){var r;let o=new Set(t),a=lI[(r=e?.missingIf)!==null&&r...
  function OT (line 92) | function OT(t,e){var r;let o=new Set(t),a=lI[(r=e?.missingIf)!==null&&r!...
  function Mje (line 92) | function Mje(t,e){var r;let o=new Set(t),a=lI[(r=e?.missingIf)!==null&&r...
  function Uje (line 92) | function Uje(t,e){var r;let o=new Set(t),a=lI[(r=e?.missingIf)!==null&&r...
  function cI (line 92) | function cI(t,e,r,o){var a,n;let u=new Set((a=o?.ignore)!==null&&a!==voi...
  method constructor (line 92) | constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=`
  method constructor (line 94) | constructor(){this.help=!1}
  method Usage (line 94) | static Usage(e){return e}
  method catch (line 94) | async catch(e){throw e}
  method validateAndExecute (line 94) | async validateAndExecute(){let r=this.constructor.schema;if(Array.isArra...
  function va (line 94) | function va(t){PT&&console.log(t)}
  function yV (line 94) | function yV(){let t={nodes:[]};for(let e=0;e<cn.CustomNode;++e)t.nodes.p...
  function Hje (line 94) | function Hje(t){let e=yV(),r=[],o=e.nodes.length;for(let a of t){r.push(...
  function Oc (line 94) | function Oc(t,e){return t.nodes.push(e),t.nodes.length-1}
  function jje (line 94) | function jje(t){let e=new Set,r=o=>{if(e.has(o))return;e.add(o);let a=t....
  function Gje (line 94) | function Gje(t,{prefix:e=""}={}){if(PT){va(`${e}Nodes are:`);for(let r=0...
  function qje (line 94) | function qje(t,e,r=!1){va(`Running a vm on ${JSON.stringify(e)}`);let o=...
  function Yje (line 94) | function Yje(t,e,{endToken:r=Hn.EndOfInput}={}){let o=qje(t,[...e,r]);re...
  function Wje (line 94) | function Wje(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path....
  function Kje (line 94) | function Kje(t,e){let r=e.filter(v=>v.selectedIndex!==null),o=r.filter(v...
  function Vje (line 94) | function Vje(t){let e=[],r=[];for(let o of t)o.selectedIndex===rd?r.push...
  function EV (line 94) | function EV(t,e,...r){return e===void 0?Array.from(t):EV(t.filter((o,a)=...
  function $a (line 94) | function $a(){return{dynamics:[],shortcuts:[],statics:{}}}
  function CV (line 94) | function CV(t){return t===cn.SuccessNode||t===cn.ErrorNode}
  function MT (line 94) | function MT(t,e=0){return{to:CV(t.to)?t.to:t.to>=cn.CustomNode?t.to+e-cn...
  function Jje (line 94) | function Jje(t,e=0){let r=$a();for(let[o,a]of t.dynamics)r.dynamics.push...
  function Ps (line 94) | function Ps(t,e,r,o,a){t.nodes[e].dynamics.push([r,{to:o,reducer:a}])}
  function wy (line 94) | function wy(t,e,r,o){t.nodes[e].shortcuts.push({to:r,reducer:o})}
  function Jo (line 94) | function Jo(t,e,r,o,a){(Object.prototype.hasOwnProperty.call(t.nodes[e]....
  function aS (line 94) | function aS(t,e,r,o,a){if(Array.isArray(e)){let[n,...u]=e;return t[n](r,...
  method constructor (line 94) | constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trai...
  method addPath (line 94) | addPath(e){this.paths.push(e)}
  method setArity (line 94) | setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,ex...
  method addPositional (line 94) | addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra==...
  method addRest (line 94) | addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===el)throw n...
  method addProxy (line 94) | addProxy({required:e=0}={}){this.addRest({required:e}),this.arity.proxy=!0}
  method addOption (line 94) | addOption({names:e,description:r,arity:o=0,hidden:a=!1,required:n=!1,all...
  method setContext (line 94) | setContext(e){this.context=e}
  method usage (line 94) | usage({detailed:e=!0,inlineOptions:r=!0}={}){let o=[this.cliOpts.binaryN...
  method compile (line 94) | compile(){if(typeof this.context>"u")throw new Error("Assertion failed: ...
  method registerOptions (line 94) | registerOptions(e,r){Ps(e,r,["isOption","--"],r,"inhibateOptions"),Ps(e,...
  method constructor (line 94) | constructor({binaryName:e="..."}={}){this.builders=[],this.opts={binaryN...
  method build (line 94) | static build(e,r={}){return new Iy(r).commands(e).compile()}
  method getBuilderByIndex (line 94) | getBuilderByIndex(e){if(!(e>=0&&e<this.builders.length))throw new Error(...
  method commands (line 94) | commands(e){for(let r of e)r(this.command());return this}
  method command (line 94) | command(){let e=new _T(this.builders.length,this.opts);return this.build...
  method compile (line 94) | compile(){let e=[],r=[];for(let a of this.builders){let{machine:n,contex...
  function IV (line 94) | function IV(){return cS.default&&"getColorDepth"in cS.default.WriteStrea...
  function BV (line 94) | function BV(t){let e=wV;if(typeof e>"u"){if(t.stdout===process.stdout&&t...
  method constructor (line 94) | constructor(e){super(),this.contexts=e,this.commands=[]}
  method from (line 94) | static from(e,r){let o=new By(r);o.path=e.path;for(let a of e.options)sw...
  method execute (line 94) | async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index...
  function bV (line 98) | async function bV(...t){let{resolvedOptions:e,resolvedCommandClasses:r,r...
  function xV (line 98) | async function xV(...t){let{resolvedOptions:e,resolvedCommandClasses:r,r...
  function kV (line 98) | function kV(t){let e,r,o,a;switch(typeof process<"u"&&typeof process.arg...
  function PV (line 98) | function PV(t){return t()}
  method constructor (line 98) | constructor({binaryLabel:e,binaryName:r="...",binaryVersion:o,enableCapt...
  method from (line 98) | static from(e,r={}){let o=new as(r),a=Array.isArray(e)?e:[e];for(let n o...
  method register (line 98) | register(e){var r;let o=new Map,a=new e;for(let p in a){let h=a[p];typeo...
  method process (line 98) | process(e,r){let{input:o,context:a,partial:n}=typeof e=="object"&&Array....
  method run (line 98) | async run(e,r){var o,a;let n,u={...as.defaultContext,...r},A=(o=this.ena...
  method runExit (line 98) | async runExit(e,r){process.exitCode=await this.run(e,r)}
  method definition (line 98) | definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:o}=thi...
  method definitions (line 98) | definitions({colored:e=!1}={}){let r=[];for(let o of this.registrations....
  method usage (line 98) | usage(e=null,{colored:r,detailed:o=!1,prefix:a="$ "}={}){var n;if(e===nu...
  method error (line 124) | error(e,r){var o,{colored:a,command:n=(o=e[SV])!==null&&o!==void 0?o:nul...
  method format (line 127) | format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:as....
  method getUsageByRegistration (line 127) | getUsageByRegistration(e,r){let o=this.registrations.get(e);if(typeof o>...
  method getUsageByIndex (line 127) | getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}
  method execute (line 127) | async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.def...
  method execute (line 128) | async execute(){this.context.stdout.write(this.cli.usage())}
  function uS (line 128) | function uS(t={}){return Ko({definition(e,r){var o;e.addProxy({name:(o=t...
  method constructor (line 128) | constructor(){super(...arguments),this.args=uS()}
  method execute (line 128) | async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.pro...
  method execute (line 129) | async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVer...
  function OV (line 130) | function OV(t,e,r){let[o,a]=Gu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=n...
  function UV (line 130) | function UV(t,e,r){let[o,a]=Gu(e,r??{}),n=t.split(","),u=new Set(n);retu...
  function HV (line 130) | function HV(t,e,r){let[o,a]=Gu(e,r??{}),n=t.split(","),u=new Set(n);retu...
  function GV (line 130) | function GV(t={}){return Ko({definition(e,r){var o;e.addRest({name:(o=t....
  function Xje (line 130) | function Xje(t,e,r){let[o,a]=Gu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=...
  function Zje (line 130) | function Zje(t={}){let{required:e=!0}=t;return Ko({definition(r,o){var a...
  function YV (line 130) | function YV(t,...e){return typeof t=="string"?Xje(t,...e):Zje(t)}
  function iGe (line 130) | function iGe(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,`
  function sGe (line 132) | function sGe(t){let e=XV(t),r=bs.configDotenv({path:e});if(!r.parsed)thr...
  function oGe (line 132) | function oGe(t){console.log(`[dotenv@${YT}][INFO] ${t}`)}
  function aGe (line 132) | function aGe(t){console.log(`[dotenv@${YT}][WARN] ${t}`)}
  function GT (line 132) | function GT(t){console.log(`[dotenv@${YT}][DEBUG] ${t}`)}
  function zV (line 132) | function zV(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KE...
  function lGe (line 132) | function lGe(t,e){let r;try{r=new URL(e)}catch(A){throw A.code==="ERR_IN...
  function XV (line 132) | function XV(t){let e=qT.resolve(process.cwd(),".env");return t&&t.path&&...
  function cGe (line 132) | function cGe(t){return t[0]==="~"?qT.join(eGe.homedir(),t.slice(1)):t}
  function uGe (line 132) | function uGe(t){oGe("Loading env from encrypted .env.vault");let e=bs._p...
  function AGe (line 132) | function AGe(t){let e=qT.resolve(process.cwd(),".env"),r="utf8",o=Boolea...
  function fGe (line 132) | function fGe(t){let e=XV(t);return zV(t).length===0?bs.configDotenv(t):J...
  function pGe (line 132) | function pGe(t,e){let r=Buffer.from(e.slice(-64),"hex"),o=Buffer.from(t,...
  function hGe (line 132) | function hGe(t,e,r={}){let o=Boolean(r&&r.debug),a=Boolean(r&&r.override...
  function Wu (line 132) | function Wu(t){return`YN${t.toString(10).padStart(4,"0")}`}
  function AS (line 132) | function AS(t){let e=Number(t.slice(2));if(typeof wr[e]>"u")throw new Er...
  method constructor (line 132) | constructor(e,r){if(r=TGe(r),e instanceof tl){if(e.loose===!!r.loose&&e....
  method format (line 132) | format(){return this.version=`${this.major}.${this.minor}.${this.patch}`...
  method toString (line 132) | toString(){return this.version}
  method compare (line 132) | compare(e){if(hS("SemVer.compare",this.version,this.options,e),!(e insta...
  method compareMain (line 132) | compareMain(e){return e instanceof tl||(e=new tl(e,this.options)),Dy(thi...
  method comparePre (line 132) | comparePre(e){if(e instanceof tl||(e=new tl(e,this.options)),this.prerel...
  method compareBuild (line 132) | compareBuild(e){e instanceof tl||(e=new tl(e,this.options));let r=0;do{l...
  method inc (line 132) | inc(e,r,o){switch(e){case"premajor":this.prerelease.length=0,this.patch=...
  function Cn (line 132) | function Cn(t){var e=this;if(e instanceof Cn||(e=new Cn),e.tail=null,e.h...
  function bqe (line 132) | function bqe(t,e,r){var o=e===t.head?new od(r,null,e,t):new od(r,e,e.nex...
  function xqe (line 132) | function xqe(t,e){t.tail=new od(e,t.tail,null,t),t.head||(t.head=t.tail)...
  function kqe (line 132) | function kqe(t,e){t.head=new od(e,null,t.head,t),t.tail||(t.tail=t.head)...
  function od (line 132) | function od(t,e,r,o){if(!(this instanceof od))return new od(t,e,r,o);thi...
  method constructor (line 132) | constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(type...
  method max (line 132) | set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a...
  method max (line 132) | get max(){return this[ad]}
  method allowStale (line 132) | set allowStale(e){this[EI]=!!e}
  method allowStale (line 132) | get allowStale(){return this[EI]}
  method maxAge (line 132) | set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be ...
  method maxAge (line 132) | get maxAge(){return this[ld]}
  method lengthCalculator (line 132) | set lengthCalculator(e){typeof e!="function"&&(e=$T),e!==this[Sy]&&(this...
  method lengthCalculator (line 132) | get lengthCalculator(){return this[Sy]}
  method length (line 132) | get length(){return this[Bf]}
  method itemCount (line 132) | get itemCount(){return this[xs].length}
  method rforEach (line 132) | rforEach(e,r){r=r||this;for(let o=this[xs].tail;o!==null;){let a=o.prev;...
  method forEach (line 132) | forEach(e,r){r=r||this;for(let o=this[xs].head;o!==null;){let a=o.next;i...
  method keys (line 132) | keys(){return this[xs].toArray().map(e=>e.key)}
  method values (line 132) | values(){return this[xs].toArray().map(e=>e.value)}
  method reset (line 132) | reset(){this[If]&&this[xs]&&this[xs].length&&this[xs].forEach(e=>this[If...
  method dump (line 132) | dump(){return this[xs].map(e=>BS(this,e)?!1:{k:e.key,v:e.value,e:e.now+(...
  method dumpLru (line 132) | dumpLru(){return this[xs]}
  method set (line 132) | set(e,r,o){if(o=o||this[ld],o&&typeof o!="number")throw new TypeError("m...
  method has (line 132) | has(e){if(!this[Mc].has(e))return!1;let r=this[Mc].get(e).value;return!B...
  method get (line 132) | get(e){return eN(this,e,!0)}
  method peek (line 132) | peek(e){return eN(this,e,!1)}
  method pop (line 132) | pop(){let e=this[xs].tail;return e?(Py(this,e),e.value):null}
  method del (line 132) | del(e){Py(this,this[Mc].get(e))}
  method load (line 132) | load(e){this.reset();let r=Date.now();for(let o=e.length-1;o>=0;o--){let...
  method prune (line 132) | prune(){this[Mc].forEach((e,r)=>eN(this,r,!1))}
  method constructor (line 132) | constructor(e,r,o,a,n){this.key=e,this.value=r,this.length=o,this.now=a,...
  method constructor (line 132) | constructor(e,r){if(r=Rqe(r),e instanceof cd)return e.loose===!!r.loose&...
  method format (line 132) | format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||"...
  method toString (line 132) | toString(){return this.range}
  method parseRange (line 132) | parseRange(e){let o=((this.options.includePrerelease&&Mqe)|(this.options...
  method intersects (line 132) | intersects(e,r){if(!(e instanceof cd))throw new TypeError("a Range is re...
  method test (line 132) | test(e){if(!e)return!1;if(typeof e=="string")try{e=new Tqe(e,this.option...
  method ANY (line 132) | static get ANY(){return wI}
  method constructor (line 132) | constructor(e,r){if(r=fz(r),e instanceof by){if(e.loose===!!r.loose)retu...
  method parse (line 132) | parse(e){let r=this.options.loose?pz[hz.COMPARATORLOOSE]:pz[hz.COMPARATO...
  method toString (line 132) | toString(){return this.value}
  method test (line 132) | test(e){if(sN("Comparator.test",e,this.options.loose),this.semver===wI||...
  method intersects (line 132) | intersects(e,r){if(!(e instanceof by))throw new TypeError("a Comparator ...
  function p5e (line 132) | function p5e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function ud (line 132) | function ud(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.lo...
  function o (line 132) | function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 132) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 132) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function u (line 132) | function u(h){return r[h.type](h)}
  function A (line 132) | function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=...
  function p (line 132) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function h5e (line 132) | function h5e(t,e){e=e!==void 0?e:{};var r={},o={Expression:y},a=y,n="|",...
  function d5e (line 134) | function d5e(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}
  function m5e (line 134) | function m5e(){let t={},e=Object.keys(SS);for(let r=e.length,o=0;o<r;o++...
  function y5e (line 134) | function y5e(t){let e=m5e(),r=[t];for(e[t].distance=0;r.length;){let o=r...
  function E5e (line 134) | function E5e(t,e){return function(r){return e(t(r))}}
  function C5e (line 134) | function C5e(t,e){let r=[e[t].parent,t],o=SS[e[t].parent][t],a=e[t].pare...
  function B5e (line 134) | function B5e(t){let e=function(...r){let o=r[0];return o==null?o:(o.leng...
  function v5e (line 134) | function v5e(t){let e=function(...r){let o=r[0];if(o==null)return o;o.le...
  function D5e (line 134) | function D5e(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2...
  function hN (line 134) | function hN(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t...
  function gN (line 134) | function gN(t,e){if(Jp===0)return 0;if(Ml("color=16m")||Ml("color=full")...
  function P5e (line 134) | function P5e(t){let e=gN(t,t&&t.isTTY);return hN(e)}
  function IX (line 138) | function IX(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5|...
  function T5e (line 138) | function T5e(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o...
  function N5e (line 138) | function N5e(t){CX.lastIndex=0;let e=[],r;for(;(r=CX.exec(t))!==null;){l...
  function wX (line 138) | function wX(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a...
  method constructor (line 138) | constructor(e){return SX(e)}
  function bS (line 138) | function bS(t){return SX(t)}
  method get (line 138) | get(){let r=xS(this,wN(e.open,e.close,this._styler),this._isEmpty);retur...
  method get (line 138) | get(){let t=xS(this,this._styler,!0);return Object.defineProperty(this,"...
  method get (line 138) | get(){let{level:e}=this;return function(...r){let o=wN(SI.color[DX[e]][t...
  method get (line 138) | get(){let{level:r}=this;return function(...o){let a=wN(SI.bgColor[DX[r]]...
  method get (line 138) | get(){return this._generator.level}
  method set (line 138) | set(t){this._generator.level=t}
  function j5e (line 139) | function j5e(t,e,r){let o=BN(t,e,"-",!1,r)||[],a=BN(e,t,"",!1,r)||[],n=B...
  function G5e (line 139) | function G5e(t,e){let r=1,o=1,a=LX(t,r),n=new Set([e]);for(;t<=a&&a<=e;)...
  function q5e (line 139) | function q5e(t,e,r){if(t===e)return{pattern:t,count:[],digits:0};let o=Y...
  function TX (line 139) | function TX(t,e,r,o){let a=G5e(t,e),n=[],u=t,A;for(let p=0;p<a.length;p+...
  function BN (line 139) | function BN(t,e,r,o,a){let n=[];for(let u of t){let{string:A}=u;!o&&!NX(...
  function Y5e (line 139) | function Y5e(t,e){let r=[];for(let o=0;o<t.length;o++)r.push([t[o],e[o]]...
  function W5e (line 139) | function W5e(t,e){return t>e?1:e>t?-1:0}
  function NX (line 139) | function NX(t,e,r){return t.some(o=>o[e]===r)}
  function LX (line 139) | function LX(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}
  function OX (line 139) | function OX(t,e){return t-t%Math.pow(10,e)}
  function MX (line 139) | function MX(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}
  function K5e (line 139) | function K5e(t,e,r){return`[${t}${e-t===1?"":"-"}${e}]`}
  function UX (line 139) | function UX(t){return/^-?(0+)\d/.test(t)}
  function V5e (line 139) | function V5e(t,e,r){if(!e.isPadded)return t;let o=Math.abs(e.maxLen-Stri...
  method extglobChars (line 140) | extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t....
  method globChars (line 140) | globChars(t){return t===!0?R7e:gZ}
  function nYe (line 140) | function nYe(){this.__data__=[],this.size=0}
  function iYe (line 140) | function iYe(t,e){return t===e||t!==t&&e!==e}
  function oYe (line 140) | function oYe(t,e){for(var r=t.length;r--;)if(sYe(t[r][0],e))return r;ret...
  function uYe (line 140) | function uYe(t){var e=this.__data__,r=aYe(e,t);if(r<0)return!1;var o=e.l...
  function fYe (line 140) | function fYe(t){var e=this.__data__,r=AYe(e,t);return r<0?void 0:e[r][1]}
  function hYe (line 140) | function hYe(t){return pYe(this.__data__,t)>-1}
  function dYe (line 140) | function dYe(t,e){var r=this.__data__,o=gYe(r,t);return o<0?(++this.size...
  function Ly (line 140) | function Ly(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){va...
  function BYe (line 140) | function BYe(){this.__data__=new IYe,this.size=0}
  function vYe (line 140) | function vYe(t){var e=this.__data__,r=e.delete(t);return this.size=e.siz...
  function DYe (line 140) | function DYe(t){return this.__data__.get(t)}
  function SYe (line 140) | function SYe(t){return this.__data__.has(t)}
  function NYe (line 140) | function NYe(t){var e=RYe.call(t,TI),r=t[TI];try{t[TI]=void 0;var o=!0}c...
  function MYe (line 140) | function MYe(t){return OYe.call(t)}
  function GYe (line 140) | function GYe(t){return t==null?t===void 0?jYe:HYe:d$&&d$ in Object(t)?UY...
  function qYe (line 140) | function qYe(t){var e=typeof t;return t!=null&&(e=="object"||e=="functio...
  function XYe (line 140) | function XYe(t){if(!WYe(t))return!1;var e=YYe(t);return e==VYe||e==JYe||...
  function eWe (line 140) | function eWe(t){return!!I$&&I$ in t}
  function nWe (line 140) | function nWe(t){if(t!=null){try{return rWe.call(t)}catch{}try{return t+"...
  function gWe (line 140) | function gWe(t){if(!oWe(t)||sWe(t))return!1;var e=iWe(t)?hWe:cWe;return ...
  function dWe (line 140) | function dWe(t,e){return t?.[e]}
  function EWe (line 140) | function EWe(t,e){var r=yWe(t,e);return mWe(r)?r:void 0}
  function DWe (line 140) | function DWe(){this.__data__=R$?R$(null):{},this.size=0}
  function SWe (line 140) | function SWe(t){var e=this.has(t)&&delete this.__data__[t];return this.s...
  function QWe (line 140) | function QWe(t){var e=this.__data__;if(PWe){var r=e[t];return r===bWe?vo...
  function NWe (line 140) | function NWe(t){var e=this.__data__;return FWe?e[t]!==void 0:TWe.call(e,t)}
  function MWe (line 140) | function MWe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,...
  function Oy (line 140) | function Oy(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){va...
  function WWe (line 140) | function WWe(){this.size=0,this.__data__={hash:new W$,map:new(YWe||qWe),...
  function KWe (line 140) | function KWe(t){var e=typeof t;return e=="string"||e=="number"||e=="symb...
  function JWe (line 140) | function JWe(t,e){var r=t.__data__;return VWe(e)?r[typeof e=="string"?"s...
  function XWe (line 140) | function XWe(t){var e=zWe(this,t).delete(t);return this.size-=e?1:0,e}
  function $We (line 140) | function $We(t){return ZWe(this,t).get(t)}
  function tKe (line 140) | function tKe(t){return eKe(this,t).has(t)}
  function nKe (line 140) | function nKe(t,e){var r=rKe(this,t),o=r.size;return r.set(t,e),this.size...
  function My (line 140) | function My(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){va...
  function pKe (line 140) | function pKe(t,e){var r=this.__data__;if(r instanceof cKe){var o=r.__dat...
  function Uy (line 140) | function Uy(t){var e=this.__data__=new hKe(t);this.size=e.size}
  function wKe (line 140) | function wKe(t){return this.__data__.set(t,CKe),this}
  function IKe (line 140) | function IKe(t){return this.__data__.has(t)}
  function jS (line 140) | function jS(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new BKe;+...
  function SKe (line 140) | function SKe(t,e){for(var r=-1,o=t==null?0:t.length;++r<o;)if(e(t[r],r,t...
  function PKe (line 140) | function PKe(t,e){return t.has(e)}
  function RKe (line 140) | function RKe(t,e,r,o,a,n){var u=r&QKe,A=t.length,p=e.length;if(A!=p&&!(u...
  function LKe (line 140) | function LKe(t){var e=-1,r=Array(t.size);return t.forEach(function(o,a){...
  function OKe (line 140) | function OKe(t){var e=-1,r=Array(t.size);return t.forEach(function(o){r[...
  function tVe (line 140) | function tVe(t,e,r,o,a,n,u){switch(r){case eVe:if(t.byteLength!=e.byteLe...
  function rVe (line 140) | function rVe(t,e){for(var r=-1,o=e.length,a=t.length;++r<o;)t[a+r]=e[r];...
  function oVe (line 140) | function oVe(t,e,r){var o=e(t);return sVe(t)?o:iVe(o,r(t))}
  function aVe (line 140) | function aVe(t,e){for(var r=-1,o=t==null?0:t.length,a=0,n=[];++r<o;){var...
  function lVe (line 140) | function lVe(){return[]}
  function hVe (line 140) | function hVe(t,e){for(var r=-1,o=Array(t);++r<t;)o[r]=e(r);return o}
  function gVe (line 140) | function gVe(t){return t!=null&&typeof t=="object"}
  function EVe (line 140) | function EVe(t){return mVe(t)&&dVe(t)==yVe}
  function vVe (line 140) | function vVe(){return!1}
  function FVe (line 140) | function FVe(t,e){var r=typeof t;return e=e??kVe,!!e&&(r=="number"||r!="...
  function TVe (line 140) | function TVe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=RVe}
  function lJe (line 140) | function lJe(t){return OVe(t)&&LVe(t.length)&&!!ui[NVe(t)]}
  function cJe (line 140) | function cJe(t){return function(e){return t(e)}}
  function vJe (line 140) | function vJe(t,e){var r=yJe(t),o=!r&&mJe(t),a=!r&&!o&&EJe(t),n=!r&&!o&&!...
  function SJe (line 140) | function SJe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototy...
  function PJe (line 140) | function PJe(t,e){return function(r){return t(e(r))}}
  function TJe (line 140) | function TJe(t){if(!kJe(t))return QJe(t);var e=[];for(var r in Object(t)...
  function OJe (line 140) | function OJe(t){return t!=null&&LJe(t.length)&&!NJe(t)}
  function HJe (line 140) | function HJe(t){return _Je(t)?MJe(t):UJe(t)}
  function YJe (line 140) | function YJe(t){return jJe(t,qJe,GJe)}
  function JJe (line 140) | function JJe(t,e,r,o,a,n){var u=r&WJe,A=mte(t),p=A.length,h=mte(e),E=h.l...
  function Cze (line 140) | function Cze(t,e,r,o,a,n){var u=Lte(t),A=Lte(e),p=u?Ute:Nte(t),h=A?Ute:N...
  function qte (line 140) | function qte(t,e,r,o,a){return t===e?!0:t==null||e==null||!Gte(t)&&!Gte(...
  function Bze (line 140) | function Bze(t,e){return Ize(t,e)}
  function Sze (line 140) | function Sze(t,e,r){e=="__proto__"&&zte?zte(t,e,{configurable:!0,enumera...
  function xze (line 140) | function xze(t,e,r){(r!==void 0&&!bze(t[e],r)||r===void 0&&!(e in t))&&P...
  function kze (line 140) | function kze(t){return function(e,r,o){for(var a=-1,n=Object(e),u=o(e),A...
  function Nze (line 140) | function Nze(t,e){if(e)return t.slice();var r=t.length,o=sre?sre(r):new ...
  function Lze (line 140) | function Lze(t){var e=new t.constructor(t.byteLength);return new are(e)....
  function Mze (line 140) | function Mze(t,e){var r=e?Oze(t.buffer):t.buffer;return new t.constructo...
  function Uze (line 140) | function Uze(t,e){var r=-1,o=t.length;for(e||(e=Array(o));++r<o;)e[r]=t[...
  function t (line 140) | function t(){}
  function Kze (line 140) | function Kze(t){return typeof t.constructor=="function"&&!Wze(t)?qze(Yze...
  function zze (line 140) | function zze(t){return Jze(t)&&Vze(t)}
  function sXe (line 140) | function sXe(t){if(!$ze(t)||Xze(t)!=eXe)return!1;var e=Zze(t);if(e===nul...
  function oXe (line 140) | function oXe(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="...
  function AXe (line 140) | function AXe(t,e,r){var o=t[e];(!(uXe.call(t,e)&&lXe(o,r))||r===void 0&&...
  function hXe (line 140) | function hXe(t,e,r,o){var a=!r;r||(r={});for(var n=-1,u=e.length;++n<u;)...
  function gXe (line 140) | function gXe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);ret...
  function wXe (line 140) | function wXe(t){if(!dXe(t))return yXe(t);var e=mXe(t),r=[];for(var o in ...
  function DXe (line 140) | function DXe(t){return vXe(t)?IXe(t,!0):BXe(t)}
  function bXe (line 140) | function bXe(t){return SXe(t,PXe(t))}
  function _Xe (line 140) | function _Xe(t,e,r,o,a,n,u){var A=Rre(t,r),p=Rre(e,r),h=u.get(p);if(h){k...
  function Lre (line 140) | function Lre(t,e,r,o,a){t!==e&&GXe(e,function(n,u){if(a||(a=new HXe),YXe...
  function VXe (line 140) | function VXe(t){return t}
  function JXe (line 140) | function JXe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:retu...
  function XXe (line 140) | function XXe(t,e,r){return e=jre(e===void 0?t.length-1:e,0),function(){f...
  function ZXe (line 140) | function ZXe(t){return function(){return t}}
  function sZe (line 140) | function sZe(t){var e=0,r=0;return function(){var o=iZe(),a=nZe-(o-r);if...
  function fZe (line 140) | function fZe(t,e){return AZe(uZe(t,e,cZe),t+"")}
  function mZe (line 140) | function mZe(t,e,r){if(!dZe(r))return!1;var o=typeof e;return(o=="number...
  function CZe (line 140) | function CZe(t){return yZe(function(e,r){var o=-1,a=r.length,n=a>1?r[a-1...
  function vZe (line 140) | function vZe(t){return!!(Ane.default.valid(t)&&t.match(/^[^-]+(-rc\.[0-9...
  function nP (line 140) | function nP(t,{one:e,more:r,zero:o=r}){return t===0?o:t===1?e:r}
  function DZe (line 140) | function DZe(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}
  function SZe (line 140) | function SZe(t){}
  function yL (line 140) | function yL(t){throw new Error(`Assertion failed: Unexpected object '${t...
  function PZe (line 140) | function PZe(t,e){let r=Object.values(t);if(!r.includes(e))throw new it(...
  function sl (line 140) | function sl(t,e){let r=[];for(let o of t){let a=e(o);a!==fne&&r.push(a)}...
  function KI (line 140) | function KI(t,e){for(let r of t){let o=e(r);if(o!==pne)return o}}
  function pL (line 140) | function pL(t){return typeof t=="object"&&t!==null}
  function Uc (line 140) | async function Uc(t){let e=await Promise.allSettled(t),r=[];for(let o of...
  function iP (line 140) | function iP(t){if(t instanceof Map&&(t=Object.fromEntries(t)),pL(t))for(...
  function ol (line 140) | function ol(t,e,r){let o=t.get(e);return typeof o>"u"&&t.set(e,o=r()),o}
  function Yy (line 140) | function Yy(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=[]),r}
  function md (line 140) | function md(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Set),r}
  function Wy (line 140) | function Wy(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Map),r}
  function bZe (line 140) | async function bZe(t,e){if(e==null)return await t();try{return await t()...
  function Ky (line 140) | async function Ky(t,e){try{return await t()}catch(r){throw r.message=e(r...
  function EL (line 140) | function EL(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}
  function Vy (line 140) | async function Vy(t){return await new Promise((e,r)=>{let o=[];t.on("err...
  function hne (line 140) | function hne(){let t,e;return{promise:new Promise((o,a)=>{t=o,e=a}),reso...
  function gne (line 140) | function gne(t){return WI(ue.fromPortablePath(t))}
  function dne (line 140) | function dne(path){let physicalPath=ue.fromPortablePath(path),currentCac...
  function xZe (line 140) | function xZe(t){let e=one.get(t),r=oe.statSync(t);if(e?.mtime===r.mtimeM...
  function Df (line 140) | function Df(t,{cachingStrategy:e=2}={}){switch(e){case 0:return dne(t);c...
  function ks (line 140) | function ks(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];...
  function kZe (line 140) | function kZe(t){return t.length===0?null:t.map(e=>`(${cne.default.makeRe...
  function sP (line 140) | function sP(t,{env:e}){let r=/\${(?<variableName>[\d\w_]+)(?<colon>:)?(?...
  function VI (line 140) | function VI(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"...
  function yne (line 140) | function yne(t){return typeof t>"u"?t:VI(t)}
  function CL (line 140) | function CL(t){try{return yne(t)}catch{return null}}
  function QZe (line 140) | function QZe(t){return!!(ue.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}
  function Ene (line 140) | function Ene(t,...e){let r=u=>({value:u}),o=r(t),a=e.map(u=>r(u)),{value...
  function FZe (line 140) | function FZe(...t){return Ene({},...t)}
  function wL (line 140) | function wL(t,e){let r=Object.create(null);for(let o of t){let a=o[e];r[...
  function Jy (line 140) | function Jy(t){return typeof t=="string"?Number.parseInt(t,10):t}
  method constructor (line 140) | constructor(){super(...arguments);this.chunks=[]}
  method _transform (line 140) | _transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("...
  method _flush (line 140) | _flush(r){r(null,Buffer.concat(this.chunks))}
  method constructor (line 140) | constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0...
  method set (line 140) | set(e,r){let o=this.deferred.get(e);typeof o>"u"&&this.deferred.set(e,o=...
  method reduce (line 140) | reduce(e,r){let o=this.promises.get(e)??Promise.resolve();this.set(e,()=...
  method wait (line 140) | async wait(){await Promise.all(this.promises.values())}
  method constructor (line 140) | constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}
  method _transform (line 140) | _transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("...
  method _flush (line 140) | _flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}
  function wne (line 140) | function wne(t){let e=["KiB","MiB","GiB","TiB"],r=e.length;for(;r>1&&t<1...
  function _c (line 140) | function _c(t,e){return[e,t]}
  function yd (line 140) | function yd(t,e,r){return t.get("enableColors")&&r&2&&(e=zI.default.bold...
  function Vs (line 140) | function Vs(t,e,r){if(!t.get("enableColors"))return e;let o=RZe.get(r);i...
  function Zy (line 140) | function Zy(t,e,r){return t.get("enableHyperlinks")?TZe?`\x1B]8;;${r}\x1...
  function Mt (line 140) | function Mt(t,e,r){if(e===null)return Vs(t,"null",yt.NULL);if(Object.has...
  function PL (line 140) | function PL(t,e,r,{separator:o=", "}={}){return[...e].map(a=>Mt(t,a,r))....
  function Ed (line 140) | function Ed(t,e){if(t===null)return null;if(Object.hasOwn(oP,e))return o...
  function NZe (line 140) | function NZe(t,e,[r,o]){return t?Ed(r,o):Mt(e,r,o)}
  function bL (line 140) | function bL(t){return{Check:Vs(t,"\u2713","green"),Cross:Vs(t,"\u2718","...
  function zu (line 140) | function zu(t,{label:e,value:[r,o]}){return`${Mt(t,e,yt.CODE)}: ${Mt(t,r...
  function cP (line 140) | function cP(t,e,r){let o=[],a=[...e],n=r;for(;a.length>0;){let h=a[0],E=...
  function XI (line 140) | function XI(t,{configuration:e}){let r=e.get("logFilters"),o=new Map,a=n...
  function LZe (line 140) | function LZe(t){return t.reduce((e,r)=>[].concat(e,r),[])}
  function OZe (line 140) | function OZe(t,e){let r=[[]],o=0;for(let a of t)e(a)?(o++,r[o]=[]):r[o]....
  function MZe (line 140) | function MZe(t){return t.code==="ENOENT"}
  method constructor (line 140) | constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),...
  function UZe (line 140) | function UZe(t,e){return new QL(t,e)}
  function GZe (line 140) | function GZe(t){return t.replace(/\\/g,"/")}
  function qZe (line 140) | function qZe(t,e){return _Ze.resolve(t,e)}
  function YZe (line 140) | function YZe(t){return t.replace(jZe,"\\$2")}
  function WZe (line 140) | function WZe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e===...
  function Lne (line 140) | function Lne(t,e={}){return!One(t,e)}
  function One (line 140) | function One(t,e={}){return t===""?!1:!!(e.caseSensitiveMatch===!1||t.in...
  function A$e (line 140) | function A$e(t){let e=t.indexOf("{");if(e===-1)return!1;let r=t.indexOf(...
  function f$e (line 140) | function f$e(t){return pP(t)?t.slice(1):t}
  function p$e (line 140) | function p$e(t){return"!"+t}
  function pP (line 140) | function pP(t){return t.startsWith("!")&&t[1]!=="("}
  function Mne (line 140) | function Mne(t){return!pP(t)}
  function h$e (line 140) | function h$e(t){return t.filter(pP)}
  function g$e (line 140) | function g$e(t){return t.filter(Mne)}
  function d$e (line 140) | function d$e(t){return t.filter(e=>!TL(e))}
  function m$e (line 140) | function m$e(t){return t.filter(TL)}
  function TL (line 140) | function TL(t){return t.startsWith("..")||t.startsWith("./..")}
  function y$e (line 140) | function y$e(t){return i$e(t,{flipBackslashes:!1})}
  function E$e (line 140) | function E$e(t){return t.includes(Nne)}
  function Une (line 140) | function Une(t){return t.endsWith("/"+Nne)}
  function C$e (line 140) | function C$e(t){let e=n$e.basename(t);return Une(t)||Lne(e)}
  function w$e (line 140) | function w$e(t){return t.reduce((e,r)=>e.concat(_ne(r)),[])}
  function _ne (line 140) | function _ne(t){return RL.braces(t,{expand:!0,nodupes:!0})}
  function I$e (line 140) | function I$e(t,e){let{parts:r}=RL.scan(t,Object.assign(Object.assign({},...
  function Hne (line 140) | function Hne(t,e){return RL.makeRe(t,e)}
  function B$e (line 140) | function B$e(t,e){return t.map(r=>Hne(r,e))}
  function v$e (line 140) | function v$e(t,e){return e.some(r=>r.test(t))}
  function P$e (line 140) | function P$e(){let t=[],e=S$e.call(arguments),r=!1,o=e[e.length-1];o&&!A...
  function qne (line 140) | function qne(t,e){if(Array.isArray(t))for(let r=0,o=t.length;r<o;r++)t[r...
  function x$e (line 140) | function x$e(t){let e=b$e(t);return t.forEach(r=>{r.once("error",o=>e.em...
  function Kne (line 140) | function Kne(t){t.forEach(e=>e.emit("close"))}
  function k$e (line 140) | function k$e(t){return typeof t=="string"}
  function Q$e (line 140) | function Q$e(t){return t===""}
  function U$e (line 140) | function U$e(t,e){let r=zne(t),o=Xne(t,e.ignore),a=r.filter(p=>Pf.patter...
  function NL (line 140) | function NL(t,e,r){let o=[],a=Pf.pattern.getPatternsOutsideCurrentDirect...
  function zne (line 140) | function zne(t){return Pf.pattern.getPositivePatterns(t)}
  function Xne (line 140) | function Xne(t,e){return Pf.pattern.getNegativePatterns(t).concat(e).map...
  function LL (line 140) | function LL(t){let e={};return t.reduce((r,o)=>{let a=Pf.pattern.getBase...
  function OL (line 140) | function OL(t,e,r){return Object.keys(t).map(o=>ML(o,t[o],e,r))}
  function ML (line 140) | function ML(t,e,r,o){return{dynamic:o,positive:e,negative:r,base:t,patte...
  function H$e (line 140) | function H$e(t){return t.map(e=>$ne(e))}
  function $ne (line 140) | function $ne(t){return t.replace(_$e,"/")}
  function j$e (line 140) | function j$e(t,e,r){e.fs.lstat(t,(o,a)=>{if(o!==null){tie(r,o);return}if...
  function tie (line 140) | function tie(t,e){t(e)}
  function UL (line 140) | function UL(t,e){t(null,e)}
  function G$e (line 140) | function G$e(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.fol...
  function q$e (line 140) | function q$e(t){return t===void 0?Xp.FILE_SYSTEM_ADAPTER:Object.assign(O...
  method constructor (line 140) | constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue...
  method _getValue (line 140) | _getValue(e,r){return e??r}
  function K$e (line 140) | function K$e(t,e,r){if(typeof e=="function"){oie.read(t,qL(),e);return}o...
  function V$e (line 140) | function V$e(t,e){let r=qL(e);return W$e.read(t,r)}
  function qL (line 140) | function qL(t={}){return t instanceof jL.default?t:new jL.default(t)}
  function J$e (line 140) | function J$e(t,e){var r,o,a,n=!0;Array.isArray(t)?(r=[],o=t.length):(a=O...
  method constructor (line 140) | constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),...
  function eet (line 140) | function eet(t,e){return new WL(t,e)}
  function ret (line 140) | function ret(t,e,r){return t.endsWith(r)?t+e:t+r+e}
  function set (line 140) | function set(t,e,r){if(!e.stats&&iet.IS_SUPPORT_READDIR_WITH_FILE_TYPES)...
  function gie (line 140) | function gie(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(o,a)=>{if(o!==nul...
  function oet (line 140) | function oet(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);re...
  function die (line 140) | function die(t,e,r){e.fs.readdir(t,(o,a)=>{if(o!==null){BP(r,o);return}l...
  function BP (line 140) | function BP(t,e){t(e)}
  function JL (line 140) | function JL(t,e){t(null,e)}
  function uet (line 140) | function uet(t,e){return!e.stats&&cet.IS_SUPPORT_READDIR_WITH_FILE_TYPES...
  function Cie (line 140) | function Cie(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(o=>{...
  function wie (line 140) | function wie(t,e){return e.fs.readdirSync(t).map(o=>{let a=Eie.joinPathS...
  function Aet (line 140) | function Aet(t){return t===void 0?th.FILE_SYSTEM_ADAPTER:Object.assign(O...
  method constructor (line 140) | constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValu...
  method _getValue (line 140) | _getValue(e,r){return e??r}
  function det (line 140) | function det(t,e,r){if(typeof e=="function"){Die.read(t,$L(),e);return}D...
  function met (line 140) | function met(t,e){let r=$L(e);return get.read(t,r)}
  function $L (line 140) | function $L(t={}){return t instanceof ZL.default?t:new ZL.default(t)}
  function yet (line 140) | function yet(t){var e=new t,r=e;function o(){var n=e;return n.next?e=n.n...
  function bie (line 140) | function bie(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),r<1)throw ...
  function ql (line 140) | function ql(){}
  function Cet (line 140) | function Cet(){this.value=null,this.callback=ql,this.next=null,this.rele...
  function wet (line 140) | function wet(t,e,r){typeof t=="function"&&(r=e,e=t,t=null);function o(E,...
  function Iet (line 140) | function Iet(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}
  function Bet (line 140) | function Bet(t,e){return t===null||t(e)}
  function vet (line 140) | function vet(t,e){return t.split(/[/\\]/).join(e)}
  function Det (line 140) | function Det(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}
  method constructor (line 140) | constructor(e,r){this._root=e,this._settings=r,this._root=Pet.replacePat...
  method constructor (line 140) | constructor(e,r){super(e,r),this._settings=r,this._scandir=xet.scandir,t...
  method read (line 140) | read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()...
  method isDestroyed (line 140) | get isDestroyed(){return this._isDestroyed}
  method destroy (line 140) | destroy(){if(this._isDestroyed)throw new Error("The reader is already de...
  method onEntry (line 140) | onEntry(e){this._emitter.on("entry",e)}
  method onError (line 140) | onError(e){this._emitter.once("error",e)}
  method onEnd (line 140) | onEnd(e){this._emitter.once("end",e)}
  method _pushToQueue (line 140) | _pushToQueue(e,r){let o={directory:e,base:r};this._queue.push(o,a=>{a!==...
  method _worker (line 140) | _worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,...
  method _handleError (line 140) | _handleError(e){this._isDestroyed||!SP.isFatalError(this._settings,e)||(...
  method _handleEntry (line 140) | _handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let o=...
  method _emitEntry (line 140) | _emitEntry(e){this._emitter.emit("entry",e)}
  method constructor (line 140) | constructor(e,r){this._root=e,this._settings=r,this._reader=new Fet.defa...
  method read (line 140) | read(e){this._reader.onError(r=>{Ret(e,r)}),this._reader.onEntry(r=>{thi...
  function Ret (line 140) | function Ret(t,e){t(e)}
  function Tet (line 140) | function Tet(t,e){t(null,e)}
  method constructor (line 140) | constructor(e,r){this._root=e,this._settings=r,this._reader=new Let.defa...
  method read (line 140) | read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),th...
  method constructor (line 140) | constructor(){super(...arguments),this._scandir=Oet.scandirSync,this._st...
  method read (line 140) | read(){return this._pushToQueue(this._root,this._settings.basePath),this...
  method _pushToQueue (line 140) | _pushToQueue(e,r){this._queue.add({directory:e,base:r})}
  method _handleQueue (line 140) | _handleQueue(){for(let e of this._queue.values())this._handleDirectory(e...
  method _handleDirectory (line 140) | _handleDirectory(e,r){try{let o=this._scandir(e,this._settings.fsScandir...
  method _handleError (line 140) | _handleError(e){if(!!PP.isFatalError(this._settings,e))throw e}
  method _handleEntry (line 140) | _handleEntry(e,r){let o=e.path;r!==void 0&&(e.path=PP.joinPathSegments(r...
  method _pushToStorage (line 140) | _pushToStorage(e){this._storage.push(e)}
  method constructor (line 140) | constructor(e,r){this._root=e,this._settings=r,this._reader=new Uet.defa...
  method read (line 140) | read(){return this._reader.read()}
  method constructor (line 140) | constructor(e={}){this._options=e,this.basePath=this._getValue(this._opt...
  method _getValue (line 140) | _getValue(e,r){return e??r}
  function qet (line 140) | function qet(t,e,r){if(typeof e=="function"){new Nie.default(t,bP()).rea...
  function Yet (line 140) | function Yet(t,e){let r=bP(e);return new Get.default(t,r).read()}
  function Wet (line 140) | function Wet(t,e){let r=bP(e);return new jet.default(t,r).read()}
  function bP (line 140) | function bP(t={}){return t instanceof mO.default?t:new mO.default(t)}
  method constructor (line 140) | constructor(e){this._settings=e,this._fsStatSettings=new Vet.Settings({f...
  method _getFullEntryPath (line 140) | _getFullEntryPath(e){return Ket.resolve(this._settings.cwd,e)}
  method _makeEntry (line 140) | _makeEntry(e,r){let o={name:r,path:r,dirent:Lie.fs.createDirentFromStats...
  method _isFatalError (line 140) | _isFatalError(e){return!Lie.errno.isEnoentCodeError(e)&&!this._settings....
  method constructor (line 140) | constructor(){super(...arguments),this._walkStream=Xet.walkStream,this._...
  method dynamic (line 140) | dynamic(e,r){return this._walkStream(e,r)}
  method static (line 140) | static(e,r){let o=e.map(this._getFullEntryPath,this),a=new Jet.PassThrou...
  method _getEntry (line 140) | _getEntry(e,r,o){return this._getStat(e).then(a=>this._makeEntry(a,r)).c...
  method _getStat (line 140) | _getStat(e){return new Promise((r,o)=>{this._stat(e,this._fsStatSettings...
  method constructor (line 140) | constructor(){super(...arguments),this._walkAsync=$et.walk,this._readerS...
  method dynamic (line 140) | dynamic(e,r){return new Promise((o,a)=>{this._walkAsync(e,r,(n,u)=>{n===...
  method static (line 140) | async static(e,r){let o=[],a=this._readerStream.static(e,r);return new P...
  method constructor (line 140) | constructor(e,r,o){this._patterns=e,this._settings=r,this._micromatchOpt...
  method _fillStorage (line 140) | _fillStorage(){let e=nE.pattern.expandPatternsWithBraceExpansion(this._p...
  method _getPatternSegments (line 140) | _getPatternSegments(e){return nE.pattern.getPatternParts(e,this._microma...
  method _splitSegmentsIntoSections (line 140) | _splitSegmentsIntoSections(e){return nE.array.splitWhen(e,r=>r.dynamic&&...
  method match (line 140) | match(e){let r=e.split("/"),o=r.length,a=this._storage.filter(n=>!n.comp...
  method constructor (line 140) | constructor(e,r){this._settings=e,this._micromatchOptions=r}
  method getFilter (line 140) | getFilter(e,r,o){let a=this._getMatcher(r),n=this._getNegativePatternsRe...
  method _getMatcher (line 140) | _getMatcher(e){return new ntt.default(e,this._settings,this._micromatchO...
  method _getNegativePatternsRe (line 140) | _getNegativePatternsRe(e){let r=e.filter(QP.pattern.isAffectDepthOfReadi...
  method _filter (line 140) | _filter(e,r,o,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymb...
  method _isSkippedByDeep (line 140) | _isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntry...
  method _getEntryLevel (line 140) | _getEntryLevel(e,r){let o=r.split("/").length;if(e==="")return o;let a=e...
  method _isSkippedSymbolicLink (line 140) | _isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.d...
  method _isSkippedByPositivePatterns (line 140) | _isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!...
  method _isSkippedByNegativePatterns (line 140) | _isSkippedByNegativePatterns(e,r){return!QP.pattern.matchAny(e,r)}
  method constructor (line 140) | constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=n...
  method getFilter (line 140) | getFilter(e,r){let o=wd.pattern.convertPatternsToRe(e,this._micromatchOp...
  method _filter (line 140) | _filter(e,r,o){if(this._settings.unique&&this._isDuplicateEntry(e)||this...
  method _isDuplicateEntry (line 140) | _isDuplicateEntry(e){return this.index.has(e.path)}
  method _createIndexRecord (line 140) | _createIndexRecord(e){this.index.set(e.path,void 0)}
  method _onlyFileFilter (line 140) | _onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}
  method _onlyDirectoryFilter (line 140) | _onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent...
  method _isSkippedByAbsoluteNegativePatterns (line 140) | _isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)re...
  method _isMatchToPatterns (line 140) | _isMatchToPatterns(e,r,o){let a=wd.path.removeLeadingDotSegment(e),n=wd....
  method constructor (line 140) | constructor(e){this._settings=e}
  method getFilter (line 140) | getFilter(){return e=>this._isNonFatalError(e)}
  method _isNonFatalError (line 140) | _isNonFatalError(e){return itt.errno.isEnoentCodeError(e)||this._setting...
  method constructor (line 140) | constructor(e){this._settings=e}
  method getTransformer (line 140) | getTransformer(){return e=>this._transform(e)}
  method _transform (line 140) | _transform(e){let r=e.path;return this._settings.absolute&&(r=Gie.path.m...
  method constructor (line 140) | constructor(e){this._settings=e,this.errorFilter=new ltt.default(this._s...
  method _getRootDirectory (line 140) | _getRootDirectory(e){return stt.resolve(this._settings.cwd,e.base)}
  method _getReaderOptions (line 140) | _getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,path...
  method _getMicromatchOptions (line 140) | _getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._se...
  method constructor (line 140) | constructor(){super(...arguments),this._reader=new utt.default(this._set...
  method read (line 140) | async read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e...
  method api (line 140) | api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.stati...
  method constructor (line 140) | constructor(){super(...arguments),this._reader=new ptt.default(this._set...
  method read (line 140) | read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e),a=th...
  method api (line 140) | api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.stati...
  method constructor (line 140) | constructor(){super(...arguments),this._walkSync=dtt.walkSync,this._stat...
  method dynamic (line 140) | dynamic(e,r){return this._walkSync(e,r)}
  method static (line 140) | static(e,r){let o=[];for(let a of e){let n=this._getFullEntryPath(a),u=t...
  method _getEntry (line 140) | _getEntry(e,r,o){try{let a=this._getStat(e);return this._makeEntry(a,r)}...
  method _getStat (line 140) | _getStat(e){return this._statSync(e,this._fsStatSettings)}
  method constructor (line 140) | constructor(){super(...arguments),this._reader=new ytt.default(this._set...
  method read (line 140) | read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);retu...
  method api (line 140) | api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.stati...
  method constructor (line 140) | constructor(e={}){this._options=e,this.absolute=this._getValue(this._opt...
  method _getValue (line 140) | _getValue(e,r){return e===void 0?r:e}
  method _getFileSystemMethods (line 140) | _getFileSystemMethods(e={}){return Object.assign(Object.assign({},sE.DEF...
  function JO (line 140) | async function JO(t,e){oE(t);let r=zO(t,Itt.default,e),o=await Promise.a...
  function e (line 140) | function e(u,A){oE(u);let p=zO(u,vtt.default,A);return Id.array.flatten(p)}
    method constructor (line 227) | constructor(o){super(o)}
    method submit (line 227) | async submit(){this.value=await t.call(this,this.values,this.state),su...
    method create (line 227) | static create(o){return Uhe(o)}
  function r (line 140) | function r(u,A){oE(u);let p=zO(u,Btt.default,A);return Id.stream.merge(p)}
    method constructor (line 227) | constructor(a){super({...a,choices:e})}
    method create (line 227) | static create(a){return Hhe(a)}
  function o (line 140) | function o(u,A){oE(u);let p=Xie.transform([].concat(u)),h=new VO.default...
  function a (line 140) | function a(u,A){oE(u);let p=new VO.default(A);return Id.pattern.isDynami...
  function n (line 140) | function n(u){return oE(u),Id.path.escape(u)}
  function zO (line 140) | function zO(t,e,r){let o=Xie.transform([].concat(t)),a=new VO.default(r)...
  function oE (line 140) | function oE(t){if(![].concat(t).every(o=>Id.string.isString(o)&&!Id.stri...
  function zs (line 140) | function zs(...t){let e=(0,TP.createHash)("sha512"),r="";for(let o of t)...
  function NP (line 140) | async function NP(t,{baseFs:e,algorithm:r}={baseFs:oe,algorithm:"sha512"...
  function LP (line 140) | async function LP(t,{cwd:e}){let o=(await(0,XO.default)(t,{cwd:ue.fromPo...
  function eA (line 140) | function eA(t,e){if(t?.startsWith("@"))throw new Error("Invalid scope: d...
  function In (line 140) | function In(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,...
  function Qs (line 140) | function Qs(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,...
  function Ptt (line 140) | function Ptt(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}
  function OP (line 140) | function OP(t){return{identHash:t.identHash,scope:t.scope,name:t.name,lo...
  function $O (line 140) | function $O(t){return{identHash:t.identHash,scope:t.scope,name:t.name,de...
  function btt (line 140) | function btt(t){return{identHash:t.identHash,scope:t.scope,name:t.name,l...
  function eM (line 140) | function eM(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,...
  function e1 (line 140) | function e1(t){return eM(t,t)}
  function tM (line 140) | function tM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");r...
  function rM (line 140) | function rM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");r...
  function bf (line 140) | function bf(t){return t.range.startsWith($I)}
  function Hc (line 140) | function Hc(t){return t.reference.startsWith($I)}
  function t1 (line 140) | function t1(t){if(!bf(t))throw new Error("Not a virtual descriptor");ret...
  function r1 (line 140) | function r1(t){if(!Hc(t))throw new Error("Not a virtual descriptor");ret...
  function xtt (line 140) | function xtt(t){return bf(t)?In(t,t.range.replace(MP,"")):t}
  function ktt (line 140) | function ktt(t){return Hc(t)?Qs(t,t.reference.replace(MP,"")):t}
  function Qtt (line 140) | function Qtt(t,e){return t.range.includes("::")?t:In(t,`${t.range}::${aE...
  function Ftt (line 140) | function Ftt(t,e){return t.reference.includes("::")?t:Qs(t,`${t.referenc...
  function n1 (line 140) | function n1(t,e){return t.identHash===e.identHash}
  function nse (line 140) | function nse(t,e){return t.descriptorHash===e.descriptorHash}
  function i1 (line 140) | function i1(t,e){return t.locatorHash===e.locatorHash}
  function Rtt (line 140) | function Rtt(t,e){if(!Hc(t))throw new Error("Invalid package type");if(!...
  function Js (line 140) | function Js(t){let e=ise(t);if(!e)throw new Error(`Invalid ident (${t})`...
  function ise (line 140) | function ise(t){let e=t.match(Ttt);if(!e)return null;let[,r,o]=e;return ...
  function ih (line 140) | function ih(t,e=!1){let r=s1(t,e);if(!r)throw new Error(`Invalid descrip...
  function s1 (line 140) | function s1(t,e=!1){let r=e?t.match(Ntt):t.match(Ltt);if(!r)return null;...
  function xf (line 140) | function xf(t,e=!1){let r=UP(t,e);if(!r)throw new Error(`Invalid locator...
  function UP (line 140) | function UP(t,e=!1){let r=e?t.match(Ott):t.match(Mtt);if(!r)return null;...
  function Bd (line 140) | function Bd(t,e){let r=t.match(Utt);if(r===null)throw new Error(`Invalid...
  function _tt (line 140) | function _tt(t,e){try{return Bd(t,e)}catch{return null}}
  function Htt (line 140) | function Htt(t,{protocol:e}){let{selector:r,params:o}=Bd(t,{requireProto...
  function $ie (line 140) | function $ie(t){return t=t.replaceAll("%","%25"),t=t.replaceAll(":","%3A...
  function jtt (line 140) | function jtt(t){return t===null?!1:Object.entries(t).length>0}
  function _P (line 140) | function _P({protocol:t,source:e,selector:r,params:o}){let a="";return t...
  function Gtt (line 140) | function Gtt(t){let{params:e,protocol:r,source:o,selector:a}=Bd(t);for(l...
  function fn (line 140) | function fn(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}
  function Pa (line 140) | function Pa(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.na...
  function ba (line 140) | function ba(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${...
  function ZO (line 140) | function ZO(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}
  function lE (line 140) | function lE(t){let{protocol:e,selector:r}=Bd(t.reference),o=e!==null?e.r...
  function cs (line 140) | function cs(t,e){return e.scope?`${Mt(t,`@${e.scope}/`,yt.SCOPE)}${Mt(t,...
  function HP (line 140) | function HP(t){if(t.startsWith($I)){let e=HP(t.substring(t.indexOf("#")+...
  function cE (line 140) | function cE(t,e){return`${Mt(t,HP(e),yt.RANGE)}`}
  function Gn (line 140) | function Gn(t,e){return`${cs(t,e)}${Mt(t,"@",yt.RANGE)}${cE(t,e.range)}`}
  function o1 (line 140) | function o1(t,e){return`${Mt(t,HP(e),yt.REFERENCE)}`}
  function jr (line 140) | function jr(t,e){return`${cs(t,e)}${Mt(t,"@",yt.REFERENCE)}${o1(t,e.refe...
  function xL (line 140) | function xL(t){return`${fn(t)}@${HP(t.reference)}`}
  function uE (line 140) | function uE(t){return ks(t,[e=>fn(e),e=>e.range])}
  function a1 (line 140) | function a1(t,e){return cs(t,e.anchoredLocator)}
  function ZI (line 140) | function ZI(t,e,r){let o=bf(e)?t1(e):e;return r===null?`${Gn(t,o)} \u219...
  function kL (line 140) | function kL(t,e,r){return r===null?`${jr(t,e)}`:`${jr(t,e)} (via ${cE(t,...
  function nM (line 140) | function nM(t){return`node_modules/${fn(t)}`}
  function jP (line 140) | function jP(t,e){return t.conditions?Stt(t.conditions,r=>{let[,o,a]=r.ma...
  method supportsDescriptor (line 140) | supportsDescriptor(e,r){return!!(e.range.startsWith(l1.protocol)||r.proj...
  method supportsLocator (line 140) | supportsLocator(e,r){return!!e.reference.startsWith(l1.protocol)}
  method shouldPersistResolution (line 140) | shouldPersistResolution(e,r){return!1}
  method bindDescriptor (line 140) | bindDescriptor(e,r,o){return e}
  method getResolutionDependencies (line 140) | getResolutionDependencies(e,r){return{}}
  method getCandidates (line 140) | async getCandidates(e,r,o){return[o.project.getWorkspaceByDescriptor(e)....
  method getSatisfying (line 140) | async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);retu...
  method resolve (line 140) | async resolve(e,r){let o=r.project.getWorkspaceByCwd(e.reference.slice(l...
  function kf (line 140) | function kf(t,e,r=!1){if(!t)return!1;let o=`${e}${r}`,a=ase.get(o);if(ty...
  function xa (line 140) | function xa(t){if(t.indexOf(":")!==-1)return null;let e=lse.get(t);if(ty...
  function Ktt (line 140) | function Ktt(t){let e=Wtt.exec(t);return e?e[1]:null}
  function cse (line 140) | function cse(t){if(t.semver===sh.default.Comparator.ANY)return{gt:null,l...
  function iM (line 140) | function iM(t){if(t.length===0)return null;let e=null,r=null;for(let o o...
  function use (line 140) | function use(t){if(t.gt&&t.lt){if(t.gt[0]===">="&&t.lt[0]==="<="&&t.gt[1...
  function sM (line 140) | function sM(t){let e=t.map(o=>xa(o).set.map(a=>a.map(n=>cse(n)))),r=e.sh...
  function fse (line 140) | function fse(t){let e=t.match(/^[ \t]+/m);return e?e[0]:"  "}
  function pse (line 140) | function pse(t){return t.charCodeAt(0)===65279?t.slice(1):t}
  function $o (line 140) | function $o(t){return t.replace(/\\/g,"/")}
  function GP (line 140) | function GP(t,{yamlCompatibilityMode:e}){return e?CL(t):typeof t>"u"||ty...
  function hse (line 140) | function hse(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let o...
  function oM (line 140) | function oM(t,e){return e.length===1?hse(t,e[0]):`(${e.map(r=>hse(t,r))....
  method constructor (line 140) | constructor(){this.indent="  ";this.name=null;this.version=null;this.os=...
  method tryFind (line 140) | static async tryFind(e,{baseFs:r=new Tn}={}){let o=V.join(e,"package.jso...
  method find (line 140) | static async find(e,{baseFs:r}={}){let o=await AE.tryFind(e,{baseFs:r});...
  method fromFile (line 140) | static async fromFile(e,{baseFs:r=new Tn}={}){let o=new AE;return await ...
  method fromText (line 140) | static fromText(e){let r=new AE;return r.loadFromText(e),r}
  method loadFromText (line 140) | loadFromText(e){let r;try{r=JSON.parse(pse(e)||"{}")}catch(o){throw o.me...
  method loadFile (line 140) | async loadFile(e,{baseFs:r=new Tn}){let o=await r.readFilePromise(e,"utf...
  method load (line 140) | load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)...
  method getForScope (line 140) | getForScope(e){switch(e){case"dependencies":return this.dependencies;cas...
  method hasConsumerDependency (line 140) | hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||th...
  method hasHardDependency (line 140) | hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.d...
  method hasSoftDependency (line 140) | hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}
  method hasDependency (line 140) | hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDepende...
  method getConditions (line 140) | getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(oM("os...
  method ensureDependencyMeta (line 140) | ensureDependencyMeta(e){if(e.range!=="unknown"&&!gse.default.valid(e.ran...
  method ensurePeerDependencyMeta (line 140) | ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Inva...
  method setRawField (line 140) | setRawField(e,r,{after:o=[]}={}){let a=new Set(o.filter(n=>Object.hasOwn...
  method exportTo (line 140) | exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),thi...
  function Xtt (line 140) | function Xtt(t){for(var e=t.length;e--&&ztt.test(t.charAt(e)););return e}
  function ert (line 140) | function ert(t){return t&&t.slice(0,Ztt(t)+1).replace($tt,"")}
  function irt (line 140) | function irt(t){return typeof t=="symbol"||rrt(t)&&trt(t)==nrt}
  function Art (line 140) | function Art(t){if(typeof t=="number")return t;if(ort(t))return vse;if(B...
  function drt (line 140) | function drt(t,e,r){var o,a,n,u,A,p,h=0,E=!1,I=!1,v=!0;if(typeof t!="fun...
  function Crt (line 140) | function Crt(t,e,r){var o=!0,a=!0;if(typeof t!="function")throw new Type...
  function Irt (line 140) | function Irt(t){return typeof t.reportCode<"u"}
  method constructor (line 140) | constructor(r,o,a){super(o);this.reportExtra=a;this.reportCode=r}
  method constructor (line 140) | constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.repor...
  method getRecommendedLength (line 140) | getRecommendedLength(){return 180}
  method reportCacheHit (line 140) | reportCacheHit(e){this.cacheHits.add(e.locatorHash)}
  method reportCacheMiss (line 140) | reportCacheMiss(e,r){this.cacheMisses.add(e.locatorHash)}
  method progressViaCounter (line 140) | static progressViaCounter(e){let r=0,o,a=new Promise(p=>{o=p}),n=p=>{let...
  method progressViaTitle (line 140) | static progressViaTitle(){let e,r,o=new Promise(u=>{r=u}),a=(0,Qse.defau...
  method startProgressPromise (line 140) | async startProgressPromise(e,r){let o=this.reportProgress(e);try{return ...
  method startProgressSync (line 140) | startProgressSync(e,r){let o=this.reportProgress(e);try{return r(e)}fina...
  method reportInfoOnce (line 140) | reportInfoOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedInfos.has(a)||...
  method reportWarningOnce (line 140) | reportWarningOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedWarnings.ha...
  method reportErrorOnce (line 140) | reportErrorOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedErrors.has(a)...
  method reportExceptionOnce (line 140) | reportExceptionOnce(e){Irt(e)?this.reportErrorOnce(e.reportCode,e.messag...
  method createStreamReporter (line 140) | createStreamReporter(e=null){let r=new Fse.PassThrough,o=new Rse.StringD...
  method constructor (line 141) | constructor(e){this.fetchers=e}
  method supports (line 141) | supports(e,r){return!!this.tryFetcher(e,r)}
  method getLocalPath (line 141) | getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}
  method fetch (line 141) | async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}
  method tryFetcher (line 141) | tryFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));return o||n...
  method getFetcher (line 141) | getFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));if(!o)throw...
  method constructor (line 141) | constructor(e){this.resolvers=e.filter(r=>r)}
  method supportsDescriptor (line 141) | supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}
  method supportsLocator (line 141) | supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}
  method shouldPersistResolution (line 141) | shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shoul...
  method bindDescriptor (line 141) | bindDescriptor(e,r,o){return this.getResolverByDescriptor(e,o).bindDescr...
  method getResolutionDependencies (line 141) | getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r)....
  method getCandidates (line 141) | async getCandidates(e,r,o){return await this.getResolverByDescriptor(e,o...
  method getSatisfying (line 141) | async getSatisfying(e,r,o,a){return this.getResolverByDescriptor(e,a).ge...
  method resolve (line 141) | async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e...
  method tryResolverByDescriptor (line 141) | tryResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDesc...
  method getResolverByDescriptor (line 141) | getResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDesc...
  method tryResolverByLocator (line 141) | tryResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator...
  method getResolverByLocator (line 141) | getResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator...
  method supports (line 141) | supports(e){return!!e.reference.startsWith("virtual:")}
  method getLocalPath (line 141) | getLocalPath(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Err...
  method fetch (line 141) | async fetch(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Erro...
  method getLocatorFilename (line 141) | getLocatorFilename(e){return lE(e)}
  method ensureVirtualLink (line 141) | async ensureVirtualLink(e,r,o){let a=r.packageFs.getRealPath(),n=o.proje...
  method isVirtualDescriptor (line 141) | static isVirtualDescriptor(e){return!!e.range.startsWith(dE.protocol)}
  method isVirtualLocator (line 141) | static isVirtualLocator(e){return!!e.reference.startsWith(dE.protocol)}
  method supportsDescriptor (line 141) | supportsDescriptor(e,r){return dE.isVirtualDescriptor(e)}
  method supportsLocator (line 141) | supportsLocator(e,r){return dE.isVirtualLocator(e)}
  method shouldPersistResolution (line 141) | shouldPersistResolution(e,r){return!1}
  method bindDescriptor (line 141) | bindDescriptor(e,r,o){throw new Error('Assertion failed: calling "bindDe...
  method getResolutionDependencies (line 141) | getResolutionDependencies(e,r){throw new Error('Assertion failed: callin...
  method getCandidates (line 141) | async getCandidates(e,r,o){throw new Error('Assertion failed: calling "g...
  method getSatisfying (line 141) | async getSatisfying(e,r,o,a){throw new Error('Assertion failed: calling ...
  method resolve (line 141) | async resolve(e,r){throw new Error('Assertion failed: calling "resolve" ...
  method supports (line 141) | supports(e){return!!e.reference.startsWith(Xn.protocol)}
  method getLocalPath (line 141) | getLocalPath(e,r){return this.getWorkspace(e,r).cwd}
  method fetch (line 141) | async fetch(e,r){let o=this.getWorkspace(e,r).cwd;return{packageFs:new g...
  method getWorkspace (line 141) | getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(X...
  function u1 (line 141) | function u1(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}
  function Nse (line 141) | function Nse(t){return typeof t>"u"?3:u1(t)?0:Array.isArray(t)?1:2}
  function gM (line 141) | function gM(t,e){return Object.hasOwn(t,e)}
  function vrt (line 141) | function vrt(t){return u1(t)&&gM(t,"onConflict")&&typeof t.onConflict=="...
  function Drt (line 141) | function Drt(t){if(typeof t>"u")return{onConflict:"default",value:t};if(...
  function Lse (line 141) | function Lse(t,e){let r=u1(t)&&gM(t,e)?t[e]:void 0;return Drt(r)}
  function yE (line 141) | function yE(t,e){return[t,e,Ose]}
  function dM (line 141) | function dM(t){return Array.isArray(t)?t[2]===Ose:!1}
  function pM (line 141) | function pM(t,e){if(u1(t)){let r={};for(let o of Object.keys(t))r[o]=pM(...
  function hM (line 141) | function hM(t,e,r,o,a){let n,u=[],A=a,p=0;for(let E=a-1;E>=o;--E){let[I,...
  function Mse (line 141) | function Mse(t){return hM(t.map(([e,r])=>[e,{["."]:r}]),[],".",0,t.length)}
  function A1 (line 141) | function A1(t){return dM(t)?t[1]:t}
  function qP (line 141) | function qP(t){let e=dM(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>qP...
  function mM (line 141) | function mM(t){return dM(t)?t[0]:null}
  function EM (line 141) | function EM(){if(process.platform==="win32"){let t=ue.toPortablePath(pro...
  function EE (line 141) | function EE(){return ue.toPortablePath((0,yM.homedir)()||"/usr/local/sha...
  function CM (line 141) | function CM(t,e){let r=V.relative(e,t);return r&&!r.startsWith("..")&&!V...
  function krt (line 141) | function krt(t){var e=new Ff(t);return e.request=wM.request,e}
  function Qrt (line 141) | function Qrt(t){var e=new Ff(t);return e.request=wM.request,e.createSock...
  function Frt (line 141) | function Frt(t){var e=new Ff(t);return e.request=_se.request,e}
  function Rrt (line 141) | function Rrt(t){var e=new Ff(t);return e.request=_se.request,e.createSoc...
  function Ff (line 141) | function Ff(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy...
  function p (line 141) | function p(){n.emit("free",A,u)}
  function h (line 141) | function h(E){n.removeSocket(A),A.removeListener("free",p),A.removeListe...
  function A (line 141) | function A(I){I.upgrade=!0}
  function p (line 141) | function p(I,v,x){process.nextTick(function(){h(I,v,x)})}
  function h (line 141) | function h(I,v,x){if(u.removeAllListeners(),v.removeAllListeners(),I.sta...
  function E (line 141) | function E(I){u.removeAllListeners(),oh(`tunneling socket could not be e...
  function Hse (line 142) | function Hse(t,e){var r=this;Ff.prototype.createSocket.call(r,t,function...
  function jse (line 142) | function jse(t,e,r){return typeof t=="string"?{host:t,port:e,localAddres...
  function IM (line 142) | function IM(t){for(var e=1,r=arguments.length;e<r;++e){var o=arguments[e...
  function Trt (line 142) | function Trt(t){return Wse.includes(t)}
  function Lrt (line 142) | function Lrt(t){return Nrt.includes(t)}
  function Mrt (line 142) | function Mrt(t){return Ort.includes(t)}
  function wE (line 142) | function wE(t){return e=>typeof e===t}
  function be (line 142) | function be(t){if(t===null)return"null";switch(typeof t){case"undefined"...
  method constructor (line 142) | constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}
  method isCanceled (line 142) | get isCanceled(){return!0}
  method fn (line 142) | static fn(e){return(...r)=>new IE((o,a,n)=>{r.push(n),e(...r).then(o,a)})}
  method constructor (line 142) | constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCancel...
  method then (line 142) | then(e,r){return this._promise.then(e,r)}
  method catch (line 142) | catch(e){return this._promise.catch(e)}
  method finally (line 142) | finally(e){return this._promise.finally(e)}
  method cancel (line 142) | cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandl...
  method isCanceled (line 142) | get isCanceled(){return this._isCanceled}
  method constructor (line 142) | constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:o=3600,errorT...
  method servers (line 142) | set servers(e){this.clear(),this._resolver.setServers(e)}
  method servers (line 142) | get servers(){return this._resolver.getServers()}
  method lookup (line 142) | lookup(e,r,o){if(typeof r=="function"?(o=r,r={}):typeof r=="number"&&(r=...
  method lookupAsync (line 142) | async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let o=await...
  method query (line 142) | async query(e){let r=await this._cache.get(e);if(!r){let o=this._pending...
  method _resolve (line 142) | async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code=...
  method _lookup (line 142) | async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),ca...
  method _set (line 142) | async _set(e,r,o){if(this.maxTtl>0&&o>0){o=Math.min(o,this.maxTtl)*1e3,r...
  method queryAndCache (line 142) | async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._...
  method _tick (line 142) | _tick(e){let r=this._nextRemovalTime;(!r||e<r)&&(clearTimeout(this._remo...
  method install (line 142) | install(e){if(toe(e),BE in e)throw new Error("CacheableLookup has been a...
  method uninstall (line 142) | uninstall(e){if(toe(e),e[BE]){if(e[QM]!==this)throw new Error("The agent...
  method updateInterfaceInfo (line 142) | updateInterfaceInfo(){let{_iface:e}=this;this._iface=roe(),(e.has4&&!thi...
  method clear (line 142) | clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}
  function coe (line 142) | function coe(t,e){if(t&&e)return coe(t)(e);if(typeof t!="function")throw...
  function zP (line 142) | function zP(t){var e=function(){return e.called?e.value:(e.called=!0,e.v...
  function poe (line 142) | function poe(t){var e=function(){if(e.called)throw new Error(e.onceError...
  method constructor (line 142) | constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}
  function $P (line 142) | async function $P(t,e){if(!t)return Promise.reject(new Error("Expected a...
  function Sd (line 142) | function Sd(t){let e=parseInt(t,10);return isFinite(e)?e:0}
  function Snt (line 142) | function Snt(t){return t?Bnt.has(t.status):!0}
  function MM (line 142) | function MM(t){let e={};if(!t)return e;let r=t.trim().split(/\s*,\s*/);f...
  function Pnt (line 142) | function Pnt(t){let e=[];for(let r in t){let o=t[r];e.push(o===!0?r:r+"=...
  method constructor (line 142) | constructor(e,r,{shared:o,cacheHeuristic:a,immutableMinTimeToLive:n,igno...
  method now (line 142) | now(){return Date.now()}
  method storable (line 142) | storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||thi...
  method _hasExplicitExpiration (line 142) | _hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]|...
  method _assertRequestHasHeaders (line 142) | _assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request heade...
  method satisfiesWithoutRevalidation (line 142) | satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=M...
  method _requestMatches (line 142) | _requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host==...
  method _allowsStoringAuthenticated (line 142) | _allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||thi...
  method _varyMatches (line 142) | _varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.v...
  method _copyWithoutHopByHopHeaders (line 142) | _copyWithoutHopByHopHeaders(e){let r={};for(let o in e)vnt[o]||(r[o]=e[o...
  method responseHeaders (line 142) | responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeader...
  method date (line 142) | date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this...
  method age (line 142) | age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;retur...
  method _ageValue (line 142) | _ageValue(){return Sd(this._resHeaders.age)}
  method maxAge (line 142) | maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&t...
  method timeToLive (line 142) | timeToLive(){let e=this.maxAge()-this.age(),r=e+Sd(this._rescc["stale-if...
  method stale (line 142) | stale(){return this.maxAge()<=this.age()}
  method _useStaleIfError (line 142) | _useStaleIfError(){return this.maxAge()+Sd(this._rescc["stale-if-error"]...
  method useStaleWhileRevalidate (line 142) | useStaleWhileRevalidate(){return this.maxAge()+Sd(this._rescc["stale-whi...
  method fromObject (line 142) | static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}
  method _fromObject (line 142) | _fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e|...
  method toObject (line 142) | toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._ca...
  method revalidationHeaders (line 142) | revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copy...
  method revalidatedPolicy (line 142) | revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStal...
  method constructor (line 142) | constructor(e,r,o,a){if(typeof e!="number")throw new TypeError("Argument...
  method _read (line 142) | _read(){this.push(this.body),this.push(null)}
  method constructor (line 142) | constructor(e,r){if(super(),this.opts=Object.assign({namespace:"keyv",se...
  method _getKeyPrefix (line 142) | _getKeyPrefix(e){return`${this.opts.namespace}:${e}`}
  method get (line 142) | get(e,r){e=this._getKeyPrefix(e);let{store:o}=this.opts;return Promise.r...
  method set (line 142) | set(e,r,o){e=this._getKeyPrefix(e),typeof o>"u"&&(o=this.opts.ttl),o===0...
  method delete (line 142) | delete(e){e=this._getKeyPrefix(e);let{store:r}=this.opts;return Promise....
  method clear (line 142) | clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear...
  method constructor (line 142) | constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter ...
  method createCacheableRequest (line 142) | createCacheableRequest(e){return(r,o)=>{let a;if(typeof r=="string")a=GM...
  function jnt (line 142) | function jnt(t){let e={...t};return e.path=`${t.pathname||"/"}${t.search...
  function GM (line 142) | function GM(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostnam...
  method constructor (line 142) | constructor(t){super(t.message),this.name="RequestError",Object.assign(t...
  method constructor (line 142) | constructor(t){super(t.message),this.name="CacheError",Object.assign(thi...
  method get (line 142) | get(){let n=t[a];return typeof n=="function"?n.bind(t):n}
  method set (line 142) | set(n){t[a]=n}
  method transform (line 142) | transform(A,p,h){o=!1,h(null,A)}
  method flush (line 142) | flush(A){A()}
  method destroy (line 142) | destroy(A,p){t.destroy(),p(A)}
  method constructor (line 142) | constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`max...
  method _set (line 142) | _set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){...
  method get (line 142) | get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.ha...
  method set (line 142) | set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}
  method has (line 142) | has(e){return this.cache.has(e)||this.oldCache.has(e)}
  method peek (line 142) | peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.h...
  method delete (line 142) | delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCach...
  method clear (line 142) | clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}
  method keys (line 142) | *keys(){for(let[e]of this)yield e}
  method values (line 142) | *values(){for(let[,e]of this)yield e}
  method [Symbol.iterator] (line 142) | *[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.o...
  method size (line 142) | get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||...
  method constructor (line 142) | constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:o=10,maxCac...
  method normalizeOrigin (line 142) | static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&...
  method normalizeOptions (line 142) | normalizeOptions(e){let r="";if(e)for(let o of Xnt)e[o]&&(r+=`:${e[o]}`)...
  method _tryToCreateNewSession (line 142) | _tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e])...
  method getSession (line 142) | getSession(e,r,o){return new Promise((a,n)=>{Array.isArray(o)?(o=[...o],...
  method request (line 143) | request(e,r,o,a){return new Promise((n,u)=>{this.getSession(e,r,[{reject...
  method createConnection (line 143) | createConnection(e,r){return tA.connect(e,r)}
  method connect (line 143) | static connect(e,r){r.ALPNProtocols=["h2"];let o=e.port||443,a=e.hostnam...
  method closeFreeSessions (line 143) | closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r ...
  method destroy (line 143) | destroy(e){for(let r of Object.values(this.sessions))for(let o of r)o.de...
  method freeSessions (line 143) | get freeSessions(){return qoe({agent:this,isFree:!0})}
  method busySessions (line 143) | get busySessions(){return qoe({agent:this,isFree:!1})}
  method constructor (line 143) | constructor(e,r){super({highWaterMark:r,autoDestroy:!1}),this.statusCode...
  method _destroy (line 143) | _destroy(e){this.req._request.destroy(e)}
  method setTimeout (line 143) | setTimeout(e,r){return this.req.setTimeout(e,r),this}
  method _dump (line 143) | _dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),t...
  method _read (line 143) | _read(){this.req&&this.req._request.resume()}
  method constructor (line 143) | constructor(...a){super(typeof r=="string"?r:r(a)),this.name=`${super.na...
  method constructor (line 143) | constructor(e,r,o){super({autoDestroy:!1});let a=typeof e=="string"||e i...
  method method (line 143) | get method(){return this[Qo][iae]}
  method method (line 143) | set method(e){e&&(this[Qo][iae]=e.toUpperCase())}
  method path (line 143) | get path(){return this[Qo][sae]}
  method path (line 143) | set path(e){e&&(this[Qo][sae]=e)}
  method _mustNotHaveABody (line 143) | get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"...
  method _write (line 143) | _write(e,r,o){if(this._mustNotHaveABody){o(new Error("The GET, HEAD and ...
  method _final (line 143) | _final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(thi...
  method abort (line 143) | abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=...
  method _destroy (line 143) | _destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.de...
  method flushHeaders (line 143) | async flushHeaders(){if(this[rb]||this.destroyed)return;this[rb]=!0;let ...
  method getHeader (line 143) | getHeader(e){if(typeof e!="string")throw new ZM("name","string",e);retur...
  method headersSent (line 143) | get headersSent(){return this[rb]}
  method removeHeader (line 143) | removeHeader(e){if(typeof e!="string")throw new ZM("name","string",e);if...
  method setHeader (line 143) | setHeader(e,r){if(this.headersSent)throw new rae("set");if(typeof e!="st...
  method setNoDelay (line 143) | setNoDelay(){}
  method setSocketKeepAlive (line 143) | setSocketKeepAlive(){}
  method setTimeout (line 143) | setTimeout(e,r){let o=()=>this._request.setTimeout(e,r);return this._req...
  method maxHeadersCount (line 143) | get maxHeadersCount(){if(!this.destroyed&&this._request)return this._req...
  method maxHeadersCount (line 143) | set maxHeadersCount(e){}
  function Fit (line 143) | function Fit(t,e,r){let o={};for(let a of r)o[a]=(...n)=>{e.emit(a,...n)...
  method once (line 143) | once(e,r,o){e.once(r,o),t.push({origin:e,event:r,fn:o})}
  method unhandleAll (line 143) | unhandleAll(){for(let e of t){let{origin:r,event:o,fn:a}=e;r.removeListe...
  method constructor (line 143) | constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=...
  method constructor (line 143) | constructor(){this.weakMap=new WeakMap,this.map=new Map}
  method set (line 143) | set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}
  method get (line 143) | get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}
  method has (line 143) | has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}
  function nst (line 143) | function nst(t){for(let e in t){let r=t[e];if(!st.default.string(r)&&!st...
  function ist (line 143) | function ist(t){return st.default.object(t)&&!("statusCode"in t)}
  method constructor (line 143) | constructor(e,r,o){var a;if(super(e),Error.captureStackTrace(this,this.c...
  method constructor (line 147) | constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborti...
  method constructor (line 147) | constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})...
  method constructor (line 147) | constructor(e,r){super(e.message,e,r),this.name="CacheError"}
  method constructor (line 147) | constructor(e,r){super(e.message,e,r),this.name="UploadError"}
  method constructor (line 147) | constructor(e,r,o){super(e.message,e,o),this.name="TimeoutError",this.ev...
  method constructor (line 147) | constructor(e,r){super(e.message,e,r),this.name="ReadError"}
  method constructor (line 147) | constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),th...
  method constructor (line 147) | constructor(e,r={},o){super({autoDestroy:!1,highWaterMark:0}),this[bE]=0...
  method normalizeArguments (line 147) | static normalizeArguments(e,r,o){var a,n,u,A,p;let h=r;if(st.default.obj...
  method _lockWrite (line 147) | _lockWrite(){let e=()=>{throw new TypeError("The payload has been alread...
  method _unlockWrite (line 147) | _unlockWrite(){this.write=super.write,this.end=super.end}
  method _finalizeBody (line 147) | async _finalizeBody(){let{options:e}=this,{headers:r}=e,o=!st.default.un...
  method _onResponseBase (line 147) | async _onResponseBase(e){let{options:r}=this,{url:o}=r;this[Wae]=e,r.dec...
  method _onResponse (line 147) | async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._be...
  method _onRequest (line 147) | _onRequest(e){let{options:r}=this,{timeout:o,url:a}=r;Git.default(e),thi...
  method _createCacheableRequest (line 147) | async _createCacheableRequest(e,r){return new Promise((o,a)=>{Object.ass...
  method _makeRequest (line 147) | async _makeRequest(){var e,r,o,a,n;let{options:u}=this,{headers:A}=u;for...
  method _error (line 147) | async _error(e){try{for(let r of this.options.hooks.beforeError)e=await ...
  method _beforeError (line 147) | _beforeError(e){if(this[QE])return;let{options:r}=this,o=this.retryCount...
  method _read (line 147) | _read(){this[ab]=!0;let e=this[lb];if(e&&!this[QE]){e.readableLength&&(t...
  method _write (line 147) | _write(e,r,o){let a=()=>{this._writeRequest(e,r,o)};this.requestInitiali...
  method _writeRequest (line 147) | _writeRequest(e,r,o){this[Zs].destroyed||(this._progressCallbacks.push((...
  method _final (line 147) | _final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._prog...
  method _destroy (line 147) | _destroy(e,r){var o;this[QE]=!0,clearTimeout(this[Kae]),Zs in this&&(thi...
  method _isAboutToError (line 147) | get _isAboutToError(){return this[QE]}
  method ip (line 147) | get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteA...
  method aborted (line 147) | get aborted(){var e,r,o;return((r=(e=this[Zs])===null||e===void 0?void 0...
  method socket (line 147) | get socket(){var e,r;return(r=(e=this[Zs])===null||e===void 0?void 0:e.s...
  method downloadProgress (line 147) | get downloadProgress(){let e;return this[PE]?e=this[bE]/this[PE]:this[PE...
  method uploadProgress (line 147) | get uploadProgress(){let e;return this[xE]?e=this[kE]/this[xE]:this[xE]=...
  method timings (line 147) | get timings(){var e;return(e=this[Zs])===null||e===void 0?void 0:e.timings}
  method isFromCache (line 147) | get isFromCache(){return this[qae]}
  method pipe (line 147) | pipe(e,r){if(this[Yae])throw new Error("Failed to pipe. The response has...
  method unpipe (line 147) | unpipe(e){return e instanceof w4.ServerResponse&&this[ob].delete(e),supe...
  method constructor (line 147) | constructor(e,r){let{options:o}=r.request;super(`${e.message} in "${o.ur...
  method constructor (line 147) | constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}
  method isCanceled (line 147) | get isCanceled(){return!0}
  function ele (line 147) | function ele(t){let e,r,o=new hst.EventEmitter,a=new dst((u,A,p)=>{let h...
  function wst (line 147) | function wst(t,...e){let r=(async()=>{if(t instanceof Cst.RequestError)t...
  function nle (line 147) | function nle(t){for(let e of Object.values(t))(rle.default.plainObject(e...
  function dle (line 147) | function dle(t){let e=new URL(t),r={host:e.hostname,headers:{}};return e...
  function R4 (line 147) | async function R4(t){return ol(gle,t,()=>oe.readFilePromise(t).then(e=>(...
  function Lst (line 147) | function Lst({statusCode:t,statusMessage:e},r){let o=Mt(r,t,yt.NUMBER),a...
  function wb (line 147) | async function wb(t,{configuration:e,customErrorMessage:r}){try{return a...
  function Ele (line 147) | function Ele(t,e){let r=[...e.configuration.get("networkSettings")].sort...
  function I1 (line 147) | async function I1(t,e,{configuration:r,headers:o,jsonRequest:a,jsonRespo...
  function L4 (line 147) | async function L4(t,{configuration:e,jsonResponse:r,customErrorMessage:o...
  function Ost (line 147) | async function Ost(t,e,{customErrorMessage:r,...o}){return(await wb(I1(t...
  function O4 (line 147) | async function O4(t,e,{customErrorMessage:r,...o}){return(await wb(I1(t,...
  function Mst (line 147) | async function Mst(t,{customErrorMessage:e,...r}){return(await wb(I1(t,n...
  function Ust (line 147) | async function Ust(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResp...
  function Gst (line 147) | function Gst(){if(process.platform==="darwin"||process.platform==="win32...
  function B1 (line 147) | function B1(){return Ile=Ile??{os:process.platform,cpu:process.arch,libc...
  function qst (line 147) | function qst(t=B1()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}...
  function M4 (line 147) | function M4(){let t=B1();return Ble=Ble??{os:[t.os],cpu:[t.cpu],libc:t.l...
  function Kst (line 147) | function Kst(t){let e=Yst.exec(t);if(!e)return null;let r=e[2]&&e[2].ind...
  function Vst (line 147) | function Vst(){let e=new Error().stack.split(`
  function U4 (line 148) | function U4(){return typeof Bb.default.availableParallelism<"u"?Bb.defau...
  function Y4 (line 148) | function Y4(t,e,r,o,a){let n=A1(r);if(o.isArray||o.type==="ANY"&&Array.i...
  function H4 (line 148) | function H4(t,e,r,o,a){let n=A1(r);switch(o.type){case"ANY":return qP(n)...
  function Zst (line 148) | function Zst(t,e,r,o,a){let n=A1(r);if(typeof n!="object"||Array.isArray...
  function $st (line 148) | function $st(t,e,r,o,a){let n=A1(r),u=new Map;if(typeof n!="object"||Arr...
  function W4 (line 148) | function W4(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case"SHAPE":{if(e...
  function Pb (line 148) | function Pb(t,e,r){if(e.type==="SECRET"&&typeof t=="string"&&r.hideSecre...
  function eot (line 148) | function eot(){let t={};for(let[e,r]of Object.entries(process.env))e=e.t...
  function G4 (line 148) | function G4(){let t=`${bb}rc_filename`;for(let[e,r]of Object.entries(pro...
  function vle (line 148) | async function vle(t){try{return await oe.readFilePromise(t)}catch{retur...
  function tot (line 148) | async function tot(t,e){return Buffer.compare(...await Promise.all([vle(...
  function rot (line 148) | async function rot(t,e){let[r,o]=await Promise.all([oe.statPromise(t),oe...
  function iot (line 148) | async function iot({configuration:t,selfPath:e}){let r=t.get("yarnPath")...
  method constructor (line 148) | constructor(e){this.isCI=Lf.isCI;this.projectCwd=null;this.plugins=new M...
  method create (line 148) | static create(e,r,o){let a=new rA(e);typeof r<"u"&&!(r instanceof Map)&&...
  method find (line 148) | static async find(e,r,{strict:o=!0,usePathCheck:a=null,useRc:n=!0}={}){l...
  method findRcFiles (line 148) | static async findRcFiles(e){let r=G4(),o=[],a=e,n=null;for(;a!==n;){n=a;...
  method findFolderRcFile (line 148) | static async findFolderRcFile(e){let r=V.join(e,dr.rc),o;try{o=await oe....
  method findProjectCwd (line 148) | static async findProjectCwd(e){let r=null,o=e,a=null;for(;o!==a;){if(a=o...
  method updateConfiguration (line 148) | static async updateConfiguration(e,r,o={}){let a=G4(),n=V.join(e,a),u=oe...
  method addPlugin (line 148) | static async addPlugin(e,r){r.length!==0&&await rA.updateConfiguration(e...
  method updateHomeConfiguration (line 148) | static async updateHomeConfiguration(e){let r=EE();return await rA.updat...
  method activatePlugin (line 148) | activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<"u"&&th...
  method importSettings (line 148) | importSettings(e){for(let[r,o]of Object.entries(e))if(o!=null){if(this.s...
  method useWithSource (line 148) | useWithSource(e,r,o,a){try{this.use(e,r,o,a)}catch(n){throw n.message+=`...
  method use (line 148) | use(e,r,o,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get("enableStrictSe...
  method get (line 148) | get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key...
  method getSpecial (line 148) | getSpecial(e,{hideSecrets:r=!1,getNativePaths:o=!1}){let a=this.get(e),n...
  method getSubprocessStreams (line 148) | getSubprocessStreams(e,{header:r,prefix:o,report:a}){let n,u,A=oe.create...
  method makeResolver (line 149) | makeResolver(){let e=[];for(let r of this.plugins.values())for(let o of ...
  method makeFetcher (line 149) | makeFetcher(){let e=[];for(let r of this.plugins.values())for(let o of r...
  method getLinkers (line 149) | getLinkers(){let e=[];for(let r of this.plugins.values())for(let o of r....
  method getSupportedArchitectures (line 149) | getSupportedArchitectures(){let e=B1(),r=this.get("supportedArchitecture...
  method getPackageExtensions (line 149) | async getPackageExtensions(){if(this.packageExtensions!==null)return thi...
  method normalizeLocator (line 149) | normalizeLocator(e){return xa(e.reference)?Qs(e,`${this.get("defaultProt...
  method normalizeDependency (line 149) | normalizeDependency(e){return xa(e.range)?In(e,`${this.get("defaultProto...
  method normalizeDependencyMap (line 149) | normalizeDependencyMap(e){return new Map([...e].map(([r,o])=>[r,this.nor...
  method normalizePackage (line 149) | normalizePackage(e,{packageExtensions:r}){let o=e1(e),a=r.get(e.identHas...
  method getLimit (line 149) | getLimit(e){return ol(this.limits,e,()=>(0,ble.default)(this.get(e)))}
  method triggerHook (line 149) | async triggerHook(e,...r){for(let o of this.plugins.values()){let a=o.ho...
  method triggerMultipleHooks (line 149) | async triggerMultipleHooks(e,r){for(let o of r)await this.triggerHook(e,...
  method reduceHook (line 149) | async reduceHook(e,r,...o){let a=r;for(let n of this.plugins.values()){l...
  method firstHook (line 149) | async firstHook(e,...r){for(let o of this.plugins.values()){let a=o.hook...
  function bd (line 149) | function bd(t){return t!==null&&typeof t.fd=="number"}
  function K4 (line 149) | function K4(){}
  function V4 (line 149) | function V4(){for(let t of xd)t.kill()}
  function qc (line 149) | async function qc(t,e,{cwd:r,env:o=process.env,strict:a=!1,stdin:n=null,...
  function _4 (line 149) | async function _4(t,e,{cwd:r,env:o=process.env,encoding:a="utf8",strict:...
  function X4 (line 149) | function X4(t,e){let r=sot.get(e);return typeof r<"u"?128+r:t??1}
  function oot (line 149) | function oot(t,e,{configuration:r,report:o}){o.reportError(1,`  ${zu(r,t...
  method constructor (line 149) | constructor({fileName:r,code:o,signal:a}){let n=Ke.create(V.cwd()),u=Mt(...
  method constructor (line 149) | constructor({fileName:r,code:o,signal:a,stdout:n,stderr:u}){super({fileN...
  function Qle (line 149) | function Qle(t){kle=t}
  function b1 (line 149) | function b1(){return typeof Z4>"u"&&(Z4=kle()),Z4}
  function x (line 149) | function x(We){return r.locateFile?r.locateFile(We,v):v+We}
  function he (line 149) | function he(We,tt,It){switch(tt=tt||"i8",tt.
Condensed preview — 445 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,077K chars).
[
  {
    "path": ".cliffignore",
    "chars": 112,
    "preview": "# skip commits by their SHA1\n\n4f88dda8c746173ea59f920b7579b7f6c74bd6c8\n10c3194381f2cc4f93eb97404369568882ed8677\n"
  },
  {
    "path": ".dockerignore",
    "chars": 398,
    "preview": "# Directories\n/.git/\n/.github/\n/npm/\n/pypi/\n/website/\n\n# Files\n.editorconfig\n.gitignore\n*.md\ncodecov.yml\nDockerfile\nLICE"
  },
  {
    "path": ".editorconfig",
    "chars": 121,
    "preview": "# https://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n[{*.sh,*.rs}]\nindent_style = space\nindent_size = 4"
  },
  {
    "path": ".envrc",
    "chars": 32,
    "preview": "use flake\ndotenv_if_exists .env\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 41,
    "preview": "00273009e7553229bccc02e9f4a00d6f8acb9cd5\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 217,
    "preview": "# See https://help.github.com/articles/about-codeowners/\n# for more info about CODEOWNERS file\n\n# It uses the same patte"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 53,
    "preview": "github: orhun\npatreon: orhunp\nbuy_me_a_coffee: orhun\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 2170,
    "preview": "name: Bug report 🐛\ndescription: Report a bug to help us improve\nlabels: ['bug']\nassignees: \n  - orhun\nbody:\n  - type: ma"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 295,
    "preview": "contact_links:\n  - name: Discord Chat\n    url: https://discord.gg/W3mAwMDWH4\n    about: Ask questions and have discussio"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1780,
    "preview": "name: Feature request ⛰️ \ndescription: Suggest an idea for this project\nlabels: ['feature/request']\nassignees: \n  - orhu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/integration.yml",
    "chars": 2346,
    "preview": "name: Integration ⚙️\ndescription: Report a bug or request a feature about an integration (e.g GitHub/GitLab/Gitea/Bitbuc"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1733,
    "preview": "## Description\n\n<!--- Describe your changes in detail -->\n\n## Motivation and Context\n\n<!--- Why is this change required?"
  },
  {
    "path": ".github/actions/run-fixtures-test/action.yml",
    "chars": 2881,
    "preview": "name: Run a fixtures test\ndescription: Run a fixtures test\n\ninputs:\n  fixtures-dir:\n    description: Path to the fixture"
  },
  {
    "path": ".github/bors.toml",
    "chars": 270,
    "preview": "status = [\n    \"Check\",\n    \"Lints\",\n    \"Formatting\",\n    \"Test suite\",\n    \"Audit check\",\n    \"Links\",\n    \"Check Rust"
  },
  {
    "path": ".github/config.yml",
    "chars": 837,
    "preview": "# Configuration for welcome - https://github.com/behaviorbot/welcome\n\n# Configuration for new-issue-welcome - https://gi"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1568,
    "preview": "version: 2\nupdates:\n  # Maintain dependencies for Cargo\n  - package-ecosystem: cargo\n    directory: \"/\"\n    schedule:\n  "
  },
  {
    "path": ".github/fixtures/README.md",
    "chars": 1166,
    "preview": "# Fixtures\n\n[Test fixtures](https://en.wikipedia.org/wiki/Test_fixture) are a way of testing the `git-cliff`'s functiona"
  },
  {
    "path": ".github/fixtures/new-fixture-template/cliff.toml",
    "chars": 963,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/new-fixture-template/commit.sh",
    "chars": 603,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/new-fixture-template/expected.md",
    "chars": 216,
    "preview": "## [unreleased]\n\n### Test\n\n- Add tests\n\n## [0.2.0] - 2022-04-06\n\n### Bug Fixes\n\n- Fix feature 2\n\n### Features\n\n- Add fea"
  },
  {
    "path": ".github/fixtures/test-always-render/cliff.toml",
    "chars": 553,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-always-render/commit.sh",
    "chars": 310,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-always-render/expected.md",
    "chars": 48,
    "preview": "## [0.2.0] - <<DATE>>\n\nNo significant changes.\n\n"
  },
  {
    "path": ".github/fixtures/test-always-render-unreleased/cliff.toml",
    "chars": 553,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-always-render-unreleased/commit.sh",
    "chars": 310,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-always-render-unreleased/expected.md",
    "chars": 42,
    "preview": "## [unreleased]\n\nNo significant changes.\n\n"
  },
  {
    "path": ".github/fixtures/test-azure-devops-integration/cliff.toml",
    "chars": 1875,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# Azure DevOps integration for fetching com"
  },
  {
    "path": ".github/fixtures/test-azure-devops-integration/commit.sh",
    "chars": 159,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://dev.azure.com/shiftme/gitcliff/_git/git-cliff-readme-example\ng"
  },
  {
    "path": ".github/fixtures/test-azure-devops-integration/expected.md",
    "chars": 587,
    "preview": "## What's Changed\n* feat(config): support multiple file formats by @orhun\n* feat(cache): use cache while fetching pages "
  },
  {
    "path": ".github/fixtures/test-azure-devops-integration-custom-range/cliff.toml",
    "chars": 1875,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# Azure DevOps integration for fetching com"
  },
  {
    "path": ".github/fixtures/test-azure-devops-integration-custom-range/commit.sh",
    "chars": 159,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://dev.azure.com/shiftme/gitcliff/_git/git-cliff-readme-example\ng"
  },
  {
    "path": ".github/fixtures/test-azure-devops-integration-custom-range/expected.md",
    "chars": 130,
    "preview": "## What's Changed in v1.0.1\n* refactor(parser): expose string functions by @orhun\n* chore(release): add release script b"
  },
  {
    "path": ".github/fixtures/test-bitbucket-integration/cliff.toml",
    "chars": 1859,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# Bitbucket integration for fetching commit"
  },
  {
    "path": ".github/fixtures/test-bitbucket-integration/commit.sh",
    "chars": 157,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://bitbucket.org/mcwarman-playground/git-cliff-readme-example\ngit"
  },
  {
    "path": ".github/fixtures/test-bitbucket-integration/expected.md",
    "chars": 988,
    "preview": "## What's Changed\n* feat(config): support multiple file formats by @orhun <orhun@archlinux.org>\n* feat(cache): use cache"
  },
  {
    "path": ".github/fixtures/test-bitbucket-integration-custom-range/cliff.toml",
    "chars": 1954,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# Bitbucket integration for fetching commit"
  },
  {
    "path": ".github/fixtures/test-bitbucket-integration-custom-range/commit.sh",
    "chars": 157,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://bitbucket.org/mcwarman-playground/git-cliff-readme-example\ngit"
  },
  {
    "path": ".github/fixtures/test-bitbucket-integration-custom-range/expected.md",
    "chars": 174,
    "preview": "## What's Changed in v1.0.1\n* refactor(parser): expose string functions by @orhun <orhun@archlinux.org>\n* chore(release)"
  },
  {
    "path": ".github/fixtures/test-bump-initial-tag/cliff.toml",
    "chars": 947,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-bump-initial-tag/commit.sh",
    "chars": 115,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:13\" git commit --allow-empty -m \"test: add tests\"\n"
  },
  {
    "path": ".github/fixtures/test-bump-initial-tag/expected.md",
    "chars": 36,
    "preview": "## [1.15.5]\n\n### Test\n\n- Add tests\n\n"
  },
  {
    "path": ".github/fixtures/test-bump-initial-tag-cli-arg/cliff.toml",
    "chars": 945,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-bump-initial-tag-cli-arg/commit.sh",
    "chars": 115,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:13\" git commit --allow-empty -m \"test: add tests\"\n"
  },
  {
    "path": ".github/fixtures/test-bump-initial-tag-cli-arg/expected.md",
    "chars": 35,
    "preview": "## [2.1.1]\n\n### Test\n\n- Add tests\n\n"
  },
  {
    "path": ".github/fixtures/test-bump-initial-tag-default/cliff.toml",
    "chars": 916,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-bump-initial-tag-default/commit.sh",
    "chars": 115,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:13\" git commit --allow-empty -m \"test: add tests\"\n"
  },
  {
    "path": ".github/fixtures/test-bump-initial-tag-default/expected.md",
    "chars": 35,
    "preview": "## [0.1.0]\n\n### Test\n\n- Add tests\n\n"
  },
  {
    "path": ".github/fixtures/test-bump-unreleased-with-tag-message-arg/cliff.toml",
    "chars": 698,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-bump-unreleased-with-tag-message-arg/commit.sh",
    "chars": 603,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-bump-unreleased-with-tag-message-arg/expected.md",
    "chars": 46,
    "preview": "## [0.2.1]\n\nSome text\n\n### Test\n\n- Add tests\n\n"
  },
  {
    "path": ".github/fixtures/test-bump-version/cliff.toml",
    "chars": 602,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-bump-version/commit.sh",
    "chars": 415,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-bump-version/expected.md",
    "chars": 192,
    "preview": "## [1.0.0]\n\n### <!-- 0 -->🚀 Features\n\n- [**breaking**] Add breaking feature\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Fix feature 2\n"
  },
  {
    "path": ".github/fixtures/test-bump-version-custom-minor/cliff.toml",
    "chars": 607,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-bump-version-custom-minor/commit.sh",
    "chars": 404,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-bump-version-custom-minor/expected.md",
    "chars": 164,
    "preview": "## [0.2.0]\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Fix feature 2\n\n### <!-- 10 -->💼 Other\n\n- Add minor\n\n## [0.1.0]\n\n### <!-- 0 -->🚀"
  },
  {
    "path": ".github/fixtures/test-bump-version-keep-zerover/cliff.toml",
    "chars": 680,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-bump-version-keep-zerover/commit.sh",
    "chars": 415,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-bump-version-keep-zerover/expected.md",
    "chars": 142,
    "preview": "## [0.2.0]\n\n### Feat\n\n- [**breaking**] Add breaking feature\n\n### Fix\n\n- Fix feature 2\n\n## [0.1.0]\n\n### Feat\n\n- Add featu"
  },
  {
    "path": ".github/fixtures/test-bump-version-major/cliff.toml",
    "chars": 487,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-bump-version-major/commit.sh",
    "chars": 406,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-bump-version-major/expected.md",
    "chars": 143,
    "preview": "## [1.0.0]\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Fix feature 1\n- Fix feature 2\n\n## [0.1.0]\n\n### <!-- 0 -->🚀 Features\n\n- Add feat"
  },
  {
    "path": ".github/fixtures/test-bump-version-minor/cliff.toml",
    "chars": 487,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-bump-version-minor/commit.sh",
    "chars": 415,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-bump-version-minor/expected.md",
    "chars": 192,
    "preview": "## [0.2.0]\n\n### <!-- 0 -->🚀 Features\n\n- [**breaking**] Add breaking feature\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Fix feature 2\n"
  },
  {
    "path": ".github/fixtures/test-bump-version-patch/cliff.toml",
    "chars": 487,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-bump-version-patch/commit.sh",
    "chars": 415,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-bump-version-patch/expected.md",
    "chars": 192,
    "preview": "## [0.1.1]\n\n### <!-- 0 -->🚀 Features\n\n- [**breaking**] Add breaking feature\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Fix feature 2\n"
  },
  {
    "path": ".github/fixtures/test-bumped-version/cliff.toml",
    "chars": 602,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-bumped-version/commit.sh",
    "chars": 406,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-bumped-version/expected.md",
    "chars": 7,
    "preview": "v0.1.1\n"
  },
  {
    "path": ".github/fixtures/test-cli-arg-ignore-tags/cliff.toml",
    "chars": 622,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-cli-arg-ignore-tags/commit.sh",
    "chars": 567,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add first beta f"
  },
  {
    "path": ".github/fixtures/test-cli-arg-ignore-tags/expected.md",
    "chars": 239,
    "preview": "## [1.0.1] - 2021-01-23\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Simple fix\n\n## [1.0.0] - 2021-01-23\n\n### <!-- 0 -->🚀 Features\n\n- A"
  },
  {
    "path": ".github/fixtures/test-cli-arg-skip-tags/cliff.toml",
    "chars": 622,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-cli-arg-skip-tags/commit.sh",
    "chars": 567,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add first beta f"
  },
  {
    "path": ".github/fixtures/test-cli-arg-skip-tags/expected.md",
    "chars": 161,
    "preview": "## [1.0.1] - 2021-01-23\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Simple fix\n\n## [1.0.0] - 2021-01-23\n\n### <!-- 7 -->⚙️ Miscellaneou"
  },
  {
    "path": ".github/fixtures/test-commit-footers/cliff.toml",
    "chars": 806,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-commit-footers/commit.sh",
    "chars": 395,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\" -"
  },
  {
    "path": ".github/fixtures/test-commit-footers/expected.md",
    "chars": 203,
    "preview": "## [unreleased]\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Fix feature 1, footer1:xyz, footer2:abc\n\n## [0.1.0] - 2021-01-23\n\n### <!--"
  },
  {
    "path": ".github/fixtures/test-commit-preprocessors/cliff.toml",
    "chars": 1001,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-commit-preprocessors/commit.sh",
    "chars": 410,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-commit-preprocessors/expected.md",
    "chars": 211,
    "preview": "## [0.1.0] - 2022-04-06\n\n### <!-- 0 -->🚀 Features\n\n- Add feature 1\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Fix feature 1 ([issue#1"
  },
  {
    "path": ".github/fixtures/test-commit-range/cliff.toml",
    "chars": 1008,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-commit-range/commit.sh",
    "chars": 140,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://github.com/orhun/git-cliff-readme-example\ngit pull origin mast"
  },
  {
    "path": ".github/fixtures/test-commit-range/expected.md",
    "chars": 627,
    "preview": "## [unreleased]\n\na9d4050212a18f6b3bd76e2e41fbb9045d268b80..df6aef41292f3ffe5887754232e6ea7831c50ba5\n\n### Features\n\n- Sup"
  },
  {
    "path": ".github/fixtures/test-commit-range-with-given-range/cliff.toml",
    "chars": 1008,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-commit-range-with-given-range/commit.sh",
    "chars": 140,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://github.com/orhun/git-cliff-readme-example\ngit pull origin mast"
  },
  {
    "path": ".github/fixtures/test-commit-range-with-given-range/expected.md",
    "chars": 345,
    "preview": "## [unreleased]\n\na140cef0405e0bcbfb5de44ff59e091527d91b38..a9d4050212a18f6b3bd76e2e41fbb9045d268b80\n\n### Bug Fixes\n\n- Re"
  },
  {
    "path": ".github/fixtures/test-commit-range-with-sort-commits/cliff.toml",
    "chars": 1032,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-commit-range-with-sort-commits/commit.sh",
    "chars": 140,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://github.com/orhun/git-cliff-readme-example\ngit pull origin mast"
  },
  {
    "path": ".github/fixtures/test-commit-range-with-sort-commits/expected.md",
    "chars": 627,
    "preview": "## [unreleased]\n\na9d4050212a18f6b3bd76e2e41fbb9045d268b80..df6aef41292f3ffe5887754232e6ea7831c50ba5\n\n### Features\n\n- Use"
  },
  {
    "path": ".github/fixtures/test-configure-from-cargo-toml/Cargo.toml",
    "chars": 1457,
    "preview": "[package]\nname = \"test\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[package.metadata.git-cliff.changelog]\n# A Tera template to "
  },
  {
    "path": ".github/fixtures/test-configure-from-cargo-toml/commit.sh",
    "chars": 603,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-configure-from-cargo-toml/expected.md",
    "chars": 331,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n## [unreleased]\n\n### Test\n\n- Add test"
  },
  {
    "path": ".github/fixtures/test-conventional-commit/cliff.toml",
    "chars": 1011,
    "preview": "[changelog]\n# A Tera template to be rendered for each release in the changelog.\n# See https://keats.github.io/tera/docs/"
  },
  {
    "path": ".github/fixtures/test-conventional-commit/commit.sh",
    "chars": 1163,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-conventional-commit/expected.md",
    "chars": 753,
    "preview": "## Features\n\n*(web)* [**breaking**]: breaking change description feature 1\nfeature 1, breaking change in footer: Body fe"
  },
  {
    "path": ".github/fixtures/test-custom-remote-api-url/cliff.toml",
    "chars": 1830,
    "preview": "[remote.gitlab]\nowner = \"archlinux\"\nrepo = \"arch-repro-status\"\napi_url = \"https://gitlab.archlinux.org/api/v4\"\n\n[changel"
  },
  {
    "path": ".github/fixtures/test-custom-remote-api-url/commit.sh",
    "chars": 171,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://gitlab.archlinux.org/archlinux/arch-repro-status\ngit fetch\ngit"
  },
  {
    "path": ".github/fixtures/test-custom-remote-api-url/expected.md",
    "chars": 307,
    "preview": "## What's Changed in v1.4.1\n* Update the copyright year in license by @Orhun Parmaksız\n* bump dependencies by @Orhun Par"
  },
  {
    "path": ".github/fixtures/test-custom-scope/cliff.toml",
    "chars": 1099,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-custom-scope/commit.sh",
    "chars": 501,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-custom-scope/expected.md",
    "chars": 151,
    "preview": "## [0.1.0] - 2022-04-06\n\n### Bug Fixes\n\n#### Cli\n\n- Fix feature 1\n- Fix feature 2\n\n### Features\n\n#### App\n\n- Add feature"
  },
  {
    "path": ".github/fixtures/test-custom-tag-pattern/cliff.toml",
    "chars": 965,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-custom-tag-pattern/commit.sh",
    "chars": 651,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-custom-tag-pattern/expected.md",
    "chars": 216,
    "preview": "## [unreleased]\n\n### Test\n\n- Add tests\n\n## [0.2.0] - 2022-04-06\n\n### Bug Fixes\n\n- Fix feature 2\n\n### Features\n\n- Add fea"
  },
  {
    "path": ".github/fixtures/test-date-order/cliff.toml",
    "chars": 646,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-date-order/commit.sh",
    "chars": 368,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\ng"
  },
  {
    "path": ".github/fixtures/test-date-order/expected.md",
    "chars": 68,
    "preview": "## [0.1.1] - 2021-01-23\n\n### <!-- 0 -->🚀 Features\n\n- Fix feature 1\n\n"
  },
  {
    "path": ".github/fixtures/test-fail-on-unmatched-commit/cliff.toml",
    "chars": 1285,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-fail-on-unmatched-commit/commit.sh",
    "chars": 508,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:09\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-fail-on-unmatched-commit/expected.rc",
    "chars": 1,
    "preview": "1"
  },
  {
    "path": ".github/fixtures/test-fixtures-locally.sh",
    "chars": 1132,
    "preview": "#!/usr/bin/env bash\nset -e\n\nSCRIPT_DIR=$(readlink -f \"$(dirname \"$0\")\")\n\nif [ -z \"$1\" ]; then\n\techo \"Please input a fixt"
  },
  {
    "path": ".github/fixtures/test-footer-filter/cliff.toml",
    "chars": 1035,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-footer-filter/commit.sh",
    "chars": 734,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 00:00:00\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-footer-filter/expected.md",
    "chars": 155,
    "preview": "## [unreleased]\n\n### Test\n\n- Add tests\n\n## [0.2.0] - 2022-04-06\n\n### Refactor\n\n- Change feature 1\n\n## [0.1.0] - 2022-04-"
  },
  {
    "path": ".github/fixtures/test-footer-template/cliff.toml",
    "chars": 1030,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-footer-template/commit.sh",
    "chars": 694,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-footer-template/expected.md",
    "chars": 351,
    "preview": "## [unreleased]\n\n### <!-- 4 -->⚡ Performance\n\n- Footer\n\n### <!-- 6 -->🧪 Testing\n\n- Footer\n\n## [3.0.0]\n\n### <!-- 0 -->🚀 F"
  },
  {
    "path": ".github/fixtures/test-from-context/cliff.toml",
    "chars": 794,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-from-context/commit.sh",
    "chars": 634,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-from-context/context.json",
    "chars": 18392,
    "preview": "[\n  {\n    \"version\": null,\n    \"message\": null,\n    \"commits\": [\n      {\n        \"id\": \"c7541276668616c136d12a9ccd870873"
  },
  {
    "path": ".github/fixtures/test-from-context/expected.md",
    "chars": 261,
    "preview": "## [unreleased]\n\n### Test\n\n- Add tests\n\n## [0.2.0] - 2022-04-05 - This is so awesome!\n\n### Bug Fixes\n\n- Fix feature 2 (t"
  },
  {
    "path": ".github/fixtures/test-from-context-does-not-discard-fields/cliff.toml",
    "chars": 974,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% for group,"
  },
  {
    "path": ".github/fixtures/test-from-context-does-not-discard-fields/commit.sh",
    "chars": 1163,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-from-context-does-not-discard-fields/context.json",
    "chars": 13080,
    "preview": "[\n  {\n    \"version\": \"v0.1.0\",\n    \"message\": null,\n    \"commits\": [\n      {\n        \"id\": \"ab06a042344dbd1c4af974ef3930"
  },
  {
    "path": ".github/fixtures/test-from-context-does-not-discard-fields/expected.md",
    "chars": 754,
    "preview": "\n## Features\n\n*(web)* [**breaking**]: breaking change description feature 1\nfeature 1, breaking change in footer: Body f"
  },
  {
    "path": ".github/fixtures/test-gitea-integration/cliff.toml",
    "chars": 1634,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# Gitea integration for fetching commit met"
  },
  {
    "path": ".github/fixtures/test-gitea-integration/commit.sh",
    "chars": 149,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://codeberg.org/ThetaDev/git-cliff-readme-example.git\ngit pull or"
  },
  {
    "path": ".github/fixtures/test-gitea-integration/expected.md",
    "chars": 558,
    "preview": "## What's Changed\n* Initial commit by @ThetaDev\n* docs(project): add README.md by @ThetaDev\n* feat(parser): add ability "
  },
  {
    "path": ".github/fixtures/test-gitea-integration-custom-range/cliff.toml",
    "chars": 1729,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# Gitea integration for fetching commit met"
  },
  {
    "path": ".github/fixtures/test-gitea-integration-custom-range/commit.sh",
    "chars": 149,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://codeberg.org/ThetaDev/git-cliff-readme-example.git\ngit pull or"
  },
  {
    "path": ".github/fixtures/test-gitea-integration-custom-range/expected.md",
    "chars": 137,
    "preview": "## What's Changed\n* feat(config): support multiple file formats by @ThetaDev\n* feat(cache): use cache while fetching pag"
  },
  {
    "path": ".github/fixtures/test-github-integration/cliff.toml",
    "chars": 1761,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# GitHub integration for fetching commit me"
  },
  {
    "path": ".github/fixtures/test-github-integration/commit.sh",
    "chars": 140,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://github.com/orhun/git-cliff-readme-example\ngit pull origin mast"
  },
  {
    "path": ".github/fixtures/test-github-integration/expected.md",
    "chars": 681,
    "preview": "## What's Changed\n* feat(config): support multiple file formats by @orhun\n* feat(cache): use cache while fetching pages "
  },
  {
    "path": ".github/fixtures/test-github-integration-custom-range/cliff.toml",
    "chars": 1961,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# GitHub integration for fetching commit me"
  },
  {
    "path": ".github/fixtures/test-github-integration-custom-range/commit.sh",
    "chars": 140,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://github.com/orhun/git-cliff-readme-example\ngit pull origin mast"
  },
  {
    "path": ".github/fixtures/test-github-integration-custom-range/expected.md",
    "chars": 225,
    "preview": "## What's Changed in v1.0.1\n* refactor(parser): expose string functions by @orhun\n* chore(release): add release script b"
  },
  {
    "path": ".github/fixtures/test-gitlab-integration/cliff.toml",
    "chars": 1749,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# GitLab integration for fetching commit me"
  },
  {
    "path": ".github/fixtures/test-gitlab-integration/commit.sh",
    "chars": 152,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://gitlab.com/dark0dave/dotfiles\ngit fetch\ngit checkout 3c048a1b6"
  },
  {
    "path": ".github/fixtures/test-gitlab-integration/expected.md",
    "chars": 520,
    "preview": "## What's Changed\n* Initial commit by @dark0dave\n* Added tmux files by @dark0dave\n* Updated readme by @dark0dave\n* Updat"
  },
  {
    "path": ".github/fixtures/test-gitlab-integration-custom-range/cliff.toml",
    "chars": 1949,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n# GitLab integration for fetching commit me"
  },
  {
    "path": ".github/fixtures/test-gitlab-integration-custom-range/commit.sh",
    "chars": 152,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://gitlab.com/dark0dave/dotfiles\ngit fetch\ngit checkout 3c048a1b6"
  },
  {
    "path": ".github/fixtures/test-gitlab-integration-custom-range/expected.md",
    "chars": 174,
    "preview": "## What's Changed\n* Added curl files by @dark0dave\n* Zsh update by @dark0dave\n* Update README.md by @dark0dave\n* Fix for"
  },
  {
    "path": ".github/fixtures/test-header-template/cliff.toml",
    "chars": 849,
    "preview": "[changelog]\n# template for the changelog footer\nheader = \"\"\"\n# Changelog\n{% for release in releases %}\\\n    {% if releas"
  },
  {
    "path": ".github/fixtures/test-header-template/commit.sh",
    "chars": 694,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\nG"
  },
  {
    "path": ".github/fixtures/test-header-template/expected.md",
    "chars": 277,
    "preview": "# Changelog\n<!--v3.0.0..HEAD-->\n<!--v0.2.0..v3.0.0-->\n<!--v0.1.0..v0.2.0-->\n## [unreleased]\n\n### Perf\n\n- Footer\n\n### Tes"
  },
  {
    "path": ".github/fixtures/test-ignore-tags/cliff.toml",
    "chars": 949,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-ignore-tags/commit.sh",
    "chars": 563,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add skip feature"
  },
  {
    "path": ".github/fixtures/test-ignore-tags/expected.md",
    "chars": 168,
    "preview": "## [0.2.0] - 2021-01-23\n\n### <!-- 0 -->🚀 Features\n\n- Add feature 2\n- Add feature 3\n\n## [0.1.0] - 2021-01-23\n\n### <!-- 0 "
  },
  {
    "path": ".github/fixtures/test-invert-ignore-tags/cliff.toml",
    "chars": 667,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-invert-ignore-tags/commit.sh",
    "chars": 563,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add skip feature"
  },
  {
    "path": ".github/fixtures/test-invert-ignore-tags/expected.md",
    "chars": 116,
    "preview": "## [0.2.0] - 2021-01-23\n\n### <!-- 0 -->🚀 Features\n\n- Add feature 1\n- Fix feature 1\n- Add feature 2\n- Add feature 3\n\n"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links/cliff.toml",
    "chars": 2571,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links/commit.sh",
    "chars": 332,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\ng"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links/expected.md",
    "chars": 566,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-current-arg/cliff.toml",
    "chars": 2571,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-current-arg/commit.sh",
    "chars": 241,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\ng"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-current-arg/expected.md",
    "chars": 362,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-latest-arg/cliff.toml",
    "chars": 2571,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-latest-arg/commit.sh",
    "chars": 332,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\ng"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-latest-arg/expected.md",
    "chars": 362,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-no-tags/cliff.toml",
    "chars": 2571,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-no-tags/commit.sh",
    "chars": 302,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\n\n"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-no-tags/expected.md",
    "chars": 342,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-one-tag/cliff.toml",
    "chars": 2571,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-one-tag/commit.sh",
    "chars": 134,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\ng"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-one-tag/expected.md",
    "chars": 358,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-one-tag-bump-arg/cliff.toml",
    "chars": 2571,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-one-tag-bump-arg/commit.sh",
    "chars": 312,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"Initial commit\"\n\nGIT_C"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-one-tag-bump-arg/expected.md",
    "chars": 465,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-tag-arg/cliff.toml",
    "chars": 2571,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-tag-arg/commit.sh",
    "chars": 332,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\ng"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-tag-arg/expected.md",
    "chars": 574,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-unreleased-arg/cliff.toml",
    "chars": 2571,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-unreleased-arg/commit.sh",
    "chars": 332,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: add feature 1\"\ng"
  },
  {
    "path": ".github/fixtures/test-keep-a-changelog-links-unreleased-arg/expected.md",
    "chars": 352,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": ".github/fixtures/test-latest-with-one-tag/cliff.toml",
    "chars": 646,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-latest-with-one-tag/commit.sh",
    "chars": 227,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2021-01-23 01:23:45\" git commit --allow-empty -m \"feat: initial commit\"\n"
  },
  {
    "path": ".github/fixtures/test-latest-with-one-tag/expected.md",
    "chars": 85,
    "preview": "## [0.1.0] - 2021-01-23\n\n### <!-- 0 -->🚀 Features\n\n- Initial commit\n- Add feature 1\n\n"
  },
  {
    "path": ".github/fixtures/test-limit-commits/cliff.toml",
    "chars": 735,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-limit-commits/commit.sh",
    "chars": 410,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-limit-commits/expected.md",
    "chars": 117,
    "preview": "## [0.1.0] - 2022-04-06\n\n### <!-- 1 -->🐛 Bug Fixes\n\n- Fix feature 1 (#1)\n\n### <!-- 2 -->🚜 Refactor\n\n- Move  classes\n\n"
  },
  {
    "path": ".github/fixtures/test-monorepo-include-path/cliff.toml",
    "chars": 682,
    "preview": "[changelog]\n# template for the changelog body\n# https://keats.github.io/tera/docs/#introduction\nbody = \"\"\"\n{% if version"
  },
  {
    "path": ".github/fixtures/test-monorepo-include-path/commit.sh",
    "chars": 207,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://github.com/orhun/git-cliff\ngit fetch\nmv cliff.toml cliff.toml."
  },
  {
    "path": ".github/fixtures/test-monorepo-include-path/expected.md",
    "chars": 318,
    "preview": "## [unreleased]\n\n### Bug Fixes\n\n- Include the root commit when `--latest` is used with one tag (#901)\n- Match PR and rel"
  },
  {
    "path": ".github/fixtures/test-no-exec/cliff.toml",
    "chars": 1301,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-no-exec/commit.sh",
    "chars": 603,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-no-exec/expected.md",
    "chars": 216,
    "preview": "## [unreleased]\n\n### Test\n\n- Add tests\n\n## [0.2.0] - 2022-04-06\n\n### Bug Fixes\n\n- Fix feature 2\n\n### Features\n\n- Add fea"
  },
  {
    "path": ".github/fixtures/test-offline/cliff.toml",
    "chars": 1161,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[remote]\n# Should make us avoid all calls t"
  },
  {
    "path": ".github/fixtures/test-offline/commit.sh",
    "chars": 140,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://github.com/orhun/git-cliff-readme-example\ngit pull origin mast"
  },
  {
    "path": ".github/fixtures/test-offline/expected.md",
    "chars": 530,
    "preview": "## What's Changed\n* feat(config): support multiple file formats\n* feat(cache): use cache while fetching pages\n\n## What's"
  },
  {
    "path": ".github/fixtures/test-override-scope/cliff.toml",
    "chars": 1071,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[changelog]\n# A Tera template to be rendere"
  },
  {
    "path": ".github/fixtures/test-override-scope/commit.sh",
    "chars": 418,
    "preview": "#!/usr/bin/env bash\nset -e\n\nGIT_COMMITTER_DATE=\"2022-04-06 01:25:08\" git commit --allow-empty -m \"Initial commit\"\nGIT_CO"
  },
  {
    "path": ".github/fixtures/test-override-scope/expected.md",
    "chars": 91,
    "preview": "## 0.1.0 - 2022-04-06\n\n### Fix\n\n#### Xenon\n\n- First commit\n- Second commit\n- Third commit\n\n"
  },
  {
    "path": ".github/fixtures/test-regex-json-array/cliff.toml",
    "chars": 1973,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n\n[remote.github]\nowner = \"orhun\"\nrepo = \"git"
  },
  {
    "path": ".github/fixtures/test-regex-json-array/commit.sh",
    "chars": 156,
    "preview": "#!/usr/bin/env bash\nset -e\n\ngit remote add origin https://github.com/orhun/git-cliff-readme-example-one-pr-one-commit\ngi"
  },
  {
    "path": ".github/fixtures/test-regex-json-array/expected.md",
    "chars": 1413,
    "preview": "## [unreleased]\n\n### <!-- 02 -->✨ Enhancements\n\n- feat(cache): use cache while fetching pages([PR #7](https://github.com"
  }
]

// ... and 245 more files (download for full content)

About this extraction

This page contains the full source code of the orhun/git-cliff GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 445 files (3.8 MB), approximately 1.0M tokens, and a symbol index with 6125 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!