Files
renovate/lib/modules/manager/asdf/upgradeable-tooling.ts
Sebastian Poxhofer 3412de84ce refactor(linters): enable oxlint rule prefer-named-capture-group (#44714)
* refactor(lint): enable oxlint prefer-named-capture-group at error

Numbered capture groups (m[1], $1) break silently when a regex is
edited and group order shifts. Named groups (?<name>...) make intent
explicit and accesses (m.groups.name) resilient to reordering.

This enables the built-in eslint rule prefer-named-capture-group,
surfacing 321 pre-existing unnamed-group violations across ~121
files to be burned down incrementally in follow-up commits.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(versioning): name capture groups for prefer-named-capture-group

Burns down all prefer-named-capture-group violations in
lib/modules/versioning/. Unused capture groups (only reachable via
.test() or whole-match) become non-capturing (?:...); groups whose
value is read become named (?<name>...), with accesses rewritten to
match.groups!.<name> (or destructured from .groups!) instead of
positional match[n]/$n so a future edit that reorders groups cannot
silently break the reader.

Two cases needed extra care to preserve behavior:
- semver/common.ts and poetry/patterns.ts split() on a regex whose
  capture group is relied upon by String.prototype.split to keep the
  separator in the output array; the group is kept capturing and
  named, not converted to non-capturing.
- hashicorp/convertor.ts's semverRegex is only ever embedded via
  .source into a named `(?<version>...)` group elsewhere and never
  matched directly, so its internal groups are safe to make
  non-capturing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(datasource): name capture groups for prefer-named-capture-group

Burns down all prefer-named-capture-group violations under
lib/modules/datasource/. Same treatment as the versioning module:
unused groups become non-capturing, used groups get names, and
positional match[n] reads move to match.groups!.<name>.

docker/ecr.ts and pypi/common.ts keep their positional destructuring
(`const [, region] = ...`, `!!m &&`) working unchanged since a named
capture group is still addressable by its numeric index in
JavaScript — only pypi/common.ts's access was rewritten to
m.groups!.owner for clarity since it read a single group directly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(platform): name capture groups for prefer-named-capture-group

Burns down all prefer-named-capture-group violations under
lib/modules/platform/. Uses the repo's established idiom of
`match.groups?.<name>` after an optional-chained exec()/match() (see
bitbucket/index.ts hostnameWithoutApiPrefix, gerrit/utils.ts
extractSourceBranch) and `$<name>` in String.replace replacement
strings. Unused groups (markdown/HTML massaging regexes matched only
to be stripped) become non-capturing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(manager): name capture groups in ansible-galaxy for prefer-named-capture-group

Burns down prefer-named-capture-group violations in
lib/modules/manager/ansible-galaxy/. newBlockRegEx and blockLineRegEx
dropped their unused outer wrapping group (only the inner key/value
groups were ever read) and named the key/value groups; nameMatchRegex's
remaining unused groups (protocol/user-info/port alternatives) become
non-capturing since only source/hostname/depName/version are read via
.groups. Accesses in collections.ts and roles.ts move from
lineMatch[2]/lineMatch[3] to lineMatch.groups!.key/value.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(manager): name capture groups for prefer-named-capture-group (batch 1)

Burns down prefer-named-capture-group violations across the first
alphabetical slice of lib/modules/manager/ (ansible through mix).
Used groups get names with accesses rewritten to match.groups!.<name>
(or $<name> in replacement strings); groups whose value is never read
become non-capturing (?:...). Two String.split() call sites
(git-submodules/extract.ts, meteor/extract.ts) keep the established
"named group still readable positionally from the split() result
array" idiom instead of restructuring the destructuring.

bazel/rules/go.ts and buildpacks/extract.ts dockerRef verified
byte-for-byte equivalent before/after via a quick node script since
several nested groups collapsed to non-capturing at once.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(manager): name capture groups for prefer-named-capture-group (batch 2)

Burns down prefer-named-capture-group violations across the remaining
alphabetical slice of lib/modules/manager/ (npm through terragrunt).
Same treatment as batch 1: used groups get names with accesses moved
to match.groups!.<name> or $<name> replacement strings; unused groups
(wrapping alternations, quantifier repetition groups only consumed via
.test(), or values never read from a match) become non-capturing.

terraform/extractors/others/modules.ts and terragrunt/modules.ts share
near-identical URL-parsing regexes (github/bitbucket/git/azure-devops
ref matchers) — the same set of always-unused `depth=`/`&depth=`
query-string groups is converted to non-capturing in both files.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(config): name capture groups for prefer-named-capture-group

Burns down prefer-named-capture-group violations in lib/config/.
Used groups get names with replacement strings switched from $1/$2 to
$<name>; the unused separator group in schedule-migration.ts's
afterBeforeRegex becomes non-capturing. presets/parse.ts keeps
assigning through the already-declared `repo` variable rather than
array-destructuring the exec() result, matching this file's existing
style for the other named-group regexes just above it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(util): name capture groups for prefer-named-capture-group

Burns down prefer-named-capture-group violations across lib/util/ and
lib/logger/. Same treatment as previous batches: named groups for
values that are read (via $<name> replacement strings, .groups!.<name>,
or destructured from .groups), non-capturing groups where nothing reads
the captured value (e.g. semantic.ts's angular-commit .test()-only
regex). www-authenticate.ts's tokenizer entries each get their own
named group but keep accessing the match generically via match[1],
since a positionally-indexed named group is still readable by index.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(workers): name capture groups for prefer-named-capture-group

Burns down prefer-named-capture-group violations in lib/workers/.
Used groups get names with $<name> replacement strings; unused
wrapper/alternation groups (e.g. semantic-commit-message.ts's optional
scope/issue wrappers, release-notes.ts's date-heading and
horizontal-rule matchers that are only probed with .search()/replaced
wholesale) become non-capturing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* refactor(test,tools): name capture groups for prefer-named-capture-group

Finishes the prefer-named-capture-group burndown: test/, tools/, and
vitest.config.mts. Groups whose value is read get names ($<name>
replacement strings or .groups.<name> access); groups only used via
.test()/.search() or that feed a .match(/…/g) call (whose return value
is the array of whole matches, not captured groups) become
non-capturing.

This is the last remaining slice of pre-existing violations, so the
rule (already enabled at error repo-wide) now passes with zero
findings across the whole codebase.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RxHFNsSworLcv23xXk9Hk

* fix prettier failure

* refactor(lint): use a named capture group in `v8-ignore-no-count`

New rule from main trips the newly enabled `prefer-named-capture-group` oxlint rule.

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-09-03 09:54:40 +00:00

944 lines
28 KiB
TypeScript

import { regEx } from '../../../util/regex.ts';
import { DartVersionDatasource } from '../../datasource/dart-version/index.ts';
import { DockerDatasource } from '../../datasource/docker/index.ts';
import { DotnetVersionDatasource } from '../../datasource/dotnet-version/index.ts';
import { FlutterVersionDatasource } from '../../datasource/flutter-version/index.ts';
import { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';
import { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';
import { HexpmBobDatasource } from '../../datasource/hexpm-bob/index.ts';
import { JavaVersionDatasource } from '../../datasource/java-version/index.ts';
import { NodeVersionDatasource } from '../../datasource/node-version/index.ts';
import { NpmDatasource } from '../../datasource/npm/index.ts';
import { PypiDatasource } from '../../datasource/pypi/index.ts';
import { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';
import { RustVersionDatasource } from '../../datasource/rust-version/index.ts';
import * as regexVersioning from '../../versioning/regex/index.ts';
import * as semverVersioning from '../../versioning/semver/index.ts';
import type { ToolingDefinition } from './types.ts';
const hugoDefinition: ToolingDefinition = {
// This plugin supports the names `hugo` & `gohugo`
asdfPluginUrl: 'https://github.com/NeoHsu/asdf-hugo',
config: (version) => ({
datasource: GithubReleasesDatasource.id,
packageName: 'gohugoio/hugo',
extractVersion: '^v(?<version>\\S+)',
// The asdf hugo plugin supports prefixing the version with
// `extended_`. Extended versions feature Sass support.
currentValue: version.replace(regEx(/^extended_/), ''),
}),
};
export const upgradeableTooling: Record<string, ToolingDefinition> = {
act: {
asdfPluginUrl: 'https://github.com/grimoh/asdf-act.git',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'nektos/act',
extractVersion: '^v(?<version>\\S+)',
},
},
actionlint: {
asdfPluginUrl: 'https://github.com/crazy-matt/asdf-actionlint',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'rhysd/actionlint',
extractVersion: '^v(?<version>\\S+)',
},
},
'adr-tools': {
asdfPluginUrl: 'https://gitlab.com/td7x/asdf/adr-tools.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'npryce/adr-tools',
},
},
apm: {
asdfPluginUrl: 'https://github.com/edwinhern/asdf-apm',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'microsoft/apm',
extractVersion: '^v(?<version>\\S+)',
},
},
argocd: {
asdfPluginUrl: 'https://github.com/beardix/asdf-argocd',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'argoproj/argo-cd',
extractVersion: '^v(?<version>\\S+)',
},
},
'asdf-plugin-manager': {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-plugin-manager',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'asdf-community/asdf-plugin-manager',
extractVersion: '^v(?<version>\\S+)',
},
},
atmos: {
asdfPluginUrl: 'https://github.com/cloudposse/asdf-atmos',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'cloudposse/atmos',
extractVersion: '^v(?<version>\\S+)',
},
},
awscli: {
asdfPluginUrl: 'https://github.com/MetricMike/asdf-awscli',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'aws/aws-cli',
},
},
'azure-cli': {
asdfPluginUrl: 'https://github.com/sourcesense/asdf-azure-cli',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'Azure/azure-cli',
extractVersion: '^azure-cli-(?<version>\\S+)',
},
},
bun: {
asdfPluginUrl: 'https://github.com/cometkim/asdf-bun',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'oven-sh/bun',
extractVersion: '^bun-v(?<version>\\S+)',
},
},
'cargo-make': {
asdfPluginUrl: 'https://github.com/mise-plugins/asdf-cargo-make',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'sagiegurari/cargo-make',
},
},
checkov: {
asdfPluginUrl: 'https://github.com/bosmak/asdf-checkov.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'bridgecrewio/checkov',
},
},
clojure: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-clojure',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'clojure/brew-install',
versioning: `${regexVersioning.id}:^(?<major>\\d+?)\\.(?<minor>\\d+?)\\.(?<patch>\\d+)\\.(?<build>\\d+)$`,
},
},
clusterctl: {
asdfPluginUrl: 'https://github.com/pfnet-research/asdf-clusterctl',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'kubernetes-sigs/cluster-api',
extractVersion: '^v(?<version>\\S+)',
},
},
conftest: {
asdfPluginUrl: 'https://github.com/looztra/asdf-conftest',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'open-policy-agent/conftest',
extractVersion: '^v(?<version>\\S+)',
},
},
'container-structure-test': {
asdfPluginUrl:
'https://github.com/FeryET/asdf-container-structure-test.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'GoogleContainerTools/container-structure-test',
extractVersion: '^v(?<version>\\S+)',
},
},
cookiecutter: {
asdfPluginUrl: 'https://github.com/shawon-crosen/asdf-cookiecutter',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'cookiecutter/cookiecutter',
versioning: semverVersioning.id,
},
},
cosign: {
asdfPluginUrl: 'https://gitlab.com/wt0f/asdf-cosign',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'sigstore/cosign',
extractVersion: '^v(?<version>\\S+)',
},
},
crystal: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-crystal',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'crystal-lang/crystal',
},
},
dart: {
asdfPluginUrl: 'https://github.com/PatOConnor43/asdf-dart',
config: {
datasource: DartVersionDatasource.id,
},
},
deno: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-deno',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'denoland/deno',
extractVersion: '^v(?<version>\\S+)',
},
},
direnv: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-direnv',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'direnv/direnv',
extractVersion: '^v(?<version>\\S+)',
},
},
'dotnet-core': {
asdfPluginUrl: 'https://github.com/emersonsoares/asdf-dotnet-core',
config: {
datasource: DotnetVersionDatasource.id,
packageName: 'dotnet-sdk',
},
},
dprint: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-dprint',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'dprint/dprint',
},
},
ecspresso: {
asdfPluginUrl: 'https://github.com/kayac/asdf-ecspresso',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'kayac/ecspresso',
extractVersion: '^v(?<version>\\S+)',
},
},
'editorconfig-checker': {
asdfPluginUrl: 'https://github.com/gabitchov/asdf-editorconfig-checker',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'editorconfig-checker/editorconfig-checker',
extractVersion: '^v(?<version>\\S+)',
},
},
elixir: {
asdfPluginUrl: 'https://github.com/asdf-vm/asdf-elixir',
config: {
datasource: HexpmBobDatasource.id,
},
},
elm: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-elm',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'elm/compiler',
},
},
erlang: {
asdfPluginUrl: 'https://github.com/asdf-vm/asdf-erlang',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'erlang/otp',
extractVersion: '^OTP-(?<version>\\S+)',
versioning: `${regexVersioning.id}:^(?<major>\\d+?)\\.(?<minor>\\d+?)(\\.(?<patch>\\d+))?$`,
},
},
flutter: {
asdfPluginUrl: 'https://github.com/oae/asdf-flutter',
config: (version) => ({
datasource: FlutterVersionDatasource.id,
// asdf-flutter plugin supports channel on version suffix.
currentValue: version.replace(regEx(/-(?:stable|beta|dev)$/), ''),
}),
},
flux2: {
asdfPluginUrl: 'https://github.com/tablexi/asdf-flux2.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'fluxcd/flux2',
extractVersion: '^v(?<version>.+)',
},
},
gauche: {
asdfPluginUrl: 'https://github.com/sakuro/asdf-gauche',
config: {
datasource: DockerDatasource.id,
packageName: 'practicalscheme/gauche',
},
},
'github-cli': {
asdfPluginUrl: 'https://github.com/bartlomiejdanek/asdf-github-cli.git',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'cli/cli',
extractVersion: '^v(?<version>\\S+)',
},
},
gitleaks: {
asdfPluginUrl: 'https://github.com/jmcvetta/asdf-gitleaks',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'gitleaks/gitleaks',
extractVersion: '^v(?<version>\\S+)',
},
},
ginkgo: {
asdfPluginUrl: 'https://github.com/jimmidyson/asdf-ginkgo',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'onsi/ginkgo',
extractVersion: '^v(?<version>\\S+)',
},
},
gleam: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-gleam.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'gleam-lang/gleam',
extractVersion: '^v(?<version>.+)',
},
},
gohugo: hugoDefinition,
golang: {
asdfPluginUrl: 'https://github.com/kennyp/asdf-golang',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'golang/go',
extractVersion: '^go(?<version>\\S+)',
},
},
'golangci-lint': {
asdfPluginUrl: 'https://github.com/hypnoglow/asdf-golangci-lint.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'golangci/golangci-lint',
extractVersion: '^v(?<version>.+)',
},
},
gomplate: {
asdfPluginUrl: 'https://github.com/sneakybeaky/asdf-gomplate',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'hairyhenderson/gomplate',
extractVersion: '^v(?<version>.+)',
},
},
gotestsum: {
asdfPluginUrl: 'https://github.com/hpcsc/asdf-gotestsum',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'gotestyourself/gotestsum',
extractVersion: '^v(?<version>\\S+)',
},
},
hadolint: {
asdfPluginUrl: 'https://github.com/looztra/asdf-hadolint.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'hadolint/hadolint',
extractVersion: '^v(?<version>.+)',
},
},
haskell: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-haskell',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'ghc/ghc',
extractVersion: '^ghc-(?<version>\\S+?)-release',
},
},
helm: {
asdfPluginUrl: 'https://github.com/Antiarchitect/asdf-helm',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'helm/helm',
extractVersion: '^v(?<version>\\S+)',
},
},
'helm-docs': {
asdfPluginUrl: 'https://github.com/sudermanjr/asdf-helm-docs.git',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'norwoodj/helm-docs',
extractVersion: '^v(?<version>\\S+)',
},
},
helmfile: {
asdfPluginUrl: 'https://github.com/feniix/asdf-helmfile',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'helmfile/helmfile',
extractVersion: '^v(?<version>\\S+)',
},
},
hugo: hugoDefinition,
idris: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-idris',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'idris-lang/Idris-dev',
extractVersion: '^v(?<version>\\S+)',
},
},
istioctl: {
asdfPluginUrl: 'https://github.com/virtualstaticvoid/asdf-istioctl',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'istio/istio',
versioning: semverVersioning.id,
},
},
java: {
asdfPluginUrl: 'https://github.com/halcyon/asdf-java',
config: (version) => {
const adoptOpenJdkMatches = regEx(/^adoptopenjdk-(?<version>\d\S+)/).exec(
version,
)?.groups;
if (adoptOpenJdkMatches) {
return {
datasource: JavaVersionDatasource.id,
packageName: 'java-jdk',
currentValue: adoptOpenJdkMatches.version,
};
}
const adoptOpenJreMatches = regEx(
/^adoptopenjdk-jre-(?<version>\d\S+)/,
).exec(version)?.groups;
if (adoptOpenJreMatches) {
return {
datasource: JavaVersionDatasource.id,
packageName: 'java-jre',
currentValue: adoptOpenJreMatches.version,
};
}
const temurinJdkMatches = regEx(/^temurin-(?<version>\d\S+)/).exec(
version,
)?.groups;
if (temurinJdkMatches) {
return {
datasource: JavaVersionDatasource.id,
packageName: 'java-jdk',
currentValue: temurinJdkMatches.version,
};
}
const temurinJreMatches = regEx(/^temurin-jre-(?<version>\d\S+)/).exec(
version,
)?.groups;
if (temurinJreMatches) {
return {
datasource: JavaVersionDatasource.id,
packageName: 'java-jre',
currentValue: temurinJreMatches.version,
};
}
return undefined;
},
},
julia: {
asdfPluginUrl: 'https://github.com/rkyleg/asdf-julia',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'JuliaLang/julia',
extractVersion: '^v(?<version>\\S+)',
},
},
just: {
asdfPluginUrl: 'https://github.com/olofvndrhr/asdf-just',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'casey/just',
},
},
k3s: {
asdfPluginUrl: 'https://github.com/dmpe/asdf-k3s',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'k3s-io/k3s',
extractVersion: '^v(?<version>\\S+)',
},
},
kind: {
asdfPluginUrl: 'https://github.com/johnlayton/asdf-kind',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'kubernetes-sigs/kind',
extractVersion: '^v(?<version>\\S+)',
},
},
kotlin: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-kotlin',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'JetBrains/kotlin',
extractVersion: '^(Kotlin |v)(?<version>\\S+)',
},
},
kubebuilder: {
asdfPluginUrl: 'https://github.com/virtualstaticvoid/asdf-kubebuilder.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'kubernetes-sigs/kubebuilder',
extractVersion: '^v(?<version>.+)',
},
},
kubectl: {
asdfPluginUrl: 'https://github.com/Banno/asdf-kubectl.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'kubernetes/kubernetes',
extractVersion: '^v(?<version>.+)',
},
},
kubetail: {
asdfPluginUrl: 'https://github.com/janpieper/asdf-kubetail.git',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'johanhaleby/kubetail',
},
},
kustomize: {
asdfPluginUrl: 'https://github.com/Banno/asdf-kustomize',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'kubernetes-sigs/kustomize',
extractVersion: '^kustomize/v(?<version>\\S+)',
},
},
localstack: {
asdfPluginUrl: 'https://github.com/Azulinho/asdf-localstack',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'localstack/localstack',
extractVersion: '^v(?<version>\\S+)',
},
},
lua: {
asdfPluginUrl: 'https://github.com/Stratus3D/asdf-lua',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'lua/lua',
extractVersion: '^v(?<version>\\S+)',
},
},
'markdownlint-cli2': {
asdfPluginUrl:
'https://github.com/paulo-ferraz-oliveira/asdf-markdownlint-cli2',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'DavidAnson/markdownlint-cli2',
extractVersion: '^v(?<version>\\S+)',
},
},
maven: {
asdfPluginUrl: 'https://github.com/halcyon/asdf-maven',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'apache/maven',
},
},
mimirtool: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-mimirtool',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'grafana/mimir',
extractVersion: '^mimir-(?<version>\\S+)',
},
},
minikube: {
asdfPluginUrl: 'https://github.com/alvarobp/asdf-minikube.git',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'kubernetes/minikube',
extractVersion: '^v(?<version>\\S+)',
},
},
mockery: {
asdfPluginUrl: 'https://github.com/cabify/asdf-mockery.git',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'vektra/mockery',
extractVersion: '^v(?<version>\\S+)',
},
},
nim: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-nim',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'nim-lang/Nim',
extractVersion: '^v(?<version>\\S+)',
},
},
nodejs: {
asdfPluginUrl: 'https://github.com/asdf-vm/asdf-nodejs',
config: {
depName: 'node',
datasource: NodeVersionDatasource.id,
},
},
ocaml: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-ocaml',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'ocaml/ocaml',
},
},
oci: {
asdfPluginUrl: 'https://github.com/yasn77/asdf-oci',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'oracle/oci-cli',
extractVersion: '^v(?<version>\\S+)',
},
},
opa: {
asdfPluginUrl: 'https://github.com/tochukwuvictor/asdf-opa',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'open-policy-agent/opa',
extractVersion: '^v(?<version>\\S+)',
},
},
opentofu: {
asdfPluginUrl: 'https://github.com/virtualroot/asdf-opentofu',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'opentofu/opentofu',
extractVersion: '^v(?<version>\\S+)',
},
},
packer: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-hashicorp',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'hashicorp/packer',
extractVersion: '^v(?<version>\\S+)',
},
},
perl: {
asdfPluginUrl: 'https://github.com/ouest/asdf-perl',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'Perl/perl5',
extractVersion: '^v(?<version>\\S+)',
},
},
php: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-php',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'php/php-src',
extractVersion: '^php-(?<version>\\S+)',
},
},
pnpm: {
asdfPluginUrl: 'https://github.com/jonathanmorley/asdf-pnpm',
config: {
datasource: NpmDatasource.id,
packageName: 'pnpm',
versioning: semverVersioning.id,
},
},
poetry: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-poetry',
config: {
datasource: PypiDatasource.id,
packageName: 'poetry',
},
},
'pre-commit': {
asdfPluginUrl: 'https://github.com/jonathanmorley/asdf-pre-commit.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'pre-commit/pre-commit',
extractVersion: '^v(?<version>.+)',
},
},
protoc: {
asdfPluginUrl: 'https://github.com/paxosglobal/asdf-protoc.git',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'protocolbuffers/protobuf',
extractVersion: '^v(?<version>\\S+)',
},
},
pulumi: {
asdfPluginUrl: 'https://github.com/canha/asdf-pulumi.git',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'pulumi/pulumi',
extractVersion: '^v(?<version>\\S+)',
},
},
python: {
asdfPluginUrl: 'https://github.com/danhper/asdf-python',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'python/cpython',
extractVersion: '^v(?<version>\\S+)',
},
},
rebar: {
asdfPluginUrl: 'https://github.com/Stratus3D/asdf-rebar.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'erlang/rebar3',
},
},
ruby: {
asdfPluginUrl: 'https://github.com/asdf-vm/asdf-ruby',
config: {
datasource: RubyVersionDatasource.id,
packageName: 'ruby-version',
versioning: semverVersioning.id,
},
},
rust: {
asdfPluginUrl: 'https://github.com/code-lever/asdf-rust',
config: {
datasource: RustVersionDatasource.id,
packageName: 'rust',
},
},
sbt: {
asdfPluginUrl: 'https://github.com/bram2000/asdf-sbt.git',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'sbt/sbt',
extractVersion: '^v(?<version>\\S+)',
},
},
scala: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-scala',
config: (version) => {
if (version.startsWith('2')) {
return {
datasource: GithubTagsDatasource.id,
packageName: 'scala/scala',
extractVersion: '^v(?<version>\\S+)',
};
}
if (version.startsWith('3')) {
return {
datasource: GithubTagsDatasource.id,
packageName: 'lampepfl/dotty',
};
}
return undefined;
},
},
shellcheck: {
asdfPluginUrl: 'https://github.com/luizm/asdf-shellcheck',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'koalaman/shellcheck',
extractVersion: '^v(?<version>\\S+)',
},
},
shfmt: {
asdfPluginUrl: 'https://github.com/luizm/asdf-shfmt',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'mvdan/sh',
extractVersion: '^v(?<version>\\S+)',
},
},
skaffold: {
asdfPluginUrl: 'https://github.com/nklmilojevic/asdf-skaffold',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'GoogleContainerTools/skaffold',
extractVersion: '^v(?<version>\\S+)',
},
},
sops: {
asdfPluginUrl: 'https://github.com/feniix/asdf-sops',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'mozilla/sops',
extractVersion: '^v(?<version>\\S+)',
},
},
steampipe: {
asdfPluginUrl: 'https://github.com/carnei-ro/asdf-steampipe',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'turbot/steampipe',
extractVersion: '^v(?<version>\\S+)',
},
},
talhelper: {
asdfPluginUrl: 'https://github.com/bjw-s/asdf-talhelper',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'budimanjojo/talhelper',
extractVersion: '^v(?<version>\\S+)',
},
},
talosctl: {
asdfPluginUrl: 'https://github.com/bjw-s/asdf-talosctl',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'siderolabs/talos',
extractVersion: '^v(?<version>\\S+)',
},
},
terraform: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-hashicorp',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'hashicorp/terraform',
extractVersion: '^v(?<version>\\S+)',
},
},
'terraform-docs': {
asdfPluginUrl: 'https://github.com/looztra/asdf-terraform-docs.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'terraform-docs/terraform-docs',
extractVersion: '^v(?<version>.+)',
},
},
terraformer: {
asdfPluginUrl: 'https://github.com/grimoh/asdf-terraformer',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'GoogleCloudPlatform/terraformer',
},
},
terragrunt: {
asdfPluginUrl: 'https://github.com/ohmer/asdf-terragrunt',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'gruntwork-io/terragrunt',
extractVersion: '^v(?<version>\\S+)',
},
},
terramate: {
asdfPluginUrl: 'https://github.com/martinlindner/asdf-terramate',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'terramate-io/terramate',
extractVersion: '^v(?<version>\\S+)',
},
},
tflint: {
asdfPluginUrl: 'https://github.com/skyzyx/asdf-tflint.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'terraform-linters/tflint',
extractVersion: '^v(?<version>.+)',
},
},
tfsec: {
asdfPluginUrl: 'https://github.com/woneill/asdf-tfsec.git',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'aquasecurity/tfsec',
extractVersion: '^v(?<version>.+)',
},
},
trivy: {
asdfPluginUrl: 'https://github.com/zufardhiyaulhaq/asdf-trivy',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'aquasecurity/trivy',
extractVersion: '^v(?<version>\\S+)',
},
},
vault: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-hashicorp',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'hashicorp/vault',
extractVersion: '^v(?<version>\\S+)',
},
},
yamllint: {
asdfPluginUrl: 'https://github.com/ericcornelissen/asdf-yamllint',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'adrienverge/yamllint',
extractVersion: '^v(?<version>\\S+)',
},
},
yq: {
asdfPluginUrl: 'https://github.com/sudermanjr/asdf-yq',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'mikefarah/yq',
extractVersion: '^v(?<version>\\S+)',
},
},
zig: {
asdfPluginUrl: 'https://github.com/cheetah/asdf-zig',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'ziglang/zig',
},
},
maestro: {
asdfPluginUrl: 'https://github.com/dotanuki-labs/asdf-maestro',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'mobile-dev-inc/maestro',
extractVersion: '^cli-(?<version>\\S+)',
},
},
detekt: {
asdfPluginUrl: 'https://github.com/dotanuki-labs/asdf-detekt',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'detekt/detekt',
extractVersion: '^v(?<version>\\S+)',
},
},
ktlint: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-ktlint',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'pinterest/ktlint',
},
},
yamlfmt: {
asdfPluginUrl: 'https://github.com/mise-plugins/asdf-yamlfmt',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'google/yamlfmt',
extractVersion: '^v(?<version>\\S+)',
},
},
tuist: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-tuist',
config: {
datasource: GithubTagsDatasource.id,
packageName: 'tuist/tuist',
},
},
typos: {
asdfPluginUrl: 'https://github.com/aschiavon91/asdf-typos',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'crate-ci/typos',
extractVersion: '^v(?<version>\\S+)',
},
},
uv: {
asdfPluginUrl: 'https://github.com/asdf-community/asdf-uv',
config: {
datasource: GithubReleasesDatasource.id,
packageName: 'astral-sh/uv',
},
},
};