renovate 44.17.0 → 44.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/migrations/custom/ignore-npmrc-file-migration.js +2 -1
- package/dist/config/migrations/custom/ignore-npmrc-file-migration.js.map +1 -1
- package/dist/config/migrations/custom/stability-days-migration.js +1 -3
- package/dist/config/migrations/custom/stability-days-migration.js.map +1 -1
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/secrets.js +2 -1
- package/dist/config/secrets.js.map +1 -1
- package/dist/config/validation.js +1 -3
- package/dist/config/validation.js.map +1 -1
- package/dist/config-validator.js +2 -1
- package/dist/config-validator.js.map +1 -1
- package/dist/expose.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/datasource/artifactory/index.js +2 -1
- package/dist/modules/datasource/artifactory/index.js.map +1 -1
- package/dist/modules/datasource/aws-eks-addon/index.js +2 -1
- package/dist/modules/datasource/aws-eks-addon/index.js.map +1 -1
- package/dist/modules/datasource/aws-machine-image/index.js +3 -2
- package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
- package/dist/modules/datasource/bazel/index.js +2 -1
- package/dist/modules/datasource/bazel/index.js.map +1 -1
- package/dist/modules/datasource/bitbucket-server-tags/index.js +4 -2
- package/dist/modules/datasource/bitbucket-server-tags/index.js.map +1 -1
- package/dist/modules/datasource/bitbucket-tags/index.js +2 -1
- package/dist/modules/datasource/bitbucket-tags/index.js.map +1 -1
- package/dist/modules/datasource/bitrise/index.js +2 -1
- package/dist/modules/datasource/bitrise/index.js.map +1 -1
- package/dist/modules/datasource/common.js +4 -2
- package/dist/modules/datasource/common.js.map +1 -1
- package/dist/modules/datasource/crate/index.js +12 -5
- package/dist/modules/datasource/crate/index.js.map +1 -1
- package/dist/modules/datasource/custom/formats/toml.js +2 -1
- package/dist/modules/datasource/custom/formats/toml.js.map +1 -1
- package/dist/modules/datasource/custom/formats/yaml.js +4 -2
- package/dist/modules/datasource/custom/formats/yaml.js.map +1 -1
- package/dist/modules/datasource/deb/checksum.js +2 -1
- package/dist/modules/datasource/deb/checksum.js.map +1 -1
- package/dist/modules/datasource/deb/packages.js +3 -1
- package/dist/modules/datasource/deb/packages.js.map +1 -1
- package/dist/modules/datasource/deno/index.js +2 -1
- package/dist/modules/datasource/deno/index.js.map +1 -1
- package/dist/modules/datasource/docker/common.js +3 -2
- package/dist/modules/datasource/docker/common.js.map +1 -1
- package/dist/modules/datasource/docker/dockerhub-cache.js +1 -1
- package/dist/modules/datasource/docker/dockerhub-cache.js.map +1 -1
- package/dist/modules/datasource/docker/index.js +11 -10
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/forgejo-tags/index.js +4 -2
- package/dist/modules/datasource/forgejo-tags/index.js.map +1 -1
- package/dist/modules/datasource/galaxy-collection/index.js +5 -3
- package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
- package/dist/modules/datasource/git-refs/base.js +2 -1
- package/dist/modules/datasource/git-refs/base.js.map +1 -1
- package/dist/modules/datasource/git-refs/index.js +1 -1
- package/dist/modules/datasource/git-refs/index.js.map +1 -1
- package/dist/modules/datasource/gitea-tags/index.js +4 -2
- package/dist/modules/datasource/gitea-tags/index.js.map +1 -1
- package/dist/modules/datasource/github-release-attachments/index.js +3 -2
- package/dist/modules/datasource/github-release-attachments/index.js.map +1 -1
- package/dist/modules/datasource/github-tags/index.js +1 -1
- package/dist/modules/datasource/github-tags/index.js.map +1 -1
- package/dist/modules/datasource/gitlab-tags/index.js +2 -1
- package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
- package/dist/modules/datasource/gitlab-tags/util.js +2 -1
- package/dist/modules/datasource/gitlab-tags/util.js.map +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js +8 -5
- package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
- package/dist/modules/datasource/jenkins-plugins/index.js +1 -1
- package/dist/modules/datasource/jenkins-plugins/index.js.map +1 -1
- package/dist/modules/datasource/jsr/index.js +2 -1
- package/dist/modules/datasource/jsr/index.js.map +1 -1
- package/dist/modules/datasource/maven/index.js +3 -2
- package/dist/modules/datasource/maven/index.js.map +1 -1
- package/dist/modules/datasource/maven/util.js +1 -1
- package/dist/modules/datasource/maven/util.js.map +1 -1
- package/dist/modules/datasource/nuget/v2.js +3 -2
- package/dist/modules/datasource/nuget/v2.js.map +1 -1
- package/dist/modules/datasource/nuget/v3.js +9 -5
- package/dist/modules/datasource/nuget/v3.js.map +1 -1
- package/dist/modules/datasource/packagist/index.js +7 -4
- package/dist/modules/datasource/packagist/index.js.map +1 -1
- package/dist/modules/datasource/rpm/providers/common.js +3 -1
- package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
- package/dist/modules/datasource/rpm/repomd.js +2 -1
- package/dist/modules/datasource/rpm/repomd.js.map +1 -1
- package/dist/modules/datasource/ruby-version/index.js +2 -1
- package/dist/modules/datasource/ruby-version/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/metadata-cache.js +1 -1
- package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
- package/dist/modules/datasource/sbt-package/index.js +8 -5
- package/dist/modules/datasource/sbt-package/index.js.map +1 -1
- package/dist/modules/datasource/sbt-package/util.js +2 -1
- package/dist/modules/datasource/sbt-package/util.js.map +1 -1
- package/dist/modules/datasource/terraform-module/index.js +4 -2
- package/dist/modules/datasource/terraform-module/index.js.map +1 -1
- package/dist/modules/datasource/terraform-module/utils.js +2 -1
- package/dist/modules/datasource/terraform-module/utils.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/index.js +2 -1
- package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
- package/dist/modules/datasource/typst/schema.js +4 -2
- package/dist/modules/datasource/typst/schema.js.map +1 -1
- package/dist/modules/manager/ansible-galaxy/collections.js +2 -2
- package/dist/modules/manager/ansible-galaxy/collections.js.map +1 -1
- package/dist/modules/manager/ansible-galaxy/extract.js +5 -3
- package/dist/modules/manager/ansible-galaxy/extract.js.map +1 -1
- package/dist/modules/manager/bazel/artifacts.js +1 -1
- package/dist/modules/manager/bazel/artifacts.js.map +1 -1
- package/dist/modules/manager/bazel/parser.js +1 -1
- package/dist/modules/manager/bazel/parser.js.map +1 -1
- package/dist/modules/manager/bazel/rules/index.js +7 -2
- package/dist/modules/manager/bazel/rules/index.js.map +1 -1
- package/dist/modules/manager/bazel-module/extract.js +2 -1
- package/dist/modules/manager/bazel-module/extract.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/extension-tags.js +3 -2
- package/dist/modules/manager/bazel-module/parser/extension-tags.js.map +1 -1
- package/dist/modules/manager/bazel-module/rules.js +1 -3
- package/dist/modules/manager/bazel-module/rules.js.map +1 -1
- package/dist/modules/manager/bitbucket-pipelines/extract.js +5 -3
- package/dist/modules/manager/bitbucket-pipelines/extract.js.map +1 -1
- package/dist/modules/manager/buildkite/extract.js +1 -1
- package/dist/modules/manager/buildkite/extract.js.map +1 -1
- package/dist/modules/manager/bun/extract.js +2 -1
- package/dist/modules/manager/bun/extract.js.map +1 -1
- package/dist/modules/manager/bundler/artifacts.js +3 -2
- package/dist/modules/manager/bundler/artifacts.js.map +1 -1
- package/dist/modules/manager/cargo/artifacts.js +3 -2
- package/dist/modules/manager/cargo/artifacts.js.map +1 -1
- package/dist/modules/manager/cocoapods/artifacts.js +2 -1
- package/dist/modules/manager/cocoapods/artifacts.js.map +1 -1
- package/dist/modules/manager/composer/update-locked.js +1 -1
- package/dist/modules/manager/composer/update-locked.js.map +1 -1
- package/dist/modules/manager/conan/artifacts.js +4 -2
- package/dist/modules/manager/conan/artifacts.js.map +1 -1
- package/dist/modules/manager/custom/jsonata/index.js +1 -3
- package/dist/modules/manager/custom/jsonata/index.js.map +1 -1
- package/dist/modules/manager/custom/jsonata/utils.js +1 -3
- package/dist/modules/manager/custom/jsonata/utils.js.map +1 -1
- package/dist/modules/manager/custom/regex/index.js +1 -3
- package/dist/modules/manager/custom/regex/index.js.map +1 -1
- package/dist/modules/manager/custom/regex/strategies.js +7 -6
- package/dist/modules/manager/custom/regex/strategies.js.map +1 -1
- package/dist/modules/manager/custom/regex/utils.js +1 -3
- package/dist/modules/manager/custom/regex/utils.js.map +1 -1
- package/dist/modules/manager/docker-compose/extract.js +2 -2
- package/dist/modules/manager/docker-compose/extract.js.map +1 -1
- package/dist/modules/manager/droneci/extract.js +1 -1
- package/dist/modules/manager/droneci/extract.js.map +1 -1
- package/dist/modules/manager/flux/artifacts.js +5 -3
- package/dist/modules/manager/flux/artifacts.js.map +1 -1
- package/dist/modules/manager/flux/extract.js +2 -6
- package/dist/modules/manager/flux/extract.js.map +1 -1
- package/dist/modules/manager/git-submodules/extract.js +5 -4
- package/dist/modules/manager/git-submodules/extract.js.map +1 -1
- package/dist/modules/manager/github-actions/extract.js +2 -1
- package/dist/modules/manager/github-actions/extract.js.map +1 -1
- package/dist/modules/manager/gitlabci/extract.js +1 -1
- package/dist/modules/manager/gitlabci/extract.js.map +1 -1
- package/dist/modules/manager/gitlabci/schema.js +2 -1
- package/dist/modules/manager/gitlabci/schema.js.map +1 -1
- package/dist/modules/manager/gitlabci-include/extract.js +1 -1
- package/dist/modules/manager/gitlabci-include/extract.js.map +1 -1
- package/dist/modules/manager/gleam/artifacts.js +2 -1
- package/dist/modules/manager/gleam/artifacts.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +2 -1
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/artifacts.js +3 -1
- package/dist/modules/manager/gradle/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/extract/catalog.js +3 -1
- package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
- package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js +2 -1
- package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js.map +1 -1
- package/dist/modules/manager/gradle/extract.js +4 -2
- package/dist/modules/manager/gradle/extract.js.map +1 -1
- package/dist/modules/manager/gradle/parser/handlers.js +4 -2
- package/dist/modules/manager/gradle/parser/handlers.js.map +1 -1
- package/dist/modules/manager/gradle/parser/registry-urls.js +3 -2
- package/dist/modules/manager/gradle/parser/registry-urls.js.map +1 -1
- package/dist/modules/manager/gradle-wrapper/utils.js +2 -1
- package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
- package/dist/modules/manager/helm-values/extract.js +1 -1
- package/dist/modules/manager/helm-values/extract.js.map +1 -1
- package/dist/modules/manager/helmfile/utils.js +3 -2
- package/dist/modules/manager/helmfile/utils.js.map +1 -1
- package/dist/modules/manager/helmsman/extract.js +1 -1
- package/dist/modules/manager/helmsman/extract.js.map +1 -1
- package/dist/modules/manager/helmv3/artifacts.js +3 -2
- package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
- package/dist/modules/manager/jenkins/extract.js +1 -1
- package/dist/modules/manager/jenkins/extract.js.map +1 -1
- package/dist/modules/manager/jsonnet-bundler/artifacts.js +1 -1
- package/dist/modules/manager/jsonnet-bundler/artifacts.js.map +1 -1
- package/dist/modules/manager/kustomize/artifacts.js +3 -4
- package/dist/modules/manager/kustomize/artifacts.js.map +1 -1
- package/dist/modules/manager/kustomize/extract.js +1 -1
- package/dist/modules/manager/kustomize/extract.js.map +1 -1
- package/dist/modules/manager/leiningen/extract.js +2 -1
- package/dist/modules/manager/leiningen/extract.js.map +1 -1
- package/dist/modules/manager/maven/extract.js +6 -6
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/maven-wrapper/artifacts.js +4 -1
- package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
- package/dist/modules/manager/meteor/extract.js +1 -1
- package/dist/modules/manager/meteor/extract.js.map +1 -1
- package/dist/modules/manager/mix/artifacts.js +2 -1
- package/dist/modules/manager/mix/artifacts.js.map +1 -1
- package/dist/modules/manager/nix/extract.js +0 -1
- package/dist/modules/manager/nix/extract.js.map +1 -1
- package/dist/modules/manager/npm/artifacts.js +2 -1
- package/dist/modules/manager/npm/artifacts.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/package-file.js +1 -1
- package/dist/modules/manager/npm/extract/common/package-file.js.map +1 -1
- package/dist/modules/manager/npm/extract/pnpm.js +2 -1
- package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/extract/yarn.js +3 -2
- package/dist/modules/manager/npm/extract/yarn.js.map +1 -1
- package/dist/modules/manager/npm/post-update/index.js +9 -7
- package/dist/modules/manager/npm/post-update/index.js.map +1 -1
- package/dist/modules/manager/npm/post-update/npm.js +7 -4
- package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
- package/dist/modules/manager/npm/post-update/pnpm.js +1 -1
- package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js +2 -1
- package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
- package/dist/modules/manager/npm/update/index.js +5 -0
- package/dist/modules/manager/npm/update/index.js.map +1 -0
- package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js.map +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/package-lock/index.js +21 -16
- package/dist/modules/manager/npm/update/locked-dependency/package-lock/index.js.map +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js +2 -2
- package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js.map +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/index.js +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/index.js.map +1 -1
- package/dist/modules/manager/npm/utils.js +3 -3
- package/dist/modules/manager/npm/utils.js.map +1 -1
- package/dist/modules/manager/nuget/artifacts.js +2 -1
- package/dist/modules/manager/nuget/artifacts.js.map +1 -1
- package/dist/modules/manager/nuget/update.js +2 -1
- package/dist/modules/manager/nuget/update.js.map +1 -1
- package/dist/modules/manager/pep621/processors/pdm.js +2 -1
- package/dist/modules/manager/pep621/processors/pdm.js.map +1 -1
- package/dist/modules/manager/pep621/schema.js +2 -1
- package/dist/modules/manager/pep621/schema.js.map +1 -1
- package/dist/modules/manager/pip-compile/artifacts.js +2 -1
- package/dist/modules/manager/pip-compile/artifacts.js.map +1 -1
- package/dist/modules/manager/pip_requirements/artifacts.js +5 -3
- package/dist/modules/manager/pip_requirements/artifacts.js.map +1 -1
- package/dist/modules/manager/pipenv/extract.js +2 -1
- package/dist/modules/manager/pipenv/extract.js.map +1 -1
- package/dist/modules/manager/poetry/artifacts.js +3 -2
- package/dist/modules/manager/poetry/artifacts.js.map +1 -1
- package/dist/modules/manager/poetry/extract.js +2 -1
- package/dist/modules/manager/poetry/extract.js.map +1 -1
- package/dist/modules/manager/pre-commit/extract.js +5 -3
- package/dist/modules/manager/pre-commit/extract.js.map +1 -1
- package/dist/modules/manager/puppet/puppetfile-parser.js +2 -1
- package/dist/modules/manager/puppet/puppetfile-parser.js.map +1 -1
- package/dist/modules/manager/quadlet/extract.js +2 -1
- package/dist/modules/manager/quadlet/extract.js.map +1 -1
- package/dist/modules/manager/sbt/extract.js +1 -1
- package/dist/modules/manager/sbt/extract.js.map +1 -1
- package/dist/modules/manager/swift/extract.js +4 -6
- package/dist/modules/manager/swift/extract.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/index.js +4 -3
- package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
- package/dist/modules/manager/terraform/util.js +2 -1
- package/dist/modules/manager/terraform/util.js.map +1 -1
- package/dist/modules/manager/terragrunt/extract.js +3 -9
- package/dist/modules/manager/terragrunt/extract.js.map +1 -1
- package/dist/modules/manager/tflint-plugin/extract.js +1 -1
- package/dist/modules/manager/tflint-plugin/extract.js.map +1 -1
- package/dist/modules/manager/vendir/artifacts.js +3 -2
- package/dist/modules/manager/vendir/artifacts.js.map +1 -1
- package/dist/modules/platform/azure/index.js +8 -7
- package/dist/modules/platform/azure/index.js.map +1 -1
- package/dist/modules/platform/bitbucket/comments.js +2 -2
- package/dist/modules/platform/bitbucket/comments.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +9 -8
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/index.js +8 -9
- package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
- package/dist/modules/platform/codecommit/codecommit-client.js +8 -5
- package/dist/modules/platform/codecommit/codecommit-client.js.map +1 -1
- package/dist/modules/platform/codecommit/index.js +5 -5
- package/dist/modules/platform/codecommit/index.js.map +1 -1
- package/dist/modules/platform/forgejo/forgejo-helper.js +5 -3
- package/dist/modules/platform/forgejo/forgejo-helper.js.map +1 -1
- package/dist/modules/platform/forgejo/index.js +15 -8
- package/dist/modules/platform/forgejo/index.js.map +1 -1
- package/dist/modules/platform/gerrit/client.js +2 -1
- package/dist/modules/platform/gerrit/client.js.map +1 -1
- package/dist/modules/platform/gerrit/index.js +4 -2
- package/dist/modules/platform/gerrit/index.js.map +1 -1
- package/dist/modules/platform/gerrit/utils.js +1 -1
- package/dist/modules/platform/gerrit/utils.js.map +1 -1
- package/dist/modules/platform/gitea/gitea-helper.js +5 -3
- package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +16 -9
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/github/index.js +27 -24
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/github/massage-markdown-links.js +1 -1
- package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
- package/dist/modules/platform/github/pr.js +1 -1
- package/dist/modules/platform/github/pr.js.map +1 -1
- package/dist/modules/platform/github/schema.js +3 -2
- package/dist/modules/platform/github/schema.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +19 -14
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/local/scm.js +1 -1
- package/dist/modules/platform/local/scm.js.map +1 -1
- package/dist/modules/platform/util.js +2 -1
- package/dist/modules/platform/util.js.map +1 -1
- package/dist/modules/versioning/cargo/index.js +1 -1
- package/dist/modules/versioning/cargo/index.js.map +1 -1
- package/dist/modules/versioning/conan/index.js +4 -2
- package/dist/modules/versioning/conan/index.js.map +1 -1
- package/dist/modules/versioning/nixpkgs/index.js +2 -1
- package/dist/modules/versioning/nixpkgs/index.js.map +1 -1
- package/dist/modules/versioning/nuget/index.js +4 -2
- package/dist/modules/versioning/nuget/index.js.map +1 -1
- package/dist/modules/versioning/nuget/range.js +4 -2
- package/dist/modules/versioning/nuget/range.js.map +1 -1
- package/dist/modules/versioning/pep440/range.js +1 -1
- package/dist/modules/versioning/pep440/range.js.map +1 -1
- package/dist/modules/versioning/perl/index.js +1 -1
- package/dist/modules/versioning/perl/index.js.map +1 -1
- package/dist/modules/versioning/poetry/index.js +2 -2
- package/dist/modules/versioning/poetry/index.js.map +1 -1
- package/dist/modules/versioning/rez/index.js +5 -5
- package/dist/modules/versioning/rez/index.js.map +1 -1
- package/dist/modules/versioning/ruby/strategies/bump.js +3 -2
- package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
- package/dist/modules/versioning/ruby/strategies/replace.js +3 -2
- package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
- package/dist/modules/versioning/ruby/strategies/widen.js +3 -2
- package/dist/modules/versioning/ruby/strategies/widen.js.map +1 -1
- package/dist/util/cache/package/index.js +3 -1
- package/dist/util/cache/package/index.js.map +1 -1
- package/dist/util/cache/package/with-cache.js +7 -4
- package/dist/util/cache/package/with-cache.js.map +1 -1
- package/dist/util/cache/repository/impl/base.js +3 -2
- package/dist/util/cache/repository/impl/base.js.map +1 -1
- package/dist/util/cache/repository/impl/local.js +2 -1
- package/dist/util/cache/repository/impl/local.js.map +1 -1
- package/dist/util/cache/repository/impl/s3.js +4 -1
- package/dist/util/cache/repository/impl/s3.js.map +1 -1
- package/dist/util/date.js +1 -1
- package/dist/util/date.js.map +1 -1
- package/dist/util/emoji.js +6 -2
- package/dist/util/emoji.js.map +1 -1
- package/dist/util/exec/common.js +1 -1
- package/dist/util/exec/common.js.map +1 -1
- package/dist/util/exec/docker/index.js +2 -1
- package/dist/util/exec/docker/index.js.map +1 -1
- package/dist/util/exec/hermit.js +2 -1
- package/dist/util/exec/hermit.js.map +1 -1
- package/dist/util/exec/index.js +1 -1
- package/dist/util/exec/index.js.map +1 -1
- package/dist/util/fs/index.js +2 -1
- package/dist/util/fs/index.js.map +1 -1
- package/dist/util/git/index.js +32 -34
- package/dist/util/git/index.js.map +1 -1
- package/dist/util/git/url.js +2 -3
- package/dist/util/git/url.js.map +1 -1
- package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js +4 -2
- package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js.map +1 -1
- package/dist/util/github/graphql/datasource-fetcher.js +3 -1
- package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
- package/dist/util/http/cache/memory-http-cache-provider.js +2 -1
- package/dist/util/http/cache/memory-http-cache-provider.js.map +1 -1
- package/dist/util/http/github.js +3 -2
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/http.js +2 -1
- package/dist/util/http/http.js.map +1 -1
- package/dist/util/http/index.js +1 -0
- package/dist/util/http/index.js.map +1 -1
- package/dist/util/http/www-authenticate.js +1 -3
- package/dist/util/http/www-authenticate.js.map +1 -1
- package/dist/util/mutex.js +1 -1
- package/dist/util/mutex.js.map +1 -1
- package/dist/util/schema-utils/index.js +1 -1
- package/dist/util/schema-utils/index.js.map +1 -1
- package/dist/util/toml.js +2 -1
- package/dist/util/toml.js.map +1 -1
- package/dist/util/yaml.js +4 -2
- package/dist/util/yaml.js.map +1 -1
- package/dist/workers/global/config/parse/util.js.map +1 -1
- package/dist/workers/global/index.js +2 -2
- package/dist/workers/global/index.js.map +1 -1
- package/dist/workers/repository/changelog/index.js +2 -1
- package/dist/workers/repository/changelog/index.js.map +1 -1
- package/dist/workers/repository/config-migration/branch/rebase.js +2 -1
- package/dist/workers/repository/config-migration/branch/rebase.js.map +1 -1
- package/dist/workers/repository/error-config.js +1 -1
- package/dist/workers/repository/error-config.js.map +1 -1
- package/dist/workers/repository/finalize/prune.js +1 -1
- package/dist/workers/repository/finalize/prune.js.map +1 -1
- package/dist/workers/repository/finalize/repository-statistics.js +1 -4
- package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
- package/dist/workers/repository/index.js +8 -5
- package/dist/workers/repository/index.js.map +1 -1
- package/dist/workers/repository/init/vulnerability.js +1 -1
- package/dist/workers/repository/init/vulnerability.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/config.js +2 -1
- package/dist/workers/repository/onboarding/branch/config.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/create.js +2 -1
- package/dist/workers/repository/onboarding/branch/create.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/index.js +2 -1
- package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
- package/dist/workers/repository/onboarding/pr/index.js +3 -1
- package/dist/workers/repository/onboarding/pr/index.js.map +1 -1
- package/dist/workers/repository/process/lookup/filter-checks.js +2 -1
- package/dist/workers/repository/process/lookup/filter-checks.js.map +1 -1
- package/dist/workers/repository/process/lookup/filter.js +1 -1
- package/dist/workers/repository/process/lookup/filter.js.map +1 -1
- package/dist/workers/repository/process/lookup/generate.js +1 -1
- package/dist/workers/repository/process/lookup/generate.js.map +1 -1
- package/dist/workers/repository/process/lookup/index.js +6 -3
- package/dist/workers/repository/process/lookup/index.js.map +1 -1
- package/dist/workers/repository/process/lookup/rollback.js +1 -1
- package/dist/workers/repository/process/lookup/rollback.js.map +1 -1
- package/dist/workers/repository/process/vulnerabilities.js +2 -1
- package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
- package/dist/workers/repository/process/write.js +8 -4
- package/dist/workers/repository/process/write.js.map +1 -1
- package/dist/workers/repository/reconfigure/validate.js +2 -1
- package/dist/workers/repository/reconfigure/validate.js.map +1 -1
- package/dist/workers/repository/update/branch/auto-replace.js +1 -1
- package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js +2 -1
- package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
- package/dist/workers/repository/update/branch/index.js +3 -1
- package/dist/workers/repository/update/branch/index.js.map +1 -1
- package/dist/workers/repository/update/pr/automerge.js +1 -1
- package/dist/workers/repository/update/pr/automerge.js.map +1 -1
- package/dist/workers/repository/update/pr/body/updates-table.js +1 -1
- package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/github/index.js +2 -1
- package/dist/workers/repository/update/pr/changelog/github/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/github/source.js +2 -1
- package/dist/workers/repository/update/pr/changelog/github/source.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/index.js +1 -1
- package/dist/workers/repository/update/pr/changelog/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +5 -5
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/releases.js +1 -1
- package/dist/workers/repository/update/pr/changelog/releases.js.map +1 -1
- package/dist/workers/repository/update/pr/index.js +6 -3
- package/dist/workers/repository/update/pr/index.js.map +1 -1
- package/dist/workers/repository/update/pr/pr-reuse.js +1 -1
- package/dist/workers/repository/update/pr/pr-reuse.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["awsEksAddonVersioning.id"],"sources":["../../../../lib/modules/datasource/aws-eks-addon/index.ts"],"sourcesContent":["import { DescribeAddonVersionsCommand, EKSClient } from '@aws-sdk/client-eks';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as awsEksAddonVersioning from '../../versioning/aws-eks-addon/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { EksAddonsFilter } from './schema.ts';\n\nexport class AwsEKSAddonDataSource extends Datasource {\n static readonly id = 'aws-eks-addon';\n\n override readonly defaultVersioning = awsEksAddonVersioning.id;\n override readonly caching = true;\n private readonly clients: Record<string, EKSClient> = {};\n\n constructor() {\n super(AwsEKSAddonDataSource.id);\n }\n\n private async _getReleases({\n packageName: serializedFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const res = EksAddonsFilter.safeParse(serializedFilter);\n if (!res.success) {\n logger.warn(\n { err: res.error, serializedFilter },\n 'Error parsing eks-addons config.',\n );\n return null;\n }\n\n const filter = res.data;\n\n const cmd = new DescribeAddonVersionsCommand({\n kubernetesVersion: filter.kubernetesVersion,\n addonName: filter.addonName,\n maxResults: 1,\n });\n const response = await this.getClient(filter).send(cmd);\n const addons = coerceArray(response.addons);\n return {\n releases: addons\n .flatMap((addon) => {\n return addon.addonVersions;\n })\n .filter(isTruthy)\n .map((versionInfo) => ({\n version: versionInfo.addonVersion ?? '',\n default:\n versionInfo.compatibilities?.some((comp) => comp.defaultVersion) ??\n false,\n compatibleWith: versionInfo.compatibilities?.flatMap(\n (comp) => comp.clusterVersion,\n ),\n }))\n .filter((release) => release.version && release.version !== '')\n .filter((release) => {\n if (filter.default) {\n return release.default && release.default === filter.default;\n }\n return true;\n }),\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${AwsEKSAddonDataSource.id}`,\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private getClient({ region, profile }: EksAddonsFilter): EKSClient {\n const cacheKey = `${region ?? 'default'}#${profile ?? 'default'}`;\n if (!(cacheKey in this.clients)) {\n this.clients[cacheKey] = new EKSClient({\n ...(region && { region }),\n credentials: fromNodeProviderChain(profile ? { profile } : undefined),\n });\n }\n return this.clients[cacheKey];\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,wBAAb,MAAa,8BAA8B,WAAW;CACpD,OAAgB,KAAK;CAErB,oBAAsCA;CACtC,UAA4B;CAC5B,UAAsD,CAAC;CAEvD,cAAc;EACZ,MAAM,sBAAsB,EAAE;CAChC;CAEA,MAAc,aAAa,EACzB,aAAa,oBACsC;EACnD,MAAM,MAAM,gBAAgB,UAAU,gBAAgB;EACtD,IAAI,CAAC,IAAI,SAAS;GAChB,OAAO,KACL;IAAE,KAAK,IAAI;IAAO;GAAiB,GACnC,kCACF;GACA,OAAO;EACT;EAEA,MAAM,SAAS,IAAI;EAEnB,MAAM,MAAM,IAAI,6BAA6B;GAC3C,mBAAmB,OAAO;GAC1B,WAAW,OAAO;GAClB,YAAY;EACd,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","names":["awsEksAddonVersioning.id"],"sources":["../../../../lib/modules/datasource/aws-eks-addon/index.ts"],"sourcesContent":["import { DescribeAddonVersionsCommand, EKSClient } from '@aws-sdk/client-eks';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as awsEksAddonVersioning from '../../versioning/aws-eks-addon/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { EksAddonsFilter } from './schema.ts';\n\nexport class AwsEKSAddonDataSource extends Datasource {\n static readonly id = 'aws-eks-addon';\n\n override readonly defaultVersioning = awsEksAddonVersioning.id;\n override readonly caching = true;\n private readonly clients: Record<string, EKSClient> = {};\n\n constructor() {\n super(AwsEKSAddonDataSource.id);\n }\n\n private async _getReleases({\n packageName: serializedFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const res = EksAddonsFilter.safeParse(serializedFilter);\n if (!res.success) {\n logger.warn(\n { err: res.error, serializedFilter },\n 'Error parsing eks-addons config.',\n );\n return null;\n }\n\n const filter = res.data;\n\n const cmd = new DescribeAddonVersionsCommand({\n kubernetesVersion: filter.kubernetesVersion,\n addonName: filter.addonName,\n maxResults: 1,\n });\n const response = await this.getClient(filter).send(cmd);\n const addons = coerceArray(response.addons);\n return {\n releases: addons\n .flatMap((addon) => {\n return addon.addonVersions;\n })\n .filter(isTruthy)\n .map((versionInfo) => ({\n version: versionInfo.addonVersion ?? '',\n default:\n versionInfo.compatibilities?.some((comp) => comp.defaultVersion) ??\n false,\n compatibleWith: versionInfo.compatibilities?.flatMap(\n (comp) => comp.clusterVersion,\n ),\n }))\n .filter((release) => release.version && release.version !== '')\n .filter((release) => {\n if (filter.default) {\n return release.default && release.default === filter.default;\n }\n return true;\n }),\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${AwsEKSAddonDataSource.id}`,\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private getClient({ region, profile }: EksAddonsFilter): EKSClient {\n const cacheKey = `${region ?? 'default'}#${profile ?? 'default'}`;\n if (!(cacheKey in this.clients)) {\n this.clients[cacheKey] = new EKSClient({\n ...(region && { region }),\n credentials: fromNodeProviderChain(profile ? { profile } : undefined),\n });\n }\n return this.clients[cacheKey];\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,wBAAb,MAAa,8BAA8B,WAAW;CACpD,OAAgB,KAAK;CAErB,oBAAsCA;CACtC,UAA4B;CAC5B,UAAsD,CAAC;CAEvD,cAAc;EACZ,MAAM,sBAAsB,EAAE;CAChC;CAEA,MAAc,aAAa,EACzB,aAAa,oBACsC;EACnD,MAAM,MAAM,gBAAgB,UAAU,gBAAgB;EACtD,IAAI,CAAC,IAAI,SAAS;GAChB,OAAO,KACL;IAAE,KAAK,IAAI;IAAO;GAAiB,GACnC,kCACF;GACA,OAAO;EACT;EAEA,MAAM,SAAS,IAAI;EAEnB,MAAM,MAAM,IAAI,6BAA6B;GAC3C,mBAAmB,OAAO;GAC1B,WAAW,OAAO;GAClB,YAAY;EACd,CAAC;EACD,MAAM,WAAW,MAAM,KAAK,UAAU,MAAM,CAAC,CAAC,KAAK,GAAG;EAEtD,OAAO,EACL,UAFa,YAAY,SAAS,MAEnB,CAAC,CACb,SAAS,UAAU;GAClB,OAAO,MAAM;EACf,CAAC,CAAC,CACD,OAAO,QAAQ,CAAC,CAChB,KAAK,iBAAiB;GACrB,SAAS,YAAY,gBAAgB;GACrC,SACE,YAAY,iBAAiB,MAAM,SAAS,KAAK,cAAc,KAC/D;GACF,gBAAgB,YAAY,iBAAiB,SAC1C,SAAS,KAAK,cACjB;EACF,EAAE,CAAC,CACF,QAAQ,YAAY,QAAQ,WAAW,QAAQ,YAAY,EAAE,CAAC,CAC9D,QAAQ,YAAY;GACnB,IAAI,OAAO,SACT,OAAO,QAAQ,WAAW,QAAQ,YAAY,OAAO;GAEvD,OAAO;EACT,CAAC,EACL;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,sBAAsB;GAC/C,KAAK,eAAe,OAAO;GAC3B,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,UAAkB,EAAE,QAAQ,WAAuC;EACjE,MAAM,WAAW,GAAG,UAAU,UAAU,GAAG,WAAW;EACtD,IAAI,EAAE,YAAY,KAAK,UACrB,KAAK,QAAQ,YAAY,IAAI,UAAU;GACrC,GAAI,UAAU,EAAE,OAAO;GACvB,aAAa,sBAAsB,UAAU,EAAE,QAAQ,IAAI,KAAA,CAAS;EACtE,CAAC;EAEH,OAAO,KAAK,QAAQ;CACtB;AACF"}
|
|
@@ -59,7 +59,7 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
|
|
|
59
59
|
const matchingImages = await this.getEC2Client(clientConfig).send(amiFilterCmd);
|
|
60
60
|
matchingImages.Images = matchingImages.Images ?? [];
|
|
61
61
|
return matchingImages.Images.sort((image1, image2) => {
|
|
62
|
-
return (image1.CreationDate ? Date.parse(image1.CreationDate) :
|
|
62
|
+
return (image1.CreationDate ? Date.parse(image1.CreationDate) : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0) - (image2.CreationDate ? Date.parse(image2.CreationDate) : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0);
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
65
|
getSortedAwsMachineImages(serializedAmiFilter) {
|
|
@@ -76,7 +76,8 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
|
|
|
76
76
|
if (newValueMatchingImages.length === 1 && newValueMatchingImages[0].Name) return newValueMatchingImages[0].Name;
|
|
77
77
|
return null;
|
|
78
78
|
}
|
|
79
|
-
return (await this.getReleases({ packageName: serializedAmiFilter }))?.releases?.[0]?.newDigest ??
|
|
79
|
+
return (await this.getReleases({ packageName: serializedAmiFilter }))?.releases?.[0]?.newDigest ??
|
|
80
|
+
/* v8 ignore next -- fallback when the AMI filter matches no image */ null;
|
|
80
81
|
}
|
|
81
82
|
getDigest(config, newValue) {
|
|
82
83
|
return withCache({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["amazonMachineImageVersioning.id","hostRules.find"],"sources":["../../../../lib/modules/datasource/aws-machine-image/index.ts"],"sourcesContent":["import type { Filter, Image } from '@aws-sdk/client-ec2';\nimport { DescribeImagesCommand, EC2Client } from '@aws-sdk/client-ec2';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as amazonMachineImageVersioning from '../../versioning/aws-machine-image/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { AwsClientConfig, ParsedConfig } from './types.ts';\n\nexport class AwsMachineImageDatasource extends Datasource {\n static readonly id = 'aws-machine-image';\n\n override readonly defaultVersioning = amazonMachineImageVersioning.id;\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `CreationDate` field in the results.';\n\n override readonly defaultConfig = {\n // Because AMIs don't follow any versioning scheme, we override commitMessageExtra to remove the 'v'\n commitMessageExtra: 'to {{{newVersion}}}',\n prBodyColumns: ['Change', 'Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n digest: {\n // Because newDigestShort will allways be 'amazon-' we override to print the name of the AMI\n commitMessageExtra: 'to {{{newDigest}}}',\n prBodyColumns: ['Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n },\n };\n\n private readonly now: number;\n\n constructor() {\n super(AwsMachineImageDatasource.id);\n this.now = Date.now();\n }\n\n private isAmiFilter(config: Filter | AwsClientConfig): config is Filter {\n return 'Name' in config && 'Values' in config;\n }\n\n private getEC2Client(config: AwsClientConfig): EC2Client {\n const { profile, region } = config;\n const { password, token, username } = hostRules.find({\n hostType: AwsMachineImageDatasource.id,\n });\n return new EC2Client({\n region,\n credentials:\n username && password\n ? {\n accessKeyId: username,\n secretAccessKey: password,\n sessionToken: token,\n }\n : fromNodeProviderChain({ profile }),\n });\n }\n\n private getAmiFilterCommand(filter: Filter[]): DescribeImagesCommand {\n return new DescribeImagesCommand({\n Filters: filter,\n });\n }\n\n loadConfig(serializedAmiFilter: string): [Filter[], AwsClientConfig] {\n const parsedConfig: ParsedConfig = JSON.parse(serializedAmiFilter);\n const filters = [];\n let config = {};\n for (const elem of parsedConfig) {\n if (this.isAmiFilter(elem)) {\n // Separate actual AMI filters from aws client config\n filters.push(elem);\n } else {\n // merge config objects if there are multiple\n config = Object.assign(config, elem);\n }\n }\n return [filters, config];\n }\n\n private async _getSortedAwsMachineImages(\n serializedAmiFilter: string,\n ): Promise<Image[]> {\n const [amiFilter, clientConfig] = this.loadConfig(serializedAmiFilter);\n const amiFilterCmd = this.getAmiFilterCommand(amiFilter);\n const ec2Client = this.getEC2Client(clientConfig);\n const matchingImages = await ec2Client.send(amiFilterCmd);\n matchingImages.Images = matchingImages.Images ?? [];\n return matchingImages.Images.sort((image1, image2) => {\n const ts1 = image1.CreationDate\n ? Date.parse(image1.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n\n const ts2 = image2.CreationDate\n ? Date.parse(image2.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n return ts1 - ts2;\n });\n }\n\n getSortedAwsMachineImages(serializedAmiFilter: string): Promise<Image[]> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getSortedAwsMachineImages:${serializedAmiFilter}`,\n },\n () => this._getSortedAwsMachineImages(serializedAmiFilter),\n );\n }\n\n private async _getDigest(\n { packageName: serializedAmiFilter }: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n if (images.length < 1) {\n return null;\n }\n\n if (newValue) {\n const newValueMatchingImages = images.filter(\n (image) => image.ImageId === newValue,\n );\n if (\n newValueMatchingImages.length === 1 &&\n newValueMatchingImages[0].Name\n ) {\n return newValueMatchingImages[0].Name;\n }\n return null;\n }\n\n const res = await this.getReleases({ packageName: serializedAmiFilter });\n return (\n res?.releases?.[0]?.newDigest ??\n /* v8 ignore next -- fallback when the AMI filter matches no image */ null\n ); // TODO: needs test\n }\n\n override getDigest(\n config: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getDigest:${config.packageName}:${newValue ?? ''}`,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n private async _getReleases({\n packageName: serializedAmiFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n const latestImage = images.at(-1);\n if (!latestImage?.ImageId) {\n return null;\n }\n return {\n releases: [\n {\n version: latestImage.ImageId,\n releaseTimestamp: asTimestamp(latestImage.CreationDate),\n isDeprecated:\n Date.parse(latestImage.DeprecationTime ?? this.now.toString()) <\n this.now,\n newDigest: latestImage.Name,\n },\n ],\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;AAWA,IAAa,4BAAb,MAAa,kCAAkC,WAAW;CACxD,OAAgB,KAAK;CAErB,oBAAsCA;CAEtC,UAA4B;CAE5B,0BAA4C;CAC5C,uBACE;CAEF,gBAAkC;EAEhC,oBAAoB;EACpB,eAAe,CAAC,UAAU,OAAO;EACjC,mBAAmB,EACjB,OAAO,wBACT;EACA,QAAQ;GAEN,oBAAoB;GACpB,eAAe,CAAC,OAAO;GACvB,mBAAmB,EACjB,OAAO,wBACT;EACF;CACF;CAEA;CAEA,cAAc;EACZ,MAAM,0BAA0B,EAAE;EAClC,KAAK,MAAM,KAAK,IAAI;CACtB;CAEA,YAAoB,QAAoD;EACtE,OAAO,UAAU,UAAU,YAAY;CACzC;CAEA,aAAqB,QAAoC;EACvD,MAAM,EAAE,SAAS,WAAW;EAC5B,MAAM,EAAE,UAAU,OAAO,aAAaC,KAAe,EACnD,UAAU,0BAA0B,GACtC,CAAC;EACD,OAAO,IAAI,UAAU;GACnB;GACA,aACE,YAAY,WACR;IACE,aAAa;IACb,iBAAiB;IACjB,cAAc;GAChB,IACA,sBAAsB,EAAE,QAAQ,CAAC;EACzC,CAAC;CACH;CAEA,oBAA4B,QAAyC;EACnE,OAAO,IAAI,sBAAsB,EAC/B,SAAS,OACX,CAAC;CACH;CAEA,WAAW,qBAA0D;EACnE,MAAM,eAA6B,KAAK,MAAM,mBAAmB;EACjE,MAAM,UAAU,CAAC;EACjB,IAAI,SAAS,CAAC;EACd,KAAK,MAAM,QAAQ,cACjB,IAAI,KAAK,YAAY,IAAI,GAEvB,QAAQ,KAAK,IAAI;OAGjB,SAAS,OAAO,OAAO,QAAQ,IAAI;EAGvC,OAAO,CAAC,SAAS,MAAM;CACzB;CAEA,MAAc,2BACZ,qBACkB;EAClB,MAAM,CAAC,WAAW,gBAAgB,KAAK,WAAW,mBAAmB;EACrE,MAAM,eAAe,KAAK,oBAAoB,SAAS;EAEvD,MAAM,iBAAiB,MADL,KAAK,aAAa,YACC,CAAC,CAAC,KAAK,YAAY;EACxD,eAAe,SAAS,eAAe,UAAU,CAAC;EAClD,OAAO,eAAe,OAAO,MAAM,QAAQ,WAAW;GAQpD,QAPY,OAAO,eACf,KAAK,MAAM,OAAO,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","names":["amazonMachineImageVersioning.id","hostRules.find"],"sources":["../../../../lib/modules/datasource/aws-machine-image/index.ts"],"sourcesContent":["import type { Filter, Image } from '@aws-sdk/client-ec2';\nimport { DescribeImagesCommand, EC2Client } from '@aws-sdk/client-ec2';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as amazonMachineImageVersioning from '../../versioning/aws-machine-image/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { AwsClientConfig, ParsedConfig } from './types.ts';\n\nexport class AwsMachineImageDatasource extends Datasource {\n static readonly id = 'aws-machine-image';\n\n override readonly defaultVersioning = amazonMachineImageVersioning.id;\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `CreationDate` field in the results.';\n\n override readonly defaultConfig = {\n // Because AMIs don't follow any versioning scheme, we override commitMessageExtra to remove the 'v'\n commitMessageExtra: 'to {{{newVersion}}}',\n prBodyColumns: ['Change', 'Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n digest: {\n // Because newDigestShort will allways be 'amazon-' we override to print the name of the AMI\n commitMessageExtra: 'to {{{newDigest}}}',\n prBodyColumns: ['Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n },\n };\n\n private readonly now: number;\n\n constructor() {\n super(AwsMachineImageDatasource.id);\n this.now = Date.now();\n }\n\n private isAmiFilter(config: Filter | AwsClientConfig): config is Filter {\n return 'Name' in config && 'Values' in config;\n }\n\n private getEC2Client(config: AwsClientConfig): EC2Client {\n const { profile, region } = config;\n const { password, token, username } = hostRules.find({\n hostType: AwsMachineImageDatasource.id,\n });\n return new EC2Client({\n region,\n credentials:\n username && password\n ? {\n accessKeyId: username,\n secretAccessKey: password,\n sessionToken: token,\n }\n : fromNodeProviderChain({ profile }),\n });\n }\n\n private getAmiFilterCommand(filter: Filter[]): DescribeImagesCommand {\n return new DescribeImagesCommand({\n Filters: filter,\n });\n }\n\n loadConfig(serializedAmiFilter: string): [Filter[], AwsClientConfig] {\n const parsedConfig: ParsedConfig = JSON.parse(serializedAmiFilter);\n const filters = [];\n let config = {};\n for (const elem of parsedConfig) {\n if (this.isAmiFilter(elem)) {\n // Separate actual AMI filters from aws client config\n filters.push(elem);\n } else {\n // merge config objects if there are multiple\n config = Object.assign(config, elem);\n }\n }\n return [filters, config];\n }\n\n private async _getSortedAwsMachineImages(\n serializedAmiFilter: string,\n ): Promise<Image[]> {\n const [amiFilter, clientConfig] = this.loadConfig(serializedAmiFilter);\n const amiFilterCmd = this.getAmiFilterCommand(amiFilter);\n const ec2Client = this.getEC2Client(clientConfig);\n const matchingImages = await ec2Client.send(amiFilterCmd);\n matchingImages.Images = matchingImages.Images ?? [];\n return matchingImages.Images.sort((image1, image2) => {\n const ts1 = image1.CreationDate\n ? Date.parse(image1.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n\n const ts2 = image2.CreationDate\n ? Date.parse(image2.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n return ts1 - ts2;\n });\n }\n\n getSortedAwsMachineImages(serializedAmiFilter: string): Promise<Image[]> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getSortedAwsMachineImages:${serializedAmiFilter}`,\n },\n () => this._getSortedAwsMachineImages(serializedAmiFilter),\n );\n }\n\n private async _getDigest(\n { packageName: serializedAmiFilter }: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n if (images.length < 1) {\n return null;\n }\n\n if (newValue) {\n const newValueMatchingImages = images.filter(\n (image) => image.ImageId === newValue,\n );\n if (\n newValueMatchingImages.length === 1 &&\n newValueMatchingImages[0].Name\n ) {\n return newValueMatchingImages[0].Name;\n }\n return null;\n }\n\n const res = await this.getReleases({ packageName: serializedAmiFilter });\n return (\n res?.releases?.[0]?.newDigest ??\n /* v8 ignore next -- fallback when the AMI filter matches no image */ null\n ); // TODO: needs test\n }\n\n override getDigest(\n config: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getDigest:${config.packageName}:${newValue ?? ''}`,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n private async _getReleases({\n packageName: serializedAmiFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n const latestImage = images.at(-1);\n if (!latestImage?.ImageId) {\n return null;\n }\n return {\n releases: [\n {\n version: latestImage.ImageId,\n releaseTimestamp: asTimestamp(latestImage.CreationDate),\n isDeprecated:\n Date.parse(latestImage.DeprecationTime ?? this.now.toString()) <\n this.now,\n newDigest: latestImage.Name,\n },\n ],\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -26,7 +26,8 @@ var BazelDatasource = class BazelDatasource extends Datasource {
|
|
|
26
26
|
super(BazelDatasource.id);
|
|
27
27
|
}
|
|
28
28
|
async _getReleases({ registryUrl, packageName }) {
|
|
29
|
-
const
|
|
29
|
+
const path = BazelDatasource.packageMetadataPath(packageName);
|
|
30
|
+
const url = joinUrlParts(registryUrl, path);
|
|
30
31
|
const result = { releases: [] };
|
|
31
32
|
try {
|
|
32
33
|
let metadata;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["bazelVersioningId","HttpError"],"sources":["../../../../lib/modules/datasource/bazel/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { isValidLocalPath, readLocalFile } from '../../../util/fs/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { Json } from '../../../util/schema-utils/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { BzlmodVersion } from '../../versioning/bazel-module/bzlmod-version.ts';\nimport { id as bazelVersioningId } from '../../versioning/bazel-module/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BazelModuleMetadata } from './schema.ts';\n\nexport class BazelDatasource extends Datasource {\n static readonly id = 'bazel';\n\n static readonly bazelCentralRepoUrl =\n 'https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main';\n\n override readonly defaultRegistryUrls = [BazelDatasource.bazelCentralRepoUrl];\n override readonly registryStrategy = 'hunt';\n override readonly customRegistrySupport = true;\n override readonly caching = true;\n override readonly defaultVersioning = bazelVersioningId;\n\n static packageMetadataPath(packageName: string): string {\n return `/modules/${packageName}/metadata.json`;\n }\n\n constructor() {\n super(BazelDatasource.id);\n }\n\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const path = BazelDatasource.packageMetadataPath(packageName);\n const url = joinUrlParts(registryUrl!, path);\n const result: ReleaseResult = { releases: [] };\n try {\n let metadata: BazelModuleMetadata;\n const FILE_PREFIX = 'file://';\n if (url.startsWith(FILE_PREFIX)) {\n const filePath = url.slice(FILE_PREFIX.length);\n if (!isValidLocalPath(filePath)) {\n return null;\n }\n const fileContent = await readLocalFile(filePath, 'utf8');\n if (!fileContent) {\n return null;\n }\n metadata = Json.pipe(BazelModuleMetadata).parse(fileContent);\n } else {\n const response = await this.http.getJson(url, BazelModuleMetadata);\n metadata = response.body;\n }\n\n result.releases = metadata.versions\n .map((v) => new BzlmodVersion(v))\n .sort(BzlmodVersion.defaultCompare)\n .map((bv) => {\n const release: Release = { version: bv.original };\n if (isTruthy(metadata.yanked_versions?.[bv.original])) {\n release.isDeprecated = true;\n }\n return release;\n });\n if (metadata.homepage) {\n result.homepage = metadata.homepage;\n }\n } catch (err) {\n if (err instanceof HttpError) {\n if (err.response?.statusCode === 404) {\n return null;\n }\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BazelDatasource.id}`,\n key: `${config.registryUrl!}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,OAAgB,sBACd;CAEF,sBAAwC,CAAC,gBAAgB,mBAAmB;CAC5E,mBAAqC;CACrC,wBAA0C;CAC1C,UAA4B;CAC5B,oBAAsCA;CAEtC,OAAO,oBAAoB,aAA6B;EACtD,OAAO,YAAY,YAAY;CACjC;CAEA,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;
|
|
1
|
+
{"version":3,"file":"index.js","names":["bazelVersioningId","HttpError"],"sources":["../../../../lib/modules/datasource/bazel/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { isValidLocalPath, readLocalFile } from '../../../util/fs/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { Json } from '../../../util/schema-utils/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { BzlmodVersion } from '../../versioning/bazel-module/bzlmod-version.ts';\nimport { id as bazelVersioningId } from '../../versioning/bazel-module/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BazelModuleMetadata } from './schema.ts';\n\nexport class BazelDatasource extends Datasource {\n static readonly id = 'bazel';\n\n static readonly bazelCentralRepoUrl =\n 'https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main';\n\n override readonly defaultRegistryUrls = [BazelDatasource.bazelCentralRepoUrl];\n override readonly registryStrategy = 'hunt';\n override readonly customRegistrySupport = true;\n override readonly caching = true;\n override readonly defaultVersioning = bazelVersioningId;\n\n static packageMetadataPath(packageName: string): string {\n return `/modules/${packageName}/metadata.json`;\n }\n\n constructor() {\n super(BazelDatasource.id);\n }\n\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const path = BazelDatasource.packageMetadataPath(packageName);\n const url = joinUrlParts(registryUrl!, path);\n const result: ReleaseResult = { releases: [] };\n try {\n let metadata: BazelModuleMetadata;\n const FILE_PREFIX = 'file://';\n if (url.startsWith(FILE_PREFIX)) {\n const filePath = url.slice(FILE_PREFIX.length);\n if (!isValidLocalPath(filePath)) {\n return null;\n }\n const fileContent = await readLocalFile(filePath, 'utf8');\n if (!fileContent) {\n return null;\n }\n metadata = Json.pipe(BazelModuleMetadata).parse(fileContent);\n } else {\n const response = await this.http.getJson(url, BazelModuleMetadata);\n metadata = response.body;\n }\n\n result.releases = metadata.versions\n .map((v) => new BzlmodVersion(v))\n .sort(BzlmodVersion.defaultCompare)\n .map((bv) => {\n const release: Release = { version: bv.original };\n if (isTruthy(metadata.yanked_versions?.[bv.original])) {\n release.isDeprecated = true;\n }\n return release;\n });\n if (metadata.homepage) {\n result.homepage = metadata.homepage;\n }\n } catch (err) {\n if (err instanceof HttpError) {\n if (err.response?.statusCode === 404) {\n return null;\n }\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BazelDatasource.id}`,\n key: `${config.registryUrl!}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,OAAgB,sBACd;CAEF,sBAAwC,CAAC,gBAAgB,mBAAmB;CAC5E,mBAAqC;CACrC,wBAA0C;CAC1C,UAA4B;CAC5B,oBAAsCA;CAEtC,OAAO,oBAAoB,aAA6B;EACtD,OAAO,YAAY,YAAY;CACjC;CAEA,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,OAAO,gBAAgB,oBAAoB,WAAW;EAC5D,MAAM,MAAM,aAAa,aAAc,IAAI;EAC3C,MAAM,SAAwB,EAAE,UAAU,CAAC,EAAE;EAC7C,IAAI;GACF,IAAI;GAEJ,IAAI,IAAI,WAAW,SAAW,GAAG;IAC/B,MAAM,WAAW,IAAI,MAAM,CAAkB;IAC7C,IAAI,CAAC,iBAAiB,QAAQ,GAC5B,OAAO;IAET,MAAM,cAAc,MAAM,cAAc,UAAU,MAAM;IACxD,IAAI,CAAC,aACH,OAAO;IAET,WAAW,KAAK,KAAK,mBAAmB,CAAC,CAAC,MAAM,WAAW;GAC7D,OAEE,YAAW,MADY,KAAK,KAAK,QAAQ,KAAK,mBAAmB,EAAA,CAC7C;GAGtB,OAAO,WAAW,SAAS,SACxB,KAAK,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAChC,KAAK,cAAc,cAAc,CAAC,CAClC,KAAK,OAAO;IACX,MAAM,UAAmB,EAAE,SAAS,GAAG,SAAS;IAChD,IAAI,SAAS,SAAS,kBAAkB,GAAG,SAAS,GAClD,QAAQ,eAAe;IAEzB,OAAO;GACT,CAAC;GACH,IAAI,SAAS,UACX,OAAO,WAAW,SAAS;EAE/B,SAAS,KAAK;GACZ,IAAI,eAAeC,cAAW;IAC5B,IAAI,IAAI,UAAU,eAAe,KAC/B,OAAO;IAET,MAAM,IAAI,kBAAkB,GAAG;GACjC;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,GAAG,OAAO,YAAa,GAAG,OAAO;GACtC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
|
|
@@ -22,10 +22,12 @@ var BitbucketServerTagsDatasource = class BitbucketServerTagsDatasource extends
|
|
|
22
22
|
return registryUrl?.replace(regEx(/\/rest\/api\/1.0$/), "");
|
|
23
23
|
}
|
|
24
24
|
static getSourceUrl(projectKey, repositorySlug, registryUrl) {
|
|
25
|
-
|
|
25
|
+
const url = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);
|
|
26
|
+
return `${ensureTrailingSlash(url)}projects/${projectKey}/repos/${repositorySlug}`;
|
|
26
27
|
}
|
|
27
28
|
static getApiUrl(registryUrl) {
|
|
28
|
-
|
|
29
|
+
const res = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);
|
|
30
|
+
return `${ensureTrailingSlash(res)}rest/api/1.0/`;
|
|
29
31
|
}
|
|
30
32
|
static getCacheKey(registryUrl, repo, type) {
|
|
31
33
|
return `${BitbucketServerTagsDatasource.getRegistryURL(registryUrl ?? "")}:${repo}:${type}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-server-tags/index.ts"],"sourcesContent":["import { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketServerHttp } from '../../../util/http/bitbucket-server.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport { DigestsConfig, ReleasesConfig } from '../schema.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport {\n BitbucketServerCommits,\n BitbucketServerTag,\n BitbucketServerTags,\n} from './schema.ts';\n\nexport class BitbucketServerTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-server-tags';\n\n override http = new BitbucketServerHttp(BitbucketServerTagsDatasource.id);\n\n static readonly sourceUrlSupport = 'package';\n static readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketServerTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketServerTagsDatasource.id);\n }\n\n static getRegistryURL(registryUrl: string): string {\n return registryUrl?.replace(regEx(/\\/rest\\/api\\/1.0$/), '');\n }\n\n static getSourceUrl(\n projectKey: string,\n repositorySlug: string,\n registryUrl: string,\n ): string {\n const url = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);\n return `${ensureTrailingSlash(url)}projects/${projectKey}/repos/${repositorySlug}`;\n }\n\n static getApiUrl(registryUrl: string): string {\n const res = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);\n return `${ensureTrailingSlash(res)}rest/api/1.0/`;\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketServerTagsDatasource.getRegistryURL(registryUrl ?? '')}:${repo}:${type}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { registryUrl, packageName } = config;\n const [projectKey, repositorySlug] = packageName.split('/');\n if (!registryUrl) {\n logger.debug('Missing registryUrl');\n return null;\n }\n\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ registryUrl }) => {\n const url = `${BitbucketServerTagsDatasource.getApiUrl(registryUrl)}projects/${projectKey}/repos/${repositorySlug}/tags`;\n\n return this.http.getJsonSafe(\n url,\n { paginate: true },\n BitbucketServerTags,\n );\n })\n .transform((tags) =>\n tags.map(({ displayId, hash }) => ({\n version: displayId,\n gitRef: displayId,\n newDigest: hash ?? undefined,\n })),\n )\n .transform((versions): ReleaseResult => {\n return {\n sourceUrl: BitbucketServerTagsDatasource.getSourceUrl(\n projectKey,\n repositorySlug,\n registryUrl,\n ),\n registryUrl:\n BitbucketServerTagsDatasource.getRegistryURL(registryUrl),\n releases: versions,\n };\n });\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'bitbucket-server-tags: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetches the commit hash for the specified tag\n private async _getTagCommit(\n baseUrl: string,\n tag: string,\n ): Promise<string | null> {\n const bitbucketServerTag = (\n await this.http.getJson(`${baseUrl}/tags/${tag}`, BitbucketServerTag)\n ).body;\n\n return bitbucketServerTag.hash ?? null;\n }\n\n getTagCommit(\n baseUrl: string,\n tag: string,\n config: DigestConfig,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(baseUrl, tag),\n );\n }\n\n // getDigest fetches the latest commit for repository main branch.\n // If newValue is provided, then getTagCommit is called\n private async _getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n const { registryUrl, packageName } = config;\n const [projectKey, repositorySlug] = packageName.split('/');\n if (!registryUrl) {\n logger.debug('Missing registryUrl');\n return null;\n }\n\n const baseUrl = `${BitbucketServerTagsDatasource.getApiUrl(registryUrl)}projects/${projectKey}/repos/${repositorySlug}`;\n\n if (newValue?.length) {\n return this.getTagCommit(baseUrl, newValue, config);\n }\n\n const result = Result.parse(config, DigestsConfig)\n .transform(() => {\n const url = `${baseUrl}/commits?ignoreMissing=true`;\n\n return this.http.getJsonSafe(\n url,\n {\n paginate: true,\n limit: 1,\n maxPages: 1,\n },\n BitbucketServerCommits,\n );\n })\n .transform((commits) => {\n return commits[0]?.id;\n });\n\n const { val = null, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'bitbucket-server-tags: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAqBA,IAAa,gCAAb,MAAa,sCAAsC,WAAW;CAC5D,OAAgB,KAAK;CAErB,OAAgB,IAAI,oBAAoB,8BAA8B,EAAE;CAExE,OAAgB,mBAAmB;CACnC,OAAgB,gBACd;CAEF,OAAgB,iBAAwC,cAAc,8BAA8B;CAEpG,cAAc;EACZ,MAAM,8BAA8B,EAAE;CACxC;CAEA,OAAO,eAAe,aAA6B;EACjD,OAAO,aAAa,QAAQ,MAAM,mBAAmB,GAAG,EAAE;CAC5D;CAEA,OAAO,aACL,YACA,gBACA,aACQ;
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-server-tags/index.ts"],"sourcesContent":["import { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketServerHttp } from '../../../util/http/bitbucket-server.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport { DigestsConfig, ReleasesConfig } from '../schema.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport {\n BitbucketServerCommits,\n BitbucketServerTag,\n BitbucketServerTags,\n} from './schema.ts';\n\nexport class BitbucketServerTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-server-tags';\n\n override http = new BitbucketServerHttp(BitbucketServerTagsDatasource.id);\n\n static readonly sourceUrlSupport = 'package';\n static readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketServerTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketServerTagsDatasource.id);\n }\n\n static getRegistryURL(registryUrl: string): string {\n return registryUrl?.replace(regEx(/\\/rest\\/api\\/1.0$/), '');\n }\n\n static getSourceUrl(\n projectKey: string,\n repositorySlug: string,\n registryUrl: string,\n ): string {\n const url = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);\n return `${ensureTrailingSlash(url)}projects/${projectKey}/repos/${repositorySlug}`;\n }\n\n static getApiUrl(registryUrl: string): string {\n const res = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);\n return `${ensureTrailingSlash(res)}rest/api/1.0/`;\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketServerTagsDatasource.getRegistryURL(registryUrl ?? '')}:${repo}:${type}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { registryUrl, packageName } = config;\n const [projectKey, repositorySlug] = packageName.split('/');\n if (!registryUrl) {\n logger.debug('Missing registryUrl');\n return null;\n }\n\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ registryUrl }) => {\n const url = `${BitbucketServerTagsDatasource.getApiUrl(registryUrl)}projects/${projectKey}/repos/${repositorySlug}/tags`;\n\n return this.http.getJsonSafe(\n url,\n { paginate: true },\n BitbucketServerTags,\n );\n })\n .transform((tags) =>\n tags.map(({ displayId, hash }) => ({\n version: displayId,\n gitRef: displayId,\n newDigest: hash ?? undefined,\n })),\n )\n .transform((versions): ReleaseResult => {\n return {\n sourceUrl: BitbucketServerTagsDatasource.getSourceUrl(\n projectKey,\n repositorySlug,\n registryUrl,\n ),\n registryUrl:\n BitbucketServerTagsDatasource.getRegistryURL(registryUrl),\n releases: versions,\n };\n });\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'bitbucket-server-tags: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetches the commit hash for the specified tag\n private async _getTagCommit(\n baseUrl: string,\n tag: string,\n ): Promise<string | null> {\n const bitbucketServerTag = (\n await this.http.getJson(`${baseUrl}/tags/${tag}`, BitbucketServerTag)\n ).body;\n\n return bitbucketServerTag.hash ?? null;\n }\n\n getTagCommit(\n baseUrl: string,\n tag: string,\n config: DigestConfig,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(baseUrl, tag),\n );\n }\n\n // getDigest fetches the latest commit for repository main branch.\n // If newValue is provided, then getTagCommit is called\n private async _getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n const { registryUrl, packageName } = config;\n const [projectKey, repositorySlug] = packageName.split('/');\n if (!registryUrl) {\n logger.debug('Missing registryUrl');\n return null;\n }\n\n const baseUrl = `${BitbucketServerTagsDatasource.getApiUrl(registryUrl)}projects/${projectKey}/repos/${repositorySlug}`;\n\n if (newValue?.length) {\n return this.getTagCommit(baseUrl, newValue, config);\n }\n\n const result = Result.parse(config, DigestsConfig)\n .transform(() => {\n const url = `${baseUrl}/commits?ignoreMissing=true`;\n\n return this.http.getJsonSafe(\n url,\n {\n paginate: true,\n limit: 1,\n maxPages: 1,\n },\n BitbucketServerCommits,\n );\n })\n .transform((commits) => {\n return commits[0]?.id;\n });\n\n const { val = null, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'bitbucket-server-tags: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -27,7 +27,8 @@ var BitbucketTagsDatasource = class BitbucketTagsDatasource extends Datasource {
|
|
|
27
27
|
return `${BitbucketTagsDatasource.getRegistryURL(registryUrl)}:${repo}:${type}`;
|
|
28
28
|
}
|
|
29
29
|
static getSourceUrl(packageName, registryUrl) {
|
|
30
|
-
|
|
30
|
+
const url = BitbucketTagsDatasource.getRegistryURL(registryUrl);
|
|
31
|
+
return `${ensureTrailingSlash(url)}${packageName}`;
|
|
31
32
|
}
|
|
32
33
|
async _getReleases({ registryUrl, packageName: repo }) {
|
|
33
34
|
const url = `/2.0/repositories/${repo}/refs/tags`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-tags/index.ts"],"sourcesContent":["import type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketHttp } from '../../../util/http/bitbucket.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { RepoInfo } from '../../platform/bitbucket/schema.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport { BitbucketCommits, BitbucketTag, BitbucketTags } from './schema.ts';\n\nexport class BitbucketTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-tags';\n\n bitbucketHttp = new BitbucketHttp(BitbucketTagsDatasource.id);\n\n static readonly customRegistrySupport = true;\n\n static readonly registryStrategy = 'first';\n\n static readonly defaultRegistryUrls = ['https://bitbucket.org'];\n\n static readonly releaseTimestampSupport = true;\n static readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n static readonly sourceUrlSupport = 'package';\n static readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketTagsDatasource.id);\n }\n\n static getRegistryURL(registryUrl?: string): string {\n // fallback to default API endpoint if custom not provided\n return registryUrl ?? this.defaultRegistryUrls[0];\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketTagsDatasource.getRegistryURL(\n registryUrl,\n )}:${repo}:${type}`;\n }\n\n static getSourceUrl(packageName: string, registryUrl?: string): string {\n const url = BitbucketTagsDatasource.getRegistryURL(registryUrl);\n const normalizedUrl = ensureTrailingSlash(url);\n return `${normalizedUrl}${packageName}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases({\n registryUrl,\n packageName: repo,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = `/2.0/repositories/${repo}/refs/tags`;\n const bitbucketTags = (\n await this.bitbucketHttp.getJson(url, { paginate: true }, BitbucketTags)\n ).body;\n\n const dependency: ReleaseResult = {\n sourceUrl: BitbucketTagsDatasource.getSourceUrl(repo, registryUrl),\n registryUrl: BitbucketTagsDatasource.getRegistryURL(registryUrl),\n releases: bitbucketTags.map(({ name, target }) => ({\n version: name,\n gitRef: name,\n releaseTimestamp: asTimestamp(target?.date),\n })),\n };\n\n return dependency;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetched the commit has for specified tag\n private async _getTagCommit(\n _registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n const url = `/2.0/repositories/${repo}/refs/tags/${tag}`;\n\n const bitbucketTag = (await this.bitbucketHttp.getJson(url, BitbucketTag))\n .body;\n\n return bitbucketTag.target?.hash ?? null;\n }\n\n getTagCommit(\n registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(registryUrl, repo, tag),\n );\n }\n\n private async _getMainBranch(\n _registryUrl: string,\n repo: string,\n ): Promise<string> {\n return (\n await this.bitbucketHttp.getJson(`/2.0/repositories/${repo}`, RepoInfo)\n ).body.mainbranch;\n }\n\n getMainBranch(registryUrl: string, repo: string): Promise<string> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n 'mainbranch',\n ),\n ttlMinutes: 60,\n },\n () => this._getMainBranch(registryUrl, repo),\n );\n }\n\n // getDigest fetched the latest commit for repository main branch\n // however, if newValue is provided, then getTagCommit is called\n private async _getDigest(\n { packageName: repo, registryUrl }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (newValue?.length) {\n return this.getTagCommit(registryUrl, repo, newValue);\n }\n\n const mainBranch = await this.getMainBranch(\n BitbucketTagsDatasource.getRegistryURL(registryUrl),\n repo,\n );\n\n const url = `/2.0/repositories/${repo}/commits/${mainBranch}`;\n const bitbucketCommits = (\n await this.bitbucketHttp.getJson(url, BitbucketCommits)\n ).body;\n\n if (bitbucketCommits.length === 0) {\n return null;\n }\n\n return bitbucketCommits[0].hash;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,0BAAb,MAAa,gCAAgC,WAAW;CACtD,OAAgB,KAAK;CAErB,gBAAgB,IAAI,cAAc,wBAAwB,EAAE;CAE5D,OAAgB,wBAAwB;CAExC,OAAgB,mBAAmB;CAEnC,OAAgB,sBAAsB,CAAC,uBAAuB;CAE9D,OAAgB,0BAA0B;CAC1C,OAAgB,uBACd;CACF,OAAgB,mBAAmB;CACnC,OAAgB,gBACd;CAEF,OAAgB,iBAAwC,cAAc,wBAAwB;CAE9F,cAAc;EACZ,MAAM,wBAAwB,EAAE;CAClC;CAEA,OAAO,eAAe,aAA8B;EAElD,OAAO,eAAe,KAAK,oBAAoB;CACjD;CAEA,OAAO,YACL,aACA,MACA,MACQ;EACR,OAAO,GAAG,wBAAwB,eAChC,WACF,EAAE,GAAG,KAAK,GAAG;CACf;CAEA,OAAO,aAAa,aAAqB,aAA8B;
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-tags/index.ts"],"sourcesContent":["import type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketHttp } from '../../../util/http/bitbucket.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { RepoInfo } from '../../platform/bitbucket/schema.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport { BitbucketCommits, BitbucketTag, BitbucketTags } from './schema.ts';\n\nexport class BitbucketTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-tags';\n\n bitbucketHttp = new BitbucketHttp(BitbucketTagsDatasource.id);\n\n static readonly customRegistrySupport = true;\n\n static readonly registryStrategy = 'first';\n\n static readonly defaultRegistryUrls = ['https://bitbucket.org'];\n\n static readonly releaseTimestampSupport = true;\n static readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n static readonly sourceUrlSupport = 'package';\n static readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketTagsDatasource.id);\n }\n\n static getRegistryURL(registryUrl?: string): string {\n // fallback to default API endpoint if custom not provided\n return registryUrl ?? this.defaultRegistryUrls[0];\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketTagsDatasource.getRegistryURL(\n registryUrl,\n )}:${repo}:${type}`;\n }\n\n static getSourceUrl(packageName: string, registryUrl?: string): string {\n const url = BitbucketTagsDatasource.getRegistryURL(registryUrl);\n const normalizedUrl = ensureTrailingSlash(url);\n return `${normalizedUrl}${packageName}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases({\n registryUrl,\n packageName: repo,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = `/2.0/repositories/${repo}/refs/tags`;\n const bitbucketTags = (\n await this.bitbucketHttp.getJson(url, { paginate: true }, BitbucketTags)\n ).body;\n\n const dependency: ReleaseResult = {\n sourceUrl: BitbucketTagsDatasource.getSourceUrl(repo, registryUrl),\n registryUrl: BitbucketTagsDatasource.getRegistryURL(registryUrl),\n releases: bitbucketTags.map(({ name, target }) => ({\n version: name,\n gitRef: name,\n releaseTimestamp: asTimestamp(target?.date),\n })),\n };\n\n return dependency;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetched the commit has for specified tag\n private async _getTagCommit(\n _registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n const url = `/2.0/repositories/${repo}/refs/tags/${tag}`;\n\n const bitbucketTag = (await this.bitbucketHttp.getJson(url, BitbucketTag))\n .body;\n\n return bitbucketTag.target?.hash ?? null;\n }\n\n getTagCommit(\n registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(registryUrl, repo, tag),\n );\n }\n\n private async _getMainBranch(\n _registryUrl: string,\n repo: string,\n ): Promise<string> {\n return (\n await this.bitbucketHttp.getJson(`/2.0/repositories/${repo}`, RepoInfo)\n ).body.mainbranch;\n }\n\n getMainBranch(registryUrl: string, repo: string): Promise<string> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n 'mainbranch',\n ),\n ttlMinutes: 60,\n },\n () => this._getMainBranch(registryUrl, repo),\n );\n }\n\n // getDigest fetched the latest commit for repository main branch\n // however, if newValue is provided, then getTagCommit is called\n private async _getDigest(\n { packageName: repo, registryUrl }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (newValue?.length) {\n return this.getTagCommit(registryUrl, repo, newValue);\n }\n\n const mainBranch = await this.getMainBranch(\n BitbucketTagsDatasource.getRegistryURL(registryUrl),\n repo,\n );\n\n const url = `/2.0/repositories/${repo}/commits/${mainBranch}`;\n const bitbucketCommits = (\n await this.bitbucketHttp.getJson(url, BitbucketCommits)\n ).body;\n\n if (bitbucketCommits.length === 0) {\n return null;\n }\n\n return bitbucketCommits[0].hash;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,0BAAb,MAAa,gCAAgC,WAAW;CACtD,OAAgB,KAAK;CAErB,gBAAgB,IAAI,cAAc,wBAAwB,EAAE;CAE5D,OAAgB,wBAAwB;CAExC,OAAgB,mBAAmB;CAEnC,OAAgB,sBAAsB,CAAC,uBAAuB;CAE9D,OAAgB,0BAA0B;CAC1C,OAAgB,uBACd;CACF,OAAgB,mBAAmB;CACnC,OAAgB,gBACd;CAEF,OAAgB,iBAAwC,cAAc,wBAAwB;CAE9F,cAAc;EACZ,MAAM,wBAAwB,EAAE;CAClC;CAEA,OAAO,eAAe,aAA8B;EAElD,OAAO,eAAe,KAAK,oBAAoB;CACjD;CAEA,OAAO,YACL,aACA,MACA,MACQ;EACR,OAAO,GAAG,wBAAwB,eAChC,WACF,EAAE,GAAG,KAAK,GAAG;CACf;CAEA,OAAO,aAAa,aAAqB,aAA8B;EACrE,MAAM,MAAM,wBAAwB,eAAe,WAAW;EAE9D,OAAO,GADe,oBAAoB,GACpB,IAAI;CAC5B;CAGA,MAAc,aAAa,EACzB,aACA,aAAa,QACsC;EACnD,MAAM,MAAM,qBAAqB,KAAK;EACtC,MAAM,iBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,EAAE,UAAU,KAAK,GAAG,aAAa,EAAA,CACvE;EAYF,OAAO;GATL,WAAW,wBAAwB,aAAa,MAAM,WAAW;GACjE,aAAa,wBAAwB,eAAe,WAAW;GAC/D,UAAU,cAAc,KAAK,EAAE,MAAM,cAAc;IACjD,SAAS;IACT,QAAQ;IACR,kBAAkB,YAAY,QAAQ,IAAI;GAC5C,EAAE;EAGY;CAClB;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,MACF;GACA,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAGA,MAAc,cACZ,cACA,MACA,KACwB;EACxB,MAAM,MAAM,qBAAqB,KAAK,aAAa;EAKnD,QAHsB,MAAM,KAAK,cAAc,QAAQ,KAAK,YAAY,EAAA,CACrE,KAEiB,QAAQ,QAAQ;CACtC;CAEA,aACE,aACA,MACA,KACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,OAAO,KACT;EACF,SACM,KAAK,cAAc,aAAa,MAAM,GAAG,CACjD;CACF;CAEA,MAAc,eACZ,cACA,MACiB;EACjB,QACE,MAAM,KAAK,cAAc,QAAQ,qBAAqB,QAAQ,QAAQ,EAAA,CACtE,KAAK;CACT;CAEA,cAAc,aAAqB,MAA+B;EAChE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,YACF;GACA,YAAY;EACd,SACM,KAAK,eAAe,aAAa,IAAI,CAC7C;CACF;CAIA,MAAc,WACZ,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,IAAI,UAAU,QACZ,OAAO,KAAK,aAAa,aAAa,MAAM,QAAQ;EAQtD,MAAM,MAAM,qBAAqB,KAAK,WAAW,MALxB,KAAK,cAC5B,wBAAwB,eAAe,WAAW,GAClD,IACF;EAGA,MAAM,oBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,gBAAgB,EAAA,CACtD;EAEF,IAAI,iBAAiB,WAAW,GAC9B,OAAO;EAGT,OAAO,iBAAiB,EAAE,CAAC;CAC7B;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,QACF;GACA,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;AACF"}
|
|
@@ -34,7 +34,8 @@ var BitriseDatasource = class BitriseDatasource extends Datasource {
|
|
|
34
34
|
}
|
|
35
35
|
const result = { releases: [] };
|
|
36
36
|
const massagedPackageName = encodeURIComponent(packageName);
|
|
37
|
-
const
|
|
37
|
+
const baseApiURL = parsedUrl.resource === "github.com" ? "https://api.github.com" : `https://${parsedUrl.resource}/api/v3`;
|
|
38
|
+
const packageUrl = joinUrlParts(baseApiURL, "repos", parsedUrl.full_name, "contents/steps", massagedPackageName);
|
|
38
39
|
const { body: packageRaw } = await this.http.getJson(packageUrl, GithubContentResponse);
|
|
39
40
|
if (!isArray(packageRaw)) {
|
|
40
41
|
logger.warn({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["semver"],"sources":["../../../../lib/modules/datasource/bitrise/index.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { GithubContentResponse } from '../../platform/github/schema.ts';\nimport semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BitriseStepFile } from './schema.ts';\n\nexport class BitriseDatasource extends Datasource {\n static readonly id = 'bitrise';\n\n override readonly http: GithubHttp;\n\n constructor() {\n super(BitriseDatasource.id);\n\n this.http = new GithubHttp(this.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [\n 'https://github.com/bitrise-io/bitrise-steplib.git',\n ];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const parsedUrl = parseGitUrl(registryUrl);\n if (detectPlatform(registryUrl) !== 'github') {\n logger.once.warn(\n { source: parsedUrl.source },\n 'Unsupported Git hoster for this datasource',\n );\n return null;\n }\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n const massagedPackageName = encodeURIComponent(packageName);\n const baseApiURL =\n parsedUrl.resource === 'github.com'\n ? 'https://api.github.com'\n : `https://${parsedUrl.resource}/api/v3`;\n const packageUrl = joinUrlParts(\n baseApiURL,\n 'repos',\n parsedUrl.full_name,\n 'contents/steps',\n massagedPackageName,\n );\n\n const { body: packageRaw } = await this.http.getJson(\n packageUrl,\n GithubContentResponse,\n );\n\n if (!isArray(packageRaw)) {\n logger.warn(\n { data: packageRaw, url: packageUrl },\n 'Got unexpected response for Bitrise package location',\n );\n return null;\n }\n\n for (const versionDir of packageRaw.filter((element) =>\n semver.isValid(element.name),\n )) {\n const stepUrl = joinUrlParts(packageUrl, versionDir.name, 'step.yml');\n // TODO use getRawFile when ready #30155\n const { body } = await this.http.getJson(stepUrl, GithubContentResponse);\n if (!('content' in body)) {\n logger.warn(\n { data: body, url: stepUrl },\n 'Got unexpected response for Bitrise step location',\n );\n return null;\n }\n if (body.encoding !== 'base64') {\n logger.warn(\n { encoding: body.encoding, data: body, url: stepUrl },\n `Got unexpected encoding for Bitrise step location`,\n );\n return null;\n }\n\n const content = fromBase64(body.content);\n const { published_at, source_code_url } = BitriseStepFile.parse(content);\n\n result.releases.push({\n version: versionDir.name,\n releaseTimestamp: published_at,\n sourceUrl: source_code_url,\n });\n }\n\n // if we have no releases return null\n if (!result.releases.length) {\n return null;\n }\n\n return {\n ...result,\n homepage: `https://bitrise.io/integrations/steps/${packageName}`,\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BitriseDatasource.id}`,\n key: `${config.registryUrl}/${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,oBAAb,MAAa,0BAA0B,WAAW;CAChD,OAAgB,KAAK;CAErB;CAEA,cAAc;EACZ,MAAM,kBAAkB,EAAE;EAE1B,KAAK,OAAO,IAAI,WAAW,KAAK,EAAE;CACpC;CAEA,wBAA0C;CAE1C,sBAAwC,CACtC,mDACF;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,YAAY,YAAY,WAAW;EACzC,IAAI,eAAe,WAAW,MAAM,UAAU;GAC5C,OAAO,KAAK,KACV,EAAE,QAAQ,UAAU,OAAO,GAC3B,4CACF;GACA,OAAO;EACT;EAEA,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,MAAM,sBAAsB,mBAAmB,WAAW;
|
|
1
|
+
{"version":3,"file":"index.js","names":["semver"],"sources":["../../../../lib/modules/datasource/bitrise/index.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { GithubContentResponse } from '../../platform/github/schema.ts';\nimport semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BitriseStepFile } from './schema.ts';\n\nexport class BitriseDatasource extends Datasource {\n static readonly id = 'bitrise';\n\n override readonly http: GithubHttp;\n\n constructor() {\n super(BitriseDatasource.id);\n\n this.http = new GithubHttp(this.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [\n 'https://github.com/bitrise-io/bitrise-steplib.git',\n ];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const parsedUrl = parseGitUrl(registryUrl);\n if (detectPlatform(registryUrl) !== 'github') {\n logger.once.warn(\n { source: parsedUrl.source },\n 'Unsupported Git hoster for this datasource',\n );\n return null;\n }\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n const massagedPackageName = encodeURIComponent(packageName);\n const baseApiURL =\n parsedUrl.resource === 'github.com'\n ? 'https://api.github.com'\n : `https://${parsedUrl.resource}/api/v3`;\n const packageUrl = joinUrlParts(\n baseApiURL,\n 'repos',\n parsedUrl.full_name,\n 'contents/steps',\n massagedPackageName,\n );\n\n const { body: packageRaw } = await this.http.getJson(\n packageUrl,\n GithubContentResponse,\n );\n\n if (!isArray(packageRaw)) {\n logger.warn(\n { data: packageRaw, url: packageUrl },\n 'Got unexpected response for Bitrise package location',\n );\n return null;\n }\n\n for (const versionDir of packageRaw.filter((element) =>\n semver.isValid(element.name),\n )) {\n const stepUrl = joinUrlParts(packageUrl, versionDir.name, 'step.yml');\n // TODO use getRawFile when ready #30155\n const { body } = await this.http.getJson(stepUrl, GithubContentResponse);\n if (!('content' in body)) {\n logger.warn(\n { data: body, url: stepUrl },\n 'Got unexpected response for Bitrise step location',\n );\n return null;\n }\n if (body.encoding !== 'base64') {\n logger.warn(\n { encoding: body.encoding, data: body, url: stepUrl },\n `Got unexpected encoding for Bitrise step location`,\n );\n return null;\n }\n\n const content = fromBase64(body.content);\n const { published_at, source_code_url } = BitriseStepFile.parse(content);\n\n result.releases.push({\n version: versionDir.name,\n releaseTimestamp: published_at,\n sourceUrl: source_code_url,\n });\n }\n\n // if we have no releases return null\n if (!result.releases.length) {\n return null;\n }\n\n return {\n ...result,\n homepage: `https://bitrise.io/integrations/steps/${packageName}`,\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BitriseDatasource.id}`,\n key: `${config.registryUrl}/${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,oBAAb,MAAa,0BAA0B,WAAW;CAChD,OAAgB,KAAK;CAErB;CAEA,cAAc;EACZ,MAAM,kBAAkB,EAAE;EAE1B,KAAK,OAAO,IAAI,WAAW,KAAK,EAAE;CACpC;CAEA,wBAA0C;CAE1C,sBAAwC,CACtC,mDACF;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,YAAY,YAAY,WAAW;EACzC,IAAI,eAAe,WAAW,MAAM,UAAU;GAC5C,OAAO,KAAK,KACV,EAAE,QAAQ,UAAU,OAAO,GAC3B,4CACF;GACA,OAAO;EACT;EAEA,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,MAAM,sBAAsB,mBAAmB,WAAW;EAC1D,MAAM,aACJ,UAAU,aAAa,eACnB,2BACA,WAAW,UAAU,SAAS;EACpC,MAAM,aAAa,aACjB,YACA,SACA,UAAU,WACV,kBACA,mBACF;EAEA,MAAM,EAAE,MAAM,eAAe,MAAM,KAAK,KAAK,QAC3C,YACA,qBACF;EAEA,IAAI,CAAC,QAAQ,UAAU,GAAG;GACxB,OAAO,KACL;IAAE,MAAM;IAAY,KAAK;GAAW,GACpC,sDACF;GACA,OAAO;EACT;EAEA,KAAK,MAAM,cAAc,WAAW,QAAQ,YAC1CA,IAAO,QAAQ,QAAQ,IAAI,CAC7B,GAAG;GACD,MAAM,UAAU,aAAa,YAAY,WAAW,MAAM,UAAU;GAEpE,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,SAAS,qBAAqB;GACvE,IAAI,EAAE,aAAa,OAAO;IACxB,OAAO,KACL;KAAE,MAAM;KAAM,KAAK;IAAQ,GAC3B,mDACF;IACA,OAAO;GACT;GACA,IAAI,KAAK,aAAa,UAAU;IAC9B,OAAO,KACL;KAAE,UAAU,KAAK;KAAU,MAAM;KAAM,KAAK;IAAQ,GACpD,mDACF;IACA,OAAO;GACT;GAEA,MAAM,UAAU,WAAW,KAAK,OAAO;GACvC,MAAM,EAAE,cAAc,oBAAoB,gBAAgB,MAAM,OAAO;GAEvE,OAAO,SAAS,KAAK;IACnB,SAAS,WAAW;IACpB,kBAAkB;IAClB,WAAW;GACb,CAAC;EACH;EAGA,IAAI,CAAC,OAAO,SAAS,QACnB,OAAO;EAGT,OAAO;GACL,GAAG;GACH,UAAU,yCAAyC;EACrD;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,kBAAkB;GAC3C,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
|
|
@@ -68,12 +68,14 @@ function applyExtractVersion(releaseResult, extractVersion) {
|
|
|
68
68
|
return releaseResult;
|
|
69
69
|
}
|
|
70
70
|
function filterValidVersions(releaseResult, config) {
|
|
71
|
-
const
|
|
71
|
+
const versioningName = config.versioning ?? getDefaultVersioning(config.datasource);
|
|
72
|
+
const versioning = get(versioningName);
|
|
72
73
|
releaseResult.releases = filterMap(releaseResult.releases, (release) => versioning.isVersion(release.version) ? release : null);
|
|
73
74
|
return releaseResult;
|
|
74
75
|
}
|
|
75
76
|
function sortAndRemoveDuplicates(releaseResult, config) {
|
|
76
|
-
const
|
|
77
|
+
const versioningName = config.versioning ?? getDefaultVersioning(config.datasource);
|
|
78
|
+
const versioning = get(versioningName);
|
|
77
79
|
releaseResult.releases = releaseResult.releases.sort((a, b) => versioning.sortVersions(a.version, b.version));
|
|
78
80
|
let previousVersion = null;
|
|
79
81
|
releaseResult.releases = filterMap(releaseResult.releases, (release) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["datasources","allVersioning.get"],"sources":["../../../lib/modules/datasource/common.ts"],"sourcesContent":["import {\n isNonEmptyArray,\n isNonEmptyStringAndNotWhitespace,\n} from '@sindresorhus/is';\nimport { logger } from '../../logger/index.ts';\nimport {\n type ConstraintName,\n isAdditionalConstraintName,\n} from '../../util/exec/types.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { regEx } from '../../util/regex.ts';\nimport * as allVersioning from '../versioning/index.ts';\nimport { defaultVersioning } from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport { CustomDatasource } from './custom/index.ts';\nimport type {\n DatasourceApi,\n GetPkgReleasesConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport function getDatasourceFor(datasource: string): DatasourceApi | null {\n if (datasource?.startsWith('custom.')) {\n return getDatasourceFor(CustomDatasource.id);\n }\n return datasources.get(datasource) ?? null;\n}\n\nexport function getDefaultVersioning(\n datasourceName: string | undefined,\n): string {\n if (!datasourceName) {\n return defaultVersioning.id;\n }\n\n const datasource = getDatasourceFor(datasourceName);\n\n if (!datasource) {\n logger.warn({ datasourceName }, 'Missing datasource!');\n return defaultVersioning.id;\n }\n\n if (!datasource.defaultVersioning) {\n return defaultVersioning.id;\n }\n\n return datasource.defaultVersioning;\n}\n\nexport function isGetPkgReleasesConfig(\n input: unknown,\n): input is GetPkgReleasesConfig {\n return (\n isNonEmptyStringAndNotWhitespace(\n (input as GetPkgReleasesConfig).datasource,\n ) &&\n isNonEmptyStringAndNotWhitespace(\n (input as GetPkgReleasesConfig).packageName,\n )\n );\n}\n\nexport function applyVersionCompatibility(\n releaseResult: ReleaseResult,\n versionCompatibility: string | undefined,\n currentCompatibility: string | undefined,\n): ReleaseResult {\n if (!versionCompatibility) {\n return releaseResult;\n }\n\n const versionCompatibilityRegEx = regEx(versionCompatibility);\n releaseResult.releases = filterMap(releaseResult.releases, (release) => {\n const regexResult = versionCompatibilityRegEx.exec(release.version);\n if (!regexResult?.groups?.version) {\n logger.trace(\n { releaseVersion: release.version, versionCompatibility },\n 'versionCompatibility: Does not match regex',\n );\n return null;\n }\n if (regexResult?.groups?.compatibility !== currentCompatibility) {\n logger.trace(\n { releaseVersion: release.version, versionCompatibility },\n 'versionCompatibility: Does not match compatibility',\n );\n return null;\n }\n logger.trace(\n {\n releaseVersion: release.version,\n versionCompatibility,\n version: regexResult.groups.version,\n compatibility: regexResult.groups.compatibility,\n },\n 'versionCompatibility: matches',\n );\n release.versionOrig ??= release.version;\n release.version = regexResult.groups.version;\n return release;\n });\n\n return releaseResult;\n}\n\nexport function applyExtractVersion(\n releaseResult: ReleaseResult,\n extractVersion: string | undefined,\n): ReleaseResult {\n if (!extractVersion) {\n return releaseResult;\n }\n\n const extractVersionRegEx = regEx(extractVersion);\n releaseResult.releases = filterMap(releaseResult.releases, (release) => {\n const version = extractVersionRegEx.exec(release.version)?.groups?.version;\n if (!version) {\n return null;\n }\n\n release.versionOrig = release.version;\n release.version = version;\n return release;\n });\n\n return releaseResult;\n}\n\nexport function filterValidVersions<\n Config extends Pick<GetPkgReleasesConfig, 'versioning' | 'datasource'>,\n>(releaseResult: ReleaseResult, config: Config): ReleaseResult {\n const versioningName =\n config.versioning ?? getDefaultVersioning(config.datasource);\n const versioning = allVersioning.get(versioningName);\n\n releaseResult.releases = filterMap(releaseResult.releases, (release) =>\n versioning.isVersion(release.version) ? release : null,\n );\n\n return releaseResult;\n}\n\nexport function sortAndRemoveDuplicates<\n Config extends Pick<GetPkgReleasesConfig, 'versioning' | 'datasource'>,\n>(releaseResult: ReleaseResult, config: Config): ReleaseResult {\n const versioningName =\n config.versioning ?? getDefaultVersioning(config.datasource);\n const versioning = allVersioning.get(versioningName);\n\n releaseResult.releases = releaseResult.releases.sort((a, b) =>\n versioning.sortVersions(a.version, b.version),\n );\n\n // Once releases are sorted, deduplication is straightforward and efficient\n let previousVersion: string | null = null;\n releaseResult.releases = filterMap(releaseResult.releases, (release) => {\n if (previousVersion === release.version) {\n return null;\n }\n previousVersion = release.version;\n return release;\n });\n\n return releaseResult;\n}\n\nexport function applyConstraintsFiltering<\n Config extends Pick<\n GetPkgReleasesConfig,\n | 'constraintsFiltering'\n | 'constraintsVersioning'\n | 'versioning'\n | 'datasource'\n | 'constraints'\n | 'packageName'\n >,\n>(releaseResult: ReleaseResult, config: Config): ReleaseResult {\n if (config?.constraintsFiltering !== 'strict') {\n for (const release of releaseResult.releases) {\n delete release.constraints;\n }\n\n return releaseResult;\n }\n\n const versioningName =\n config.versioning ?? getDefaultVersioning(config.datasource);\n const versioning = allVersioning.get(versioningName);\n\n const configConstraints = config.constraints;\n const filteredReleases: string[] = [];\n const startingLength = releaseResult.releases.length;\n releaseResult.releases = filterMap(releaseResult.releases, (release) => {\n logger.trace(\n {\n release,\n versioning: versioningName,\n },\n `applyConstraintsFiltering(${release.version})`,\n );\n const releaseConstraints = release.constraints;\n delete release.constraints;\n\n logger.trace(\n {\n release,\n versioning: versioningName,\n configConstraints: configConstraints ?? 'undefined',\n releaseConstraints: releaseConstraints ?? 'undefined',\n },\n `applyConstraintsFiltering(${release.version}): checking constraints`,\n );\n if (!configConstraints || !releaseConstraints) {\n return release;\n }\n\n for (const [name, configConstraint] of Object.entries(\n configConstraints,\n ) as [ConstraintName, string][]) {\n let constraintVersioningName = versioningName;\n if (\n isAdditionalConstraintName(name) &&\n config.constraintsVersioning?.[name]\n ) {\n const val = config.constraintsVersioning[name];\n logger.once.debug(\n { packageName: config.packageName, release },\n `applyConstraintsFiltering(${config.packageName}, ${name}): overriding constraintsVersioning from ${constraintVersioningName} to ${val}`,\n );\n logger.trace(\n { packageName: config.packageName, release },\n `applyConstraintsFiltering(${release.version}): overriding constraintsVersioning from ${constraintVersioningName} to ${val}`,\n );\n constraintVersioningName = val;\n }\n const constraintVersioning = allVersioning.get(constraintVersioningName);\n\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n constraintName: name,\n constraint: configConstraint,\n },\n `applyConstraintsFiltering(${release.version}) for constraint ${name}`,\n );\n\n const isValid = constraintVersioning.isValid(configConstraint);\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n },\n `applyConstraintsFiltering(${release.version}): versioning.isValid(${configConstraint})=${isValid}`,\n );\n if (!isValid) {\n logger.once.warn(\n {\n packageName: config.packageName,\n constraint: configConstraint,\n versioning: constraintVersioningName,\n },\n 'Invalid constraint used with strict constraintsFiltering',\n );\n continue;\n }\n\n const constraint = releaseConstraints[name];\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n },\n `applyConstraintsFiltering(${release.version}): releaseConstraints[${name}]=${JSON.stringify(constraint)}`,\n );\n if (!isNonEmptyArray(constraint)) {\n // A release with no constraints is OK\n continue;\n }\n\n let satisfiesConstraints = false;\n for (const releaseConstraint of constraint) {\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): releaseConstraint=${releaseConstraint}`,\n );\n if (!releaseConstraint) {\n satisfiesConstraints = true;\n logger.once.debug(\n {\n packageName: config.packageName,\n versioning: constraintVersioningName,\n constraint: releaseConstraint,\n },\n 'Undefined release constraint',\n );\n break;\n }\n\n const isValidConstraintVersion =\n constraintVersioning.isValid(releaseConstraint);\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): constraintVersioning.isValid(${releaseConstraint})=${isValidConstraintVersion}`,\n );\n const isValidVersion = versioning.isValid(releaseConstraint);\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): versioning.isValid(${releaseConstraint})=${isValidVersion}`,\n );\n if (!isValidVersion || !isValidConstraintVersion) {\n logger.once.debug(\n {\n packageName: config.packageName,\n versioning: constraintVersioningName,\n constraint: releaseConstraint,\n },\n 'Invalid release constraint',\n );\n break;\n }\n\n const isEqual = configConstraint === releaseConstraint;\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n configConstraint,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): ${configConstraint} === ${releaseConstraint}=${isEqual}`,\n );\n if (isEqual) {\n satisfiesConstraints = true;\n break;\n }\n\n const isSubset = constraintVersioning.subset?.(\n configConstraint,\n releaseConstraint,\n );\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n configConstraint,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): versioning.subset?.(${configConstraint}, ${releaseConstraint})=${isSubset}`,\n );\n if (isSubset) {\n satisfiesConstraints = true;\n break;\n }\n\n const doesMatchConfig = constraintVersioning.matches(\n configConstraint,\n releaseConstraint,\n );\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n configConstraint,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): versioning.matches(${configConstraint}, ${releaseConstraint})=${doesMatchConfig}`,\n );\n const doesMatchRelease = constraintVersioning.matches(\n releaseConstraint,\n configConstraint,\n );\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n configConstraint,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): versioning.matches(${releaseConstraint}, ${configConstraint})=${doesMatchRelease}`,\n );\n if (doesMatchConfig || doesMatchRelease) {\n satisfiesConstraints = true;\n break;\n }\n }\n\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n },\n `applyConstraintsFiltering(${release.version}): satisfiesConstraints=${satisfiesConstraints}`,\n );\n if (!satisfiesConstraints) {\n filteredReleases.push(release.version);\n return null;\n }\n }\n\n return release;\n });\n\n if (filteredReleases.length) {\n const count = filteredReleases.length;\n const packageName = config.packageName;\n const releases = filteredReleases.join(', ');\n logger.debug(\n {\n datasource: config.datasource,\n packageName: config.packageName,\n },\n `Filtered out ${count} non-matching releases out of ${startingLength} total for ${packageName} due to constraintsFiltering=strict: ${releases}`,\n );\n }\n\n return releaseResult;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"common.js","names":["datasources","allVersioning.get"],"sources":["../../../lib/modules/datasource/common.ts"],"sourcesContent":["import {\n isNonEmptyArray,\n isNonEmptyStringAndNotWhitespace,\n} from '@sindresorhus/is';\nimport { logger } from '../../logger/index.ts';\nimport {\n type ConstraintName,\n isAdditionalConstraintName,\n} from '../../util/exec/types.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { regEx } from '../../util/regex.ts';\nimport * as allVersioning from '../versioning/index.ts';\nimport { defaultVersioning } from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport { CustomDatasource } from './custom/index.ts';\nimport type {\n DatasourceApi,\n GetPkgReleasesConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport function getDatasourceFor(datasource: string): DatasourceApi | null {\n if (datasource?.startsWith('custom.')) {\n return getDatasourceFor(CustomDatasource.id);\n }\n return datasources.get(datasource) ?? null;\n}\n\nexport function getDefaultVersioning(\n datasourceName: string | undefined,\n): string {\n if (!datasourceName) {\n return defaultVersioning.id;\n }\n\n const datasource = getDatasourceFor(datasourceName);\n\n if (!datasource) {\n logger.warn({ datasourceName }, 'Missing datasource!');\n return defaultVersioning.id;\n }\n\n if (!datasource.defaultVersioning) {\n return defaultVersioning.id;\n }\n\n return datasource.defaultVersioning;\n}\n\nexport function isGetPkgReleasesConfig(\n input: unknown,\n): input is GetPkgReleasesConfig {\n return (\n isNonEmptyStringAndNotWhitespace(\n (input as GetPkgReleasesConfig).datasource,\n ) &&\n isNonEmptyStringAndNotWhitespace(\n (input as GetPkgReleasesConfig).packageName,\n )\n );\n}\n\nexport function applyVersionCompatibility(\n releaseResult: ReleaseResult,\n versionCompatibility: string | undefined,\n currentCompatibility: string | undefined,\n): ReleaseResult {\n if (!versionCompatibility) {\n return releaseResult;\n }\n\n const versionCompatibilityRegEx = regEx(versionCompatibility);\n releaseResult.releases = filterMap(releaseResult.releases, (release) => {\n const regexResult = versionCompatibilityRegEx.exec(release.version);\n if (!regexResult?.groups?.version) {\n logger.trace(\n { releaseVersion: release.version, versionCompatibility },\n 'versionCompatibility: Does not match regex',\n );\n return null;\n }\n if (regexResult?.groups?.compatibility !== currentCompatibility) {\n logger.trace(\n { releaseVersion: release.version, versionCompatibility },\n 'versionCompatibility: Does not match compatibility',\n );\n return null;\n }\n logger.trace(\n {\n releaseVersion: release.version,\n versionCompatibility,\n version: regexResult.groups.version,\n compatibility: regexResult.groups.compatibility,\n },\n 'versionCompatibility: matches',\n );\n release.versionOrig ??= release.version;\n release.version = regexResult.groups.version;\n return release;\n });\n\n return releaseResult;\n}\n\nexport function applyExtractVersion(\n releaseResult: ReleaseResult,\n extractVersion: string | undefined,\n): ReleaseResult {\n if (!extractVersion) {\n return releaseResult;\n }\n\n const extractVersionRegEx = regEx(extractVersion);\n releaseResult.releases = filterMap(releaseResult.releases, (release) => {\n const version = extractVersionRegEx.exec(release.version)?.groups?.version;\n if (!version) {\n return null;\n }\n\n release.versionOrig = release.version;\n release.version = version;\n return release;\n });\n\n return releaseResult;\n}\n\nexport function filterValidVersions<\n Config extends Pick<GetPkgReleasesConfig, 'versioning' | 'datasource'>,\n>(releaseResult: ReleaseResult, config: Config): ReleaseResult {\n const versioningName =\n config.versioning ?? getDefaultVersioning(config.datasource);\n const versioning = allVersioning.get(versioningName);\n\n releaseResult.releases = filterMap(releaseResult.releases, (release) =>\n versioning.isVersion(release.version) ? release : null,\n );\n\n return releaseResult;\n}\n\nexport function sortAndRemoveDuplicates<\n Config extends Pick<GetPkgReleasesConfig, 'versioning' | 'datasource'>,\n>(releaseResult: ReleaseResult, config: Config): ReleaseResult {\n const versioningName =\n config.versioning ?? getDefaultVersioning(config.datasource);\n const versioning = allVersioning.get(versioningName);\n\n releaseResult.releases = releaseResult.releases.sort((a, b) =>\n versioning.sortVersions(a.version, b.version),\n );\n\n // Once releases are sorted, deduplication is straightforward and efficient\n let previousVersion: string | null = null;\n releaseResult.releases = filterMap(releaseResult.releases, (release) => {\n if (previousVersion === release.version) {\n return null;\n }\n previousVersion = release.version;\n return release;\n });\n\n return releaseResult;\n}\n\nexport function applyConstraintsFiltering<\n Config extends Pick<\n GetPkgReleasesConfig,\n | 'constraintsFiltering'\n | 'constraintsVersioning'\n | 'versioning'\n | 'datasource'\n | 'constraints'\n | 'packageName'\n >,\n>(releaseResult: ReleaseResult, config: Config): ReleaseResult {\n if (config?.constraintsFiltering !== 'strict') {\n for (const release of releaseResult.releases) {\n delete release.constraints;\n }\n\n return releaseResult;\n }\n\n const versioningName =\n config.versioning ?? getDefaultVersioning(config.datasource);\n const versioning = allVersioning.get(versioningName);\n\n const configConstraints = config.constraints;\n const filteredReleases: string[] = [];\n const startingLength = releaseResult.releases.length;\n releaseResult.releases = filterMap(releaseResult.releases, (release) => {\n logger.trace(\n {\n release,\n versioning: versioningName,\n },\n `applyConstraintsFiltering(${release.version})`,\n );\n const releaseConstraints = release.constraints;\n delete release.constraints;\n\n logger.trace(\n {\n release,\n versioning: versioningName,\n configConstraints: configConstraints ?? 'undefined',\n releaseConstraints: releaseConstraints ?? 'undefined',\n },\n `applyConstraintsFiltering(${release.version}): checking constraints`,\n );\n if (!configConstraints || !releaseConstraints) {\n return release;\n }\n\n for (const [name, configConstraint] of Object.entries(\n configConstraints,\n ) as [ConstraintName, string][]) {\n let constraintVersioningName = versioningName;\n if (\n isAdditionalConstraintName(name) &&\n config.constraintsVersioning?.[name]\n ) {\n const val = config.constraintsVersioning[name];\n logger.once.debug(\n { packageName: config.packageName, release },\n `applyConstraintsFiltering(${config.packageName}, ${name}): overriding constraintsVersioning from ${constraintVersioningName} to ${val}`,\n );\n logger.trace(\n { packageName: config.packageName, release },\n `applyConstraintsFiltering(${release.version}): overriding constraintsVersioning from ${constraintVersioningName} to ${val}`,\n );\n constraintVersioningName = val;\n }\n const constraintVersioning = allVersioning.get(constraintVersioningName);\n\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n constraintName: name,\n constraint: configConstraint,\n },\n `applyConstraintsFiltering(${release.version}) for constraint ${name}`,\n );\n\n const isValid = constraintVersioning.isValid(configConstraint);\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n },\n `applyConstraintsFiltering(${release.version}): versioning.isValid(${configConstraint})=${isValid}`,\n );\n if (!isValid) {\n logger.once.warn(\n {\n packageName: config.packageName,\n constraint: configConstraint,\n versioning: constraintVersioningName,\n },\n 'Invalid constraint used with strict constraintsFiltering',\n );\n continue;\n }\n\n const constraint = releaseConstraints[name];\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n },\n `applyConstraintsFiltering(${release.version}): releaseConstraints[${name}]=${JSON.stringify(constraint)}`,\n );\n if (!isNonEmptyArray(constraint)) {\n // A release with no constraints is OK\n continue;\n }\n\n let satisfiesConstraints = false;\n for (const releaseConstraint of constraint) {\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): releaseConstraint=${releaseConstraint}`,\n );\n if (!releaseConstraint) {\n satisfiesConstraints = true;\n logger.once.debug(\n {\n packageName: config.packageName,\n versioning: constraintVersioningName,\n constraint: releaseConstraint,\n },\n 'Undefined release constraint',\n );\n break;\n }\n\n const isValidConstraintVersion =\n constraintVersioning.isValid(releaseConstraint);\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): constraintVersioning.isValid(${releaseConstraint})=${isValidConstraintVersion}`,\n );\n const isValidVersion = versioning.isValid(releaseConstraint);\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): versioning.isValid(${releaseConstraint})=${isValidVersion}`,\n );\n if (!isValidVersion || !isValidConstraintVersion) {\n logger.once.debug(\n {\n packageName: config.packageName,\n versioning: constraintVersioningName,\n constraint: releaseConstraint,\n },\n 'Invalid release constraint',\n );\n break;\n }\n\n const isEqual = configConstraint === releaseConstraint;\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n configConstraint,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): ${configConstraint} === ${releaseConstraint}=${isEqual}`,\n );\n if (isEqual) {\n satisfiesConstraints = true;\n break;\n }\n\n const isSubset = constraintVersioning.subset?.(\n configConstraint,\n releaseConstraint,\n );\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n configConstraint,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): versioning.subset?.(${configConstraint}, ${releaseConstraint})=${isSubset}`,\n );\n if (isSubset) {\n satisfiesConstraints = true;\n break;\n }\n\n const doesMatchConfig = constraintVersioning.matches(\n configConstraint,\n releaseConstraint,\n );\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n configConstraint,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): versioning.matches(${configConstraint}, ${releaseConstraint})=${doesMatchConfig}`,\n );\n const doesMatchRelease = constraintVersioning.matches(\n releaseConstraint,\n configConstraint,\n );\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n configConstraint,\n releaseConstraint,\n },\n `applyConstraintsFiltering(${release.version}): versioning.matches(${releaseConstraint}, ${configConstraint})=${doesMatchRelease}`,\n );\n if (doesMatchConfig || doesMatchRelease) {\n satisfiesConstraints = true;\n break;\n }\n }\n\n logger.trace(\n {\n release,\n versioning: constraintVersioningName,\n },\n `applyConstraintsFiltering(${release.version}): satisfiesConstraints=${satisfiesConstraints}`,\n );\n if (!satisfiesConstraints) {\n filteredReleases.push(release.version);\n return null;\n }\n }\n\n return release;\n });\n\n if (filteredReleases.length) {\n const count = filteredReleases.length;\n const packageName = config.packageName;\n const releases = filteredReleases.join(', ');\n logger.debug(\n {\n datasource: config.datasource,\n packageName: config.packageName,\n },\n `Filtered out ${count} non-matching releases out of ${startingLength} total for ${packageName} due to constraintsFiltering=strict: ${releases}`,\n );\n }\n\n return releaseResult;\n}\n"],"mappings":"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"}
|
|
@@ -81,7 +81,8 @@ var CrateDatasource = class CrateDatasource extends Datasource {
|
|
|
81
81
|
const cached = get(cacheKey);
|
|
82
82
|
if (cached) return cached;
|
|
83
83
|
if (info.clonePath) try {
|
|
84
|
-
const
|
|
84
|
+
const configPath = upath.join(info.clonePath, "config.json");
|
|
85
|
+
const content = await readCacheFile(configPath, "utf8");
|
|
85
86
|
const parsed = Json.pipe(RegistryConfig).parse(content);
|
|
86
87
|
set(cacheKey, parsed);
|
|
87
88
|
return parsed;
|
|
@@ -128,7 +129,10 @@ var CrateDatasource = class CrateDatasource extends Datasource {
|
|
|
128
129
|
}, () => this._getCrateMetadata(info, packageName));
|
|
129
130
|
}
|
|
130
131
|
async fetchCrateRecordsPayload(info, packageName) {
|
|
131
|
-
if (info.clonePath)
|
|
132
|
+
if (info.clonePath) {
|
|
133
|
+
const path = upath.join(info.clonePath, ...CrateDatasource.getIndexSuffix(packageName));
|
|
134
|
+
return readCacheFile(path, "utf8");
|
|
135
|
+
}
|
|
132
136
|
const packageSuffix = CrateDatasource.getIndexSuffix(packageName.toLowerCase());
|
|
133
137
|
const crateUrl = joinUrlParts(info.rawUrl, ...packageSuffix);
|
|
134
138
|
logger.trace({
|
|
@@ -201,7 +205,8 @@ var CrateDatasource = class CrateDatasource extends Datasource {
|
|
|
201
205
|
const cacheKey = `crate-datasource/registry-clone-path/${registryFetchUrl}`;
|
|
202
206
|
const lockKey = registryFetchUrl;
|
|
203
207
|
const executionTimeout = GlobalConfig.get("executionTimeout") * 60 * 1e3;
|
|
204
|
-
const
|
|
208
|
+
const gitTimeout = GlobalConfig.get("gitTimeout") || executionTimeout;
|
|
209
|
+
const releaseLock = await acquireLock(lockKey, "crate-registry", gitTimeout);
|
|
205
210
|
try {
|
|
206
211
|
const cached = get(cacheKey);
|
|
207
212
|
if (cached?.err) {
|
|
@@ -272,7 +277,8 @@ var CrateDatasource = class CrateDatasource extends Datasource {
|
|
|
272
277
|
}
|
|
273
278
|
static isCratesIo(registryUrl) {
|
|
274
279
|
if (!registryUrl) return false;
|
|
275
|
-
|
|
280
|
+
const normalized = registryUrl.replace(regEx(/^sparse\+/), "");
|
|
281
|
+
return parseUrl(normalized)?.hostname === "index.crates.io";
|
|
276
282
|
}
|
|
277
283
|
static getIndexSuffix(packageName) {
|
|
278
284
|
const len = packageName.length;
|
|
@@ -293,7 +299,8 @@ var CrateDatasource = class CrateDatasource extends Datasource {
|
|
|
293
299
|
if (release.releaseTimestamp) return release;
|
|
294
300
|
const rawUrl = registryUrl?.replace(/^sparse\+/, "");
|
|
295
301
|
if (!rawUrl) return release;
|
|
296
|
-
const
|
|
302
|
+
const cacheKey = `crate-datasource/registry-config/${rawUrl}`;
|
|
303
|
+
const config = get(cacheKey);
|
|
297
304
|
if (!config?.api) return release;
|
|
298
305
|
const url = `${joinUrlParts(config.api, "api/v1/")}crates/${packageName}/${release.versionOrig ?? release.version}`;
|
|
299
306
|
logger.trace({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["cargoVersioning.id","memCache.get"],"sources":["../../../../lib/modules/datasource/crate/index.ts"],"sourcesContent":["import upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { privateCacheDir, readCacheFile } from '../../../util/fs/index.ts';\nimport { createSimpleGit } from '../../../util/git/index.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport { acquireLock } from '../../../util/mutex.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { Json } from '../../../util/schema-utils/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts, parseUrl } from '../../../util/url.ts';\nimport * as cargoVersioning from '../../versioning/cargo/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport type { CrateMetadata } from './schema.ts';\nimport {\n CrateMetadataResponse,\n RegistryConfig,\n ReleaseTimestamp,\n} from './schema.ts';\nimport type { CrateRecord, RegistryFlavor, RegistryInfo } from './types.ts';\n\ntype CloneResult =\n | {\n err: Error;\n clonePath?: undefined;\n }\n | {\n clonePath: string;\n err?: undefined;\n };\n\nexport class CrateDatasource extends Datasource {\n static readonly id = 'crate';\n\n constructor() {\n super(CrateDatasource.id);\n }\n\n override defaultRegistryUrls = ['sparse+https://index.crates.io/'];\n\n override defaultVersioning = cargoVersioning.id;\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from `pubtime` field from crates.io index if available, or `version.created_at` field from crates.io API otherwise.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore if -- should never happen */\n if (!registryUrl) {\n logger.warn(\n 'crate datasource: No registryUrl specified, cannot perform getReleases',\n );\n return null;\n }\n\n const registryInfo = await CrateDatasource.fetchRegistryInfo({\n packageName,\n registryUrl,\n });\n if (!registryInfo) {\n logger.debug(`Could not fetch registry info from ${registryUrl}`);\n return null;\n }\n\n const dependencyUrl = CrateDatasource.getDependencyUrl(\n registryInfo,\n packageName,\n );\n\n const payload = await this.fetchCrateRecordsPayload(\n registryInfo,\n packageName,\n );\n const lines = payload\n .split(newlineRegex) // break into lines\n .map((line) => line.trim()) // remove whitespace\n .filter((line) => line.length !== 0) // remove empty lines\n .map((line) => JSON.parse(line) as CrateRecord); // parse\n\n const metadata = await this.getCrateMetadata(registryInfo, packageName);\n\n const result: ReleaseResult = {\n dependencyUrl,\n releases: [],\n };\n\n if (metadata?.homepage) {\n result.homepage = metadata.homepage;\n }\n\n if (metadata?.repository) {\n result.sourceUrl = metadata.repository;\n }\n\n result.releases = lines\n .map((line) => {\n const versionOrig = line.vers;\n const version = versionOrig.replace(/\\+.*$/, '');\n const release: Release = { version };\n\n if (versionOrig !== version) {\n release.versionOrig = versionOrig;\n }\n\n if (line.yanked) {\n release.isDeprecated = true;\n }\n\n if (line.rust_version) {\n release.constraints = { rust: [line.rust_version] };\n }\n\n if (line.pubtime) {\n release.releaseTimestamp = asTimestamp(line.pubtime);\n }\n\n return release;\n })\n .filter((release) => release.version);\n if (!result.releases.length) {\n return null;\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${CrateDatasource.id}`,\n // TODO: types (#22198)\n key: `${config.registryUrl}/${config.packageName}`,\n cacheable: CrateDatasource.isCratesIo(config.registryUrl),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Fetches the registry's config.json which provides the API base URL\n * and download URL template.\n * See: https://doc.rust-lang.org/cargo/reference/registry-index.html#index-configuration\n */\n private async fetchRegistryConfig(\n info: RegistryInfo,\n ): Promise<RegistryConfig | null> {\n const cacheKey = `crate-datasource/registry-config/${info.rawUrl}`;\n const cached = memCache.get<RegistryConfig>(cacheKey);\n if (cached) {\n return cached;\n }\n\n if (info.clonePath) {\n try {\n const configPath = upath.join(info.clonePath, 'config.json');\n const content = await readCacheFile(configPath, 'utf8');\n const parsed = Json.pipe(RegistryConfig).parse(content);\n memCache.set(cacheKey, parsed);\n return parsed;\n } catch {\n logger.debug(\n { registryUrl: info.rawUrl },\n 'Could not read config.json from cloned registry',\n );\n }\n } else {\n try {\n const configUrl = joinUrlParts(info.rawUrl, 'config.json');\n const { body } = await this.http.getJson(configUrl, RegistryConfig);\n memCache.set(cacheKey, body);\n return body;\n } catch {\n logger.debug(\n { registryUrl: info.rawUrl },\n 'Could not fetch registry config.json',\n );\n }\n }\n\n return null;\n }\n\n private async _getCrateMetadata(\n info: RegistryInfo,\n packageName: string,\n ): Promise<CrateMetadata | null> {\n const registryConfig = await this.fetchRegistryConfig(info);\n if (!registryConfig?.api) {\n return null;\n }\n\n const apiBaseUrl = joinUrlParts(registryConfig.api, 'api/v1/');\n\n // The `?include=` suffix is required to avoid unnecessary database queries\n // on the crates.io server. This lets us work around the regular request\n // throttling of one request per second.\n const crateUrl = `${apiBaseUrl}crates/${packageName}?include=`;\n\n logger.trace(\n { crateUrl, packageName, registryUrl: info.rawUrl },\n 'downloading crate metadata',\n );\n\n try {\n const { body } = await this.http.getJson(crateUrl, CrateMetadataResponse);\n return body.crate;\n } catch (err) {\n logger.debug(\n { err, packageName, registryUrl: info.rawUrl },\n 'failed to download crate metadata',\n );\n }\n\n return null;\n }\n\n public getCrateMetadata(\n info: RegistryInfo,\n packageName: string,\n ): Promise<CrateMetadata | null> {\n return withCache(\n {\n namespace: `datasource-${CrateDatasource.id}-metadata`,\n key: `${info.rawUrl}/${packageName}`,\n cacheable: info.flavor === 'crates.io',\n ttlMinutes: 24 * 60, // 24 hours\n },\n () => this._getCrateMetadata(info, packageName),\n );\n }\n\n public async fetchCrateRecordsPayload(\n info: RegistryInfo,\n packageName: string,\n ): Promise<string> {\n if (info.clonePath) {\n const path = upath.join(\n info.clonePath,\n ...CrateDatasource.getIndexSuffix(packageName),\n );\n return readCacheFile(path, 'utf8');\n }\n\n // sparse index\n const packageSuffix = CrateDatasource.getIndexSuffix(\n packageName.toLowerCase(),\n );\n const crateUrl = joinUrlParts(info.rawUrl, ...packageSuffix);\n logger.trace(\n { crateUrl, packageName, registryUrl: info.rawUrl },\n 'fetching crate records from sparse index',\n );\n try {\n return (await this.http.getText(crateUrl)).body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n /**\n * Computes the dependency URL for a crate, given\n * registry information\n */\n private static getDependencyUrl(\n info: RegistryInfo,\n packageName: string,\n ): string {\n switch (info.flavor) {\n case 'crates.io':\n return `https://crates.io/crates/${packageName}`;\n case 'cloudsmith': {\n // input: https://dl.cloudsmith.io/basic/$org/$repo/cargo/index.git\n const tokens = info.url.pathname.split('/');\n const org = tokens[2];\n const repo = tokens[3];\n return `https://cloudsmith.io/~${org}/repos/${repo}/packages/detail/cargo/${packageName}`;\n }\n default:\n return `${info.url}/${packageName}`;\n }\n }\n\n /**\n * Given a Git URL, computes a semi-human-readable name for a folder in which to\n * clone the repository.\n */\n private static cacheDirFromUrl(url: URL): string {\n const proto = url.protocol.replace(regEx(/:$/), '');\n const host = url.hostname;\n const hash = toSha256(url.pathname).substring(0, 7);\n\n return `crate-registry-${proto}-${host}-${hash}`;\n }\n\n private static isSparseRegistry(url: string): boolean {\n const parsed = parseUrl(url);\n if (!parsed) {\n return false;\n }\n return parsed.protocol.startsWith('sparse+');\n }\n\n /**\n * Fetches information about a registry, by url.\n * If no url is given, assumes crates.io.\n * If an url is given, assumes it's a valid Git repository\n * url and clones it to cache.\n */\n private static async fetchRegistryInfo({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<RegistryInfo | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const isSparseRegistry = CrateDatasource.isSparseRegistry(registryUrl);\n const registryFetchUrl = isSparseRegistry\n ? registryUrl.replace(/^sparse\\+/, '')\n : registryUrl;\n\n const url = parseUrl(registryFetchUrl);\n if (!url) {\n logger.debug(`Could not parse registry URL ${registryFetchUrl}`);\n return null;\n }\n\n let flavor: RegistryFlavor;\n if (url.hostname === 'index.crates.io') {\n flavor = 'crates.io';\n } else if (url.hostname === 'dl.cloudsmith.io') {\n flavor = 'cloudsmith';\n } else {\n flavor = 'other';\n }\n\n const registry: RegistryInfo = {\n flavor,\n rawUrl: registryFetchUrl,\n url,\n };\n\n if (\n registry.flavor !== 'crates.io' &&\n !GlobalConfig.get('allowCustomCrateRegistries')\n ) {\n logger.warn(\n 'crate datasource: allowCustomCrateRegistries=true is required for registries other than crates.io, bailing out',\n );\n return null;\n }\n if (!isSparseRegistry) {\n const cacheKey = `crate-datasource/registry-clone-path/${registryFetchUrl}`;\n const lockKey = registryFetchUrl;\n\n const executionTimeout = GlobalConfig.get('executionTimeout') * 60 * 1000;\n const gitTimeout = GlobalConfig.get('gitTimeout') || executionTimeout;\n const releaseLock = await acquireLock(\n lockKey,\n 'crate-registry',\n gitTimeout,\n );\n try {\n const cached = memCache.get<CloneResult>(cacheKey);\n\n if (cached?.err) {\n logger.warn(\n { err: cached.err, packageName, registryFetchUrl },\n 'Previous git clone failed, bailing out.',\n );\n return null;\n }\n\n if (cached?.clonePath) {\n registry.clonePath = cached.clonePath;\n return registry;\n }\n\n const clonePath = upath.join(\n privateCacheDir(),\n CrateDatasource.cacheDirFromUrl(url),\n );\n\n const result = await CrateDatasource.clone(\n registryFetchUrl,\n clonePath,\n packageName,\n );\n\n memCache.set(cacheKey, result);\n\n if (result.err) {\n logger.warn(\n { err: result.err, packageName, registryFetchUrl },\n 'Git clone failed, bailing out.',\n );\n return null;\n }\n\n registry.clonePath = result.clonePath;\n } finally {\n releaseLock();\n }\n }\n\n return registry;\n }\n\n private static async clone(\n registryFetchUrl: string,\n clonePath: string,\n packageName: string,\n ): Promise<CloneResult> {\n logger.info(\n { clonePath, registryFetchUrl },\n `Cloning private cargo registry`,\n );\n\n const git = createSimpleGit({\n config: { maxConcurrentProcesses: 1 },\n });\n\n try {\n await git.clone(registryFetchUrl, clonePath, {\n '--depth': 1,\n });\n return { clonePath };\n } catch (err) {\n if (\n err.message.includes(\n 'fatal: dumb http transport does not support shallow capabilities',\n )\n ) {\n logger.info(\n { packageName, registryFetchUrl },\n 'failed to shallow clone git registry, doing full clone',\n );\n try {\n await git.clone(registryFetchUrl, clonePath);\n return { clonePath };\n } catch (err) {\n logger.warn(\n { err, packageName, registryFetchUrl },\n 'failed cloning git registry',\n );\n return { err };\n }\n } else {\n logger.warn(\n { err, packageName, registryFetchUrl },\n 'failed cloning git registry',\n );\n return { err };\n }\n }\n }\n\n private static isCratesIo(registryUrl: string | undefined): boolean {\n if (!registryUrl) {\n return false;\n }\n const normalized = registryUrl.replace(regEx(/^sparse\\+/), '');\n const parsed = parseUrl(normalized);\n return parsed?.hostname === 'index.crates.io';\n }\n\n public static getIndexSuffix(packageName: string): string[] {\n const len = packageName.length;\n\n if (len === 1) {\n return ['1', packageName];\n }\n if (len === 2) {\n return ['2', packageName];\n }\n if (len === 3) {\n return ['3', packageName[0], packageName];\n }\n\n return [packageName.slice(0, 2), packageName.slice(2, 4), packageName];\n }\n\n private async _postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n if (release.releaseTimestamp) {\n return release;\n }\n\n // Look up the registry config from cache (populated during getReleases)\n const rawUrl = registryUrl?.replace(/^sparse\\+/, '');\n if (!rawUrl) {\n return release;\n }\n const cacheKey = `crate-datasource/registry-config/${rawUrl}`;\n const config = memCache.get<{ dl: string; api?: string }>(cacheKey);\n if (!config?.api) {\n return release;\n }\n\n const apiBaseUrl = joinUrlParts(config.api, 'api/v1/');\n const url = `${apiBaseUrl}crates/${packageName}/${release.versionOrig ?? release.version}`;\n logger.trace(\n { url, packageName, version: release.version, registryUrl },\n 'fetching crate release timestamp',\n );\n // Getting release timestamp could become unnecessary if the manual backfill of `pubtime` mentioned in\n // https://github.com/rust-lang/cargo/issues/15491 is done for all packages.\n const { body: releaseTimestamp } = await this.http.getJson(\n url,\n { cacheProvider: memCacheProvider },\n ReleaseTimestamp,\n );\n release.releaseTimestamp = releaseTimestamp;\n return release;\n }\n\n override postprocessRelease(\n config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n return withCache(\n {\n namespace: `datasource-crate`,\n key: `postprocessRelease:${config.registryUrl}:${config.packageName}:${release.version}`,\n ttlMinutes: 7 * 24 * 60,\n cacheable: CrateDatasource.isCratesIo(config.registryUrl ?? undefined),\n },\n () => this._postprocessRelease(config, release),\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["cargoVersioning.id","memCache.get"],"sources":["../../../../lib/modules/datasource/crate/index.ts"],"sourcesContent":["import upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { privateCacheDir, readCacheFile } from '../../../util/fs/index.ts';\nimport { createSimpleGit } from '../../../util/git/index.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport { acquireLock } from '../../../util/mutex.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { Json } from '../../../util/schema-utils/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts, parseUrl } from '../../../util/url.ts';\nimport * as cargoVersioning from '../../versioning/cargo/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport type { CrateMetadata } from './schema.ts';\nimport {\n CrateMetadataResponse,\n RegistryConfig,\n ReleaseTimestamp,\n} from './schema.ts';\nimport type { CrateRecord, RegistryFlavor, RegistryInfo } from './types.ts';\n\ntype CloneResult =\n | {\n err: Error;\n clonePath?: undefined;\n }\n | {\n clonePath: string;\n err?: undefined;\n };\n\nexport class CrateDatasource extends Datasource {\n static readonly id = 'crate';\n\n constructor() {\n super(CrateDatasource.id);\n }\n\n override defaultRegistryUrls = ['sparse+https://index.crates.io/'];\n\n override defaultVersioning = cargoVersioning.id;\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from `pubtime` field from crates.io index if available, or `version.created_at` field from crates.io API otherwise.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore if -- should never happen */\n if (!registryUrl) {\n logger.warn(\n 'crate datasource: No registryUrl specified, cannot perform getReleases',\n );\n return null;\n }\n\n const registryInfo = await CrateDatasource.fetchRegistryInfo({\n packageName,\n registryUrl,\n });\n if (!registryInfo) {\n logger.debug(`Could not fetch registry info from ${registryUrl}`);\n return null;\n }\n\n const dependencyUrl = CrateDatasource.getDependencyUrl(\n registryInfo,\n packageName,\n );\n\n const payload = await this.fetchCrateRecordsPayload(\n registryInfo,\n packageName,\n );\n const lines = payload\n .split(newlineRegex) // break into lines\n .map((line) => line.trim()) // remove whitespace\n .filter((line) => line.length !== 0) // remove empty lines\n .map((line) => JSON.parse(line) as CrateRecord); // parse\n\n const metadata = await this.getCrateMetadata(registryInfo, packageName);\n\n const result: ReleaseResult = {\n dependencyUrl,\n releases: [],\n };\n\n if (metadata?.homepage) {\n result.homepage = metadata.homepage;\n }\n\n if (metadata?.repository) {\n result.sourceUrl = metadata.repository;\n }\n\n result.releases = lines\n .map((line) => {\n const versionOrig = line.vers;\n const version = versionOrig.replace(/\\+.*$/, '');\n const release: Release = { version };\n\n if (versionOrig !== version) {\n release.versionOrig = versionOrig;\n }\n\n if (line.yanked) {\n release.isDeprecated = true;\n }\n\n if (line.rust_version) {\n release.constraints = { rust: [line.rust_version] };\n }\n\n if (line.pubtime) {\n release.releaseTimestamp = asTimestamp(line.pubtime);\n }\n\n return release;\n })\n .filter((release) => release.version);\n if (!result.releases.length) {\n return null;\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${CrateDatasource.id}`,\n // TODO: types (#22198)\n key: `${config.registryUrl}/${config.packageName}`,\n cacheable: CrateDatasource.isCratesIo(config.registryUrl),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Fetches the registry's config.json which provides the API base URL\n * and download URL template.\n * See: https://doc.rust-lang.org/cargo/reference/registry-index.html#index-configuration\n */\n private async fetchRegistryConfig(\n info: RegistryInfo,\n ): Promise<RegistryConfig | null> {\n const cacheKey = `crate-datasource/registry-config/${info.rawUrl}`;\n const cached = memCache.get<RegistryConfig>(cacheKey);\n if (cached) {\n return cached;\n }\n\n if (info.clonePath) {\n try {\n const configPath = upath.join(info.clonePath, 'config.json');\n const content = await readCacheFile(configPath, 'utf8');\n const parsed = Json.pipe(RegistryConfig).parse(content);\n memCache.set(cacheKey, parsed);\n return parsed;\n } catch {\n logger.debug(\n { registryUrl: info.rawUrl },\n 'Could not read config.json from cloned registry',\n );\n }\n } else {\n try {\n const configUrl = joinUrlParts(info.rawUrl, 'config.json');\n const { body } = await this.http.getJson(configUrl, RegistryConfig);\n memCache.set(cacheKey, body);\n return body;\n } catch {\n logger.debug(\n { registryUrl: info.rawUrl },\n 'Could not fetch registry config.json',\n );\n }\n }\n\n return null;\n }\n\n private async _getCrateMetadata(\n info: RegistryInfo,\n packageName: string,\n ): Promise<CrateMetadata | null> {\n const registryConfig = await this.fetchRegistryConfig(info);\n if (!registryConfig?.api) {\n return null;\n }\n\n const apiBaseUrl = joinUrlParts(registryConfig.api, 'api/v1/');\n\n // The `?include=` suffix is required to avoid unnecessary database queries\n // on the crates.io server. This lets us work around the regular request\n // throttling of one request per second.\n const crateUrl = `${apiBaseUrl}crates/${packageName}?include=`;\n\n logger.trace(\n { crateUrl, packageName, registryUrl: info.rawUrl },\n 'downloading crate metadata',\n );\n\n try {\n const { body } = await this.http.getJson(crateUrl, CrateMetadataResponse);\n return body.crate;\n } catch (err) {\n logger.debug(\n { err, packageName, registryUrl: info.rawUrl },\n 'failed to download crate metadata',\n );\n }\n\n return null;\n }\n\n public getCrateMetadata(\n info: RegistryInfo,\n packageName: string,\n ): Promise<CrateMetadata | null> {\n return withCache(\n {\n namespace: `datasource-${CrateDatasource.id}-metadata`,\n key: `${info.rawUrl}/${packageName}`,\n cacheable: info.flavor === 'crates.io',\n ttlMinutes: 24 * 60, // 24 hours\n },\n () => this._getCrateMetadata(info, packageName),\n );\n }\n\n public async fetchCrateRecordsPayload(\n info: RegistryInfo,\n packageName: string,\n ): Promise<string> {\n if (info.clonePath) {\n const path = upath.join(\n info.clonePath,\n ...CrateDatasource.getIndexSuffix(packageName),\n );\n return readCacheFile(path, 'utf8');\n }\n\n // sparse index\n const packageSuffix = CrateDatasource.getIndexSuffix(\n packageName.toLowerCase(),\n );\n const crateUrl = joinUrlParts(info.rawUrl, ...packageSuffix);\n logger.trace(\n { crateUrl, packageName, registryUrl: info.rawUrl },\n 'fetching crate records from sparse index',\n );\n try {\n return (await this.http.getText(crateUrl)).body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n /**\n * Computes the dependency URL for a crate, given\n * registry information\n */\n private static getDependencyUrl(\n info: RegistryInfo,\n packageName: string,\n ): string {\n switch (info.flavor) {\n case 'crates.io':\n return `https://crates.io/crates/${packageName}`;\n case 'cloudsmith': {\n // input: https://dl.cloudsmith.io/basic/$org/$repo/cargo/index.git\n const tokens = info.url.pathname.split('/');\n const org = tokens[2];\n const repo = tokens[3];\n return `https://cloudsmith.io/~${org}/repos/${repo}/packages/detail/cargo/${packageName}`;\n }\n default:\n return `${info.url}/${packageName}`;\n }\n }\n\n /**\n * Given a Git URL, computes a semi-human-readable name for a folder in which to\n * clone the repository.\n */\n private static cacheDirFromUrl(url: URL): string {\n const proto = url.protocol.replace(regEx(/:$/), '');\n const host = url.hostname;\n const hash = toSha256(url.pathname).substring(0, 7);\n\n return `crate-registry-${proto}-${host}-${hash}`;\n }\n\n private static isSparseRegistry(url: string): boolean {\n const parsed = parseUrl(url);\n if (!parsed) {\n return false;\n }\n return parsed.protocol.startsWith('sparse+');\n }\n\n /**\n * Fetches information about a registry, by url.\n * If no url is given, assumes crates.io.\n * If an url is given, assumes it's a valid Git repository\n * url and clones it to cache.\n */\n private static async fetchRegistryInfo({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<RegistryInfo | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const isSparseRegistry = CrateDatasource.isSparseRegistry(registryUrl);\n const registryFetchUrl = isSparseRegistry\n ? registryUrl.replace(/^sparse\\+/, '')\n : registryUrl;\n\n const url = parseUrl(registryFetchUrl);\n if (!url) {\n logger.debug(`Could not parse registry URL ${registryFetchUrl}`);\n return null;\n }\n\n let flavor: RegistryFlavor;\n if (url.hostname === 'index.crates.io') {\n flavor = 'crates.io';\n } else if (url.hostname === 'dl.cloudsmith.io') {\n flavor = 'cloudsmith';\n } else {\n flavor = 'other';\n }\n\n const registry: RegistryInfo = {\n flavor,\n rawUrl: registryFetchUrl,\n url,\n };\n\n if (\n registry.flavor !== 'crates.io' &&\n !GlobalConfig.get('allowCustomCrateRegistries')\n ) {\n logger.warn(\n 'crate datasource: allowCustomCrateRegistries=true is required for registries other than crates.io, bailing out',\n );\n return null;\n }\n if (!isSparseRegistry) {\n const cacheKey = `crate-datasource/registry-clone-path/${registryFetchUrl}`;\n const lockKey = registryFetchUrl;\n\n const executionTimeout = GlobalConfig.get('executionTimeout') * 60 * 1000;\n const gitTimeout = GlobalConfig.get('gitTimeout') || executionTimeout;\n const releaseLock = await acquireLock(\n lockKey,\n 'crate-registry',\n gitTimeout,\n );\n try {\n const cached = memCache.get<CloneResult>(cacheKey);\n\n if (cached?.err) {\n logger.warn(\n { err: cached.err, packageName, registryFetchUrl },\n 'Previous git clone failed, bailing out.',\n );\n return null;\n }\n\n if (cached?.clonePath) {\n registry.clonePath = cached.clonePath;\n return registry;\n }\n\n const clonePath = upath.join(\n privateCacheDir(),\n CrateDatasource.cacheDirFromUrl(url),\n );\n\n const result = await CrateDatasource.clone(\n registryFetchUrl,\n clonePath,\n packageName,\n );\n\n memCache.set(cacheKey, result);\n\n if (result.err) {\n logger.warn(\n { err: result.err, packageName, registryFetchUrl },\n 'Git clone failed, bailing out.',\n );\n return null;\n }\n\n registry.clonePath = result.clonePath;\n } finally {\n releaseLock();\n }\n }\n\n return registry;\n }\n\n private static async clone(\n registryFetchUrl: string,\n clonePath: string,\n packageName: string,\n ): Promise<CloneResult> {\n logger.info(\n { clonePath, registryFetchUrl },\n `Cloning private cargo registry`,\n );\n\n const git = createSimpleGit({\n config: { maxConcurrentProcesses: 1 },\n });\n\n try {\n await git.clone(registryFetchUrl, clonePath, {\n '--depth': 1,\n });\n return { clonePath };\n } catch (err) {\n if (\n err.message.includes(\n 'fatal: dumb http transport does not support shallow capabilities',\n )\n ) {\n logger.info(\n { packageName, registryFetchUrl },\n 'failed to shallow clone git registry, doing full clone',\n );\n try {\n await git.clone(registryFetchUrl, clonePath);\n return { clonePath };\n } catch (err) {\n logger.warn(\n { err, packageName, registryFetchUrl },\n 'failed cloning git registry',\n );\n return { err };\n }\n } else {\n logger.warn(\n { err, packageName, registryFetchUrl },\n 'failed cloning git registry',\n );\n return { err };\n }\n }\n }\n\n private static isCratesIo(registryUrl: string | undefined): boolean {\n if (!registryUrl) {\n return false;\n }\n const normalized = registryUrl.replace(regEx(/^sparse\\+/), '');\n const parsed = parseUrl(normalized);\n return parsed?.hostname === 'index.crates.io';\n }\n\n public static getIndexSuffix(packageName: string): string[] {\n const len = packageName.length;\n\n if (len === 1) {\n return ['1', packageName];\n }\n if (len === 2) {\n return ['2', packageName];\n }\n if (len === 3) {\n return ['3', packageName[0], packageName];\n }\n\n return [packageName.slice(0, 2), packageName.slice(2, 4), packageName];\n }\n\n private async _postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n if (release.releaseTimestamp) {\n return release;\n }\n\n // Look up the registry config from cache (populated during getReleases)\n const rawUrl = registryUrl?.replace(/^sparse\\+/, '');\n if (!rawUrl) {\n return release;\n }\n const cacheKey = `crate-datasource/registry-config/${rawUrl}`;\n const config = memCache.get<{ dl: string; api?: string }>(cacheKey);\n if (!config?.api) {\n return release;\n }\n\n const apiBaseUrl = joinUrlParts(config.api, 'api/v1/');\n const url = `${apiBaseUrl}crates/${packageName}/${release.versionOrig ?? release.version}`;\n logger.trace(\n { url, packageName, version: release.version, registryUrl },\n 'fetching crate release timestamp',\n );\n // Getting release timestamp could become unnecessary if the manual backfill of `pubtime` mentioned in\n // https://github.com/rust-lang/cargo/issues/15491 is done for all packages.\n const { body: releaseTimestamp } = await this.http.getJson(\n url,\n { cacheProvider: memCacheProvider },\n ReleaseTimestamp,\n );\n release.releaseTimestamp = releaseTimestamp;\n return release;\n }\n\n override postprocessRelease(\n config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n return withCache(\n {\n namespace: `datasource-crate`,\n key: `postprocessRelease:${config.registryUrl}:${config.packageName}:${release.version}`,\n ttlMinutes: 7 * 24 * 60,\n cacheable: CrateDatasource.isCratesIo(config.registryUrl ?? undefined),\n },\n () => this._postprocessRelease(config, release),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -6,7 +6,8 @@ var TomlFetcher = class {
|
|
|
6
6
|
return (await http.getToml(registryURL)).body;
|
|
7
7
|
}
|
|
8
8
|
async readFile(registryURL) {
|
|
9
|
-
|
|
9
|
+
const fileContent = await readLocalFile(registryURL, "utf8");
|
|
10
|
+
return parse(fileContent);
|
|
10
11
|
}
|
|
11
12
|
};
|
|
12
13
|
//#endregion
|