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":"toml.js","names":["parseToml"],"sources":["../../../../../lib/modules/datasource/custom/formats/toml.ts"],"sourcesContent":["import { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport { parse as parseToml } from '../../../../util/toml.ts';\nimport type { CustomDatasourceFetcher } from './types.ts';\n\nexport class TomlFetcher implements CustomDatasourceFetcher {\n async fetch(http: Http, registryURL: string): Promise<unknown> {\n const response = await http.getToml(registryURL);\n\n return response.body;\n }\n\n async readFile(registryURL: string): Promise<unknown> {\n const fileContent = await readLocalFile(registryURL, 'utf8');\n\n return parseToml(fileContent!);\n }\n}\n"],"mappings":";;;AAKA,IAAa,cAAb,MAA4D;CAC1D,MAAM,MAAM,MAAY,aAAuC;EAG7D,QAAO,MAFgB,KAAK,QAAQ,WAAW,EAAA,CAE/B;CAClB;CAEA,MAAM,SAAS,aAAuC;
|
|
1
|
+
{"version":3,"file":"toml.js","names":["parseToml"],"sources":["../../../../../lib/modules/datasource/custom/formats/toml.ts"],"sourcesContent":["import { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport { parse as parseToml } from '../../../../util/toml.ts';\nimport type { CustomDatasourceFetcher } from './types.ts';\n\nexport class TomlFetcher implements CustomDatasourceFetcher {\n async fetch(http: Http, registryURL: string): Promise<unknown> {\n const response = await http.getToml(registryURL);\n\n return response.body;\n }\n\n async readFile(registryURL: string): Promise<unknown> {\n const fileContent = await readLocalFile(registryURL, 'utf8');\n\n return parseToml(fileContent!);\n }\n}\n"],"mappings":";;;AAKA,IAAa,cAAb,MAA4D;CAC1D,MAAM,MAAM,MAAY,aAAuC;EAG7D,QAAO,MAFgB,KAAK,QAAQ,WAAW,EAAA,CAE/B;CAClB;CAEA,MAAM,SAAS,aAAuC;EACpD,MAAM,cAAc,MAAM,cAAc,aAAa,MAAM;EAE3D,OAAOA,MAAU,WAAY;CAC/B;AACF"}
|
|
@@ -3,10 +3,12 @@ import { readLocalFile } from "../../../../util/fs/index.js";
|
|
|
3
3
|
//#region lib/modules/datasource/custom/formats/yaml.ts
|
|
4
4
|
var YamlFetcher = class {
|
|
5
5
|
async fetch(http, registryURL) {
|
|
6
|
-
|
|
6
|
+
const response = await http.getText(registryURL);
|
|
7
|
+
return parseSingleYaml(response.body);
|
|
7
8
|
}
|
|
8
9
|
async readFile(registryURL) {
|
|
9
|
-
|
|
10
|
+
const fileContent = await readLocalFile(registryURL, "utf8");
|
|
11
|
+
return parseSingleYaml(fileContent);
|
|
10
12
|
}
|
|
11
13
|
};
|
|
12
14
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml.js","names":[],"sources":["../../../../../lib/modules/datasource/custom/formats/yaml.ts"],"sourcesContent":["import { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport type { CustomDatasourceFetcher } from './types.ts';\n\nexport class YamlFetcher implements CustomDatasourceFetcher {\n async fetch(http: Http, registryURL: string): Promise<unknown> {\n const response = await http.getText(registryURL);\n\n return parseSingleYaml(response.body);\n }\n\n async readFile(registryURL: string): Promise<unknown> {\n const fileContent = await readLocalFile(registryURL, 'utf8');\n\n return parseSingleYaml(fileContent!);\n }\n}\n"],"mappings":";;;AAKA,IAAa,cAAb,MAA4D;CAC1D,MAAM,MAAM,MAAY,aAAuC;
|
|
1
|
+
{"version":3,"file":"yaml.js","names":[],"sources":["../../../../../lib/modules/datasource/custom/formats/yaml.ts"],"sourcesContent":["import { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport type { CustomDatasourceFetcher } from './types.ts';\n\nexport class YamlFetcher implements CustomDatasourceFetcher {\n async fetch(http: Http, registryURL: string): Promise<unknown> {\n const response = await http.getText(registryURL);\n\n return parseSingleYaml(response.body);\n }\n\n async readFile(registryURL: string): Promise<unknown> {\n const fileContent = await readLocalFile(registryURL, 'utf8');\n\n return parseSingleYaml(fileContent!);\n }\n}\n"],"mappings":";;;AAKA,IAAa,cAAb,MAA4D;CAC1D,MAAM,MAAM,MAAY,aAAuC;EAC7D,MAAM,WAAW,MAAM,KAAK,QAAQ,WAAW;EAE/C,OAAO,gBAAgB,SAAS,IAAI;CACtC;CAEA,MAAM,SAAS,aAAuC;EACpD,MAAM,cAAc,MAAM,cAAc,aAAa,MAAM;EAE3D,OAAO,gBAAgB,WAAY;CACrC;AACF"}
|
|
@@ -25,7 +25,8 @@ function parseChecksumsFromInRelease(inReleaseContent, packagePath) {
|
|
|
25
25
|
* @returns resolves to the SHA256 checksum
|
|
26
26
|
*/
|
|
27
27
|
function computeFileChecksum(filePath) {
|
|
28
|
-
|
|
28
|
+
const stream = createCacheReadStream(filePath);
|
|
29
|
+
return hashStream(stream, "sha256");
|
|
29
30
|
}
|
|
30
31
|
//#endregion
|
|
31
32
|
export { computeFileChecksum, parseChecksumsFromInRelease };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checksum.js","names":[],"sources":["../../../../lib/modules/datasource/deb/checksum.ts"],"sourcesContent":["import { createCacheReadStream } from '../../../util/fs/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { escapeRegExp, newlineRegex, regEx } from '../../../util/regex.ts';\n\n/**\n * Parses the SHA256 checksum for a specified package path from the InRelease content.\n *\n * @param inReleaseContent - content of the InRelease file\n * @param packagePath - path of the package file (e.g., 'contrib/binary-amd64/Packages.gz')\n * @returns The SHA256 checksum if found, otherwise undefined\n */\nexport function parseChecksumsFromInRelease(\n inReleaseContent: string,\n packagePath: string,\n): string | null {\n const lines = inReleaseContent.split(newlineRegex);\n const regex = regEx(\n `([a-f0-9]{64})\\\\s+\\\\d+\\\\s+${escapeRegExp(packagePath)}$`,\n );\n\n for (const line of lines) {\n const match = regex.exec(line);\n if (match) {\n return match[1];\n }\n }\n\n return null;\n}\n\n/**\n * Computes the SHA256 checksum of a specified file.\n *\n * @param filePath - path of the file\n * @returns resolves to the SHA256 checksum\n */\nexport function computeFileChecksum(filePath: string): Promise<string> {\n const stream = createCacheReadStream(filePath);\n return hashStream(stream, 'sha256');\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,4BACd,kBACA,aACe;CACf,MAAM,QAAQ,iBAAiB,MAAM,YAAY;CACjD,MAAM,QAAQ,MACZ,6BAA6B,aAAa,WAAW,EAAE,EACzD;CAEA,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,MAAM,KAAK,IAAI;EAC7B,IAAI,OACF,OAAO,MAAM;CAEjB;CAEA,OAAO;AACT;;;;;;;AAQA,SAAgB,oBAAoB,UAAmC;
|
|
1
|
+
{"version":3,"file":"checksum.js","names":[],"sources":["../../../../lib/modules/datasource/deb/checksum.ts"],"sourcesContent":["import { createCacheReadStream } from '../../../util/fs/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { escapeRegExp, newlineRegex, regEx } from '../../../util/regex.ts';\n\n/**\n * Parses the SHA256 checksum for a specified package path from the InRelease content.\n *\n * @param inReleaseContent - content of the InRelease file\n * @param packagePath - path of the package file (e.g., 'contrib/binary-amd64/Packages.gz')\n * @returns The SHA256 checksum if found, otherwise undefined\n */\nexport function parseChecksumsFromInRelease(\n inReleaseContent: string,\n packagePath: string,\n): string | null {\n const lines = inReleaseContent.split(newlineRegex);\n const regex = regEx(\n `([a-f0-9]{64})\\\\s+\\\\d+\\\\s+${escapeRegExp(packagePath)}$`,\n );\n\n for (const line of lines) {\n const match = regex.exec(line);\n if (match) {\n return match[1];\n }\n }\n\n return null;\n}\n\n/**\n * Computes the SHA256 checksum of a specified file.\n *\n * @param filePath - path of the file\n * @returns resolves to the SHA256 checksum\n */\nexport function computeFileChecksum(filePath: string): Promise<string> {\n const stream = createCacheReadStream(filePath);\n return hashStream(stream, 'sha256');\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,4BACd,kBACA,aACe;CACf,MAAM,QAAQ,iBAAiB,MAAM,YAAY;CACjD,MAAM,QAAQ,MACZ,6BAA6B,aAAa,WAAW,EAAE,EACzD;CAEA,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,MAAM,KAAK,IAAI;EAC7B,IAAI,OACF,OAAO,MAAM;CAEjB;CAEA,OAAO;AACT;;;;;;;AAQA,SAAgB,oBAAoB,UAAmC;CACrE,MAAM,SAAS,sBAAsB,QAAQ;CAC7C,OAAO,WAAW,QAAQ,QAAQ;AACpC"}
|
|
@@ -60,7 +60,9 @@ async function downloadPackageFile(basePackageUrl, compression, compressedFile,
|
|
|
60
60
|
logger.debug(`No need to download ${packageUrl}, file is up to date.`);
|
|
61
61
|
return false;
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
const readStream = http.stream(packageUrl);
|
|
64
|
+
const writeStream = createCacheWriteStream(compressedFile);
|
|
65
|
+
await pipeline(readStream, writeStream);
|
|
64
66
|
logger.debug({
|
|
65
67
|
url: packageUrl,
|
|
66
68
|
targetFile: compressedFile
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packages.js","names":["fs.ensureCacheDir","fs.rmCache","fs.createCacheWriteStream","fs.pipeline"],"sources":["../../../../lib/modules/datasource/deb/packages.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport {\n computeFileChecksum,\n parseChecksumsFromInRelease,\n} from './checksum.ts';\nimport { cacheSubDir } from './common.ts';\nimport { checkIfModified, getBaseSuiteUrl } from './url.ts';\nimport { extract, getFileCreationTime } from './utils.ts';\n\n/**\n * Downloads and extracts a package file from a component URL.\n *\n * @param componentUrl - The URL of the component.\n * @returns The path to the extracted file and the last modification timestamp.\n * @throws Will throw an error if no valid compression method is found.\n */\nexport async function downloadAndExtractPackage(\n componentUrl: string,\n http: Http,\n): Promise<{ extractedFile: string; lastTimestamp: Date }> {\n const packageUrlHash = toSha256(componentUrl);\n const fullCacheDir = await fs.ensureCacheDir(cacheSubDir);\n const extractedFile = upath.join(fullCacheDir, `${packageUrlHash}.txt`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compression = 'gz';\n const compressedFile = upath.join(\n fullCacheDir,\n `${randomUUID()}_${packageUrlHash}.${compression}`,\n );\n\n const wasUpdated = await downloadPackageFile(\n componentUrl,\n compression,\n compressedFile,\n http,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n await extract(compressedFile, compression, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (error) {\n logger.warn(\n {\n compressedFile,\n componentUrl,\n compression,\n error: error.message,\n },\n 'Failed to extract package file from compressed file',\n );\n } finally {\n await fs.rmCache(compressedFile);\n }\n }\n\n if (!lastTimestamp) {\n //extracting went wrong\n throw new Error('Missing metadata in extracted package index file!');\n }\n\n return { extractedFile, lastTimestamp };\n}\n\n/**\n * Downloads a package file if it has been modified since the last download timestamp.\n *\n * @param basePackageUrl - The base URL of the package.\n * @param compression - The compression method used (e.g., 'gz').\n * @param compressedFile - The path where the compressed file will be saved.\n * @param lastDownloadTimestamp - The timestamp of the last download.\n * @returns True if the file was downloaded, otherwise false.\n */\nexport async function downloadPackageFile(\n basePackageUrl: string,\n compression: string,\n compressedFile: string,\n http: Http,\n lastDownloadTimestamp?: Date,\n): Promise<boolean> {\n const baseSuiteUrl = getBaseSuiteUrl(basePackageUrl);\n const packageUrl = joinUrlParts(basePackageUrl, `Packages.${compression}`);\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await checkIfModified(\n packageUrl,\n lastDownloadTimestamp,\n http,\n );\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${packageUrl}, file is up to date.`);\n return false;\n }\n const readStream = http.stream(packageUrl);\n const writeStream = fs.createCacheWriteStream(compressedFile);\n await fs.pipeline(readStream, writeStream);\n logger.debug(\n { url: packageUrl, targetFile: compressedFile },\n 'Downloading Debian package file',\n );\n\n let inReleaseContent = '';\n\n try {\n inReleaseContent = await fetchInReleaseFile(baseSuiteUrl, http);\n } catch (error) {\n // This is expected to fail for Artifactory if GPG verification is not enabled\n logger.debug(\n { url: baseSuiteUrl, err: error },\n 'Could not fetch InRelease file',\n );\n }\n\n if (inReleaseContent) {\n const actualChecksum = await computeFileChecksum(compressedFile);\n const expectedChecksum = parseChecksumsFromInRelease(\n inReleaseContent,\n // path to the Package.gz file\n packageUrl.replace(`${baseSuiteUrl}/`, ''),\n );\n if (actualChecksum !== expectedChecksum) {\n await fs.rmCache(compressedFile);\n throw new Error('SHA256 checksum validation failed');\n }\n }\n\n return needsToDownload;\n}\n\n/**\n * Fetches the content of the InRelease file from the given base suite URL.\n *\n * @param baseReleaseUrl - The base URL of the suite (e.g., 'https://deb.debian.org/debian/dists/bullseye').\n * @returns resolves to the content of the InRelease file.\n * @throws An error if the InRelease file could not be downloaded.\n */\nexport async function fetchInReleaseFile(\n baseReleaseUrl: string,\n http: Http,\n): Promise<string> {\n const inReleaseUrl = joinUrlParts(baseReleaseUrl, 'InRelease');\n const response = await http.getText(inReleaseUrl);\n return response.body;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAsBA,eAAsB,0BACpB,cACA,MACyD;CACzD,MAAM,iBAAiB,SAAS,YAAY;CAC5C,MAAM,eAAe,MAAMA,eAAAA,KAA6B;CACxD,MAAM,gBAAgB,MAAM,KAAK,cAAc,GAAG,eAAe,KAAK;CACtE,IAAI,gBAAgB,MAAM,oBAAoB,aAAa;CAE3D,MAAM,cAAc;CACpB,MAAM,iBAAiB,MAAM,KAC3B,cACA,GAAG,WAAW,EAAE,GAAG,eAAe,GAAG,aACvC;CAUA,IAAI,MARqB,oBACvB,cACA,aACA,gBACA,MACA,aACF,KAEkB,CAAC,eACjB,IAAI;EACF,MAAM,QAAQ,gBAAgB,aAAa,aAAa;EACxD,gBAAgB,MAAM,oBAAoB,aAAa;CACzD,SAAS,OAAO;EACd,OAAO,KACL;GACE;GACA;GACA;GACA,OAAO,MAAM;EACf,GACA,qDACF;CACF,UAAU;EACR,MAAMC,QAAW,cAAc;CACjC;CAGF,IAAI,CAAC,eAEH,MAAM,IAAI,MAAM,mDAAmD;CAGrE,OAAO;EAAE;EAAe;CAAc;AACxC;;;;;;;;;;AAWA,eAAsB,oBACpB,gBACA,aACA,gBACA,MACA,uBACkB;CAClB,MAAM,eAAe,gBAAgB,cAAc;CACnD,MAAM,aAAa,aAAa,gBAAgB,YAAY,aAAa;CACzE,IAAI,kBAAkB;CAEtB,IAAI,uBACF,kBAAkB,MAAM,gBACtB,YACA,uBACA,IACF;CAGF,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,uBAAuB,WAAW,sBAAsB;EACrE,OAAO;CACT;
|
|
1
|
+
{"version":3,"file":"packages.js","names":["fs.ensureCacheDir","fs.rmCache","fs.createCacheWriteStream","fs.pipeline"],"sources":["../../../../lib/modules/datasource/deb/packages.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport {\n computeFileChecksum,\n parseChecksumsFromInRelease,\n} from './checksum.ts';\nimport { cacheSubDir } from './common.ts';\nimport { checkIfModified, getBaseSuiteUrl } from './url.ts';\nimport { extract, getFileCreationTime } from './utils.ts';\n\n/**\n * Downloads and extracts a package file from a component URL.\n *\n * @param componentUrl - The URL of the component.\n * @returns The path to the extracted file and the last modification timestamp.\n * @throws Will throw an error if no valid compression method is found.\n */\nexport async function downloadAndExtractPackage(\n componentUrl: string,\n http: Http,\n): Promise<{ extractedFile: string; lastTimestamp: Date }> {\n const packageUrlHash = toSha256(componentUrl);\n const fullCacheDir = await fs.ensureCacheDir(cacheSubDir);\n const extractedFile = upath.join(fullCacheDir, `${packageUrlHash}.txt`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compression = 'gz';\n const compressedFile = upath.join(\n fullCacheDir,\n `${randomUUID()}_${packageUrlHash}.${compression}`,\n );\n\n const wasUpdated = await downloadPackageFile(\n componentUrl,\n compression,\n compressedFile,\n http,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n await extract(compressedFile, compression, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (error) {\n logger.warn(\n {\n compressedFile,\n componentUrl,\n compression,\n error: error.message,\n },\n 'Failed to extract package file from compressed file',\n );\n } finally {\n await fs.rmCache(compressedFile);\n }\n }\n\n if (!lastTimestamp) {\n //extracting went wrong\n throw new Error('Missing metadata in extracted package index file!');\n }\n\n return { extractedFile, lastTimestamp };\n}\n\n/**\n * Downloads a package file if it has been modified since the last download timestamp.\n *\n * @param basePackageUrl - The base URL of the package.\n * @param compression - The compression method used (e.g., 'gz').\n * @param compressedFile - The path where the compressed file will be saved.\n * @param lastDownloadTimestamp - The timestamp of the last download.\n * @returns True if the file was downloaded, otherwise false.\n */\nexport async function downloadPackageFile(\n basePackageUrl: string,\n compression: string,\n compressedFile: string,\n http: Http,\n lastDownloadTimestamp?: Date,\n): Promise<boolean> {\n const baseSuiteUrl = getBaseSuiteUrl(basePackageUrl);\n const packageUrl = joinUrlParts(basePackageUrl, `Packages.${compression}`);\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await checkIfModified(\n packageUrl,\n lastDownloadTimestamp,\n http,\n );\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${packageUrl}, file is up to date.`);\n return false;\n }\n const readStream = http.stream(packageUrl);\n const writeStream = fs.createCacheWriteStream(compressedFile);\n await fs.pipeline(readStream, writeStream);\n logger.debug(\n { url: packageUrl, targetFile: compressedFile },\n 'Downloading Debian package file',\n );\n\n let inReleaseContent = '';\n\n try {\n inReleaseContent = await fetchInReleaseFile(baseSuiteUrl, http);\n } catch (error) {\n // This is expected to fail for Artifactory if GPG verification is not enabled\n logger.debug(\n { url: baseSuiteUrl, err: error },\n 'Could not fetch InRelease file',\n );\n }\n\n if (inReleaseContent) {\n const actualChecksum = await computeFileChecksum(compressedFile);\n const expectedChecksum = parseChecksumsFromInRelease(\n inReleaseContent,\n // path to the Package.gz file\n packageUrl.replace(`${baseSuiteUrl}/`, ''),\n );\n if (actualChecksum !== expectedChecksum) {\n await fs.rmCache(compressedFile);\n throw new Error('SHA256 checksum validation failed');\n }\n }\n\n return needsToDownload;\n}\n\n/**\n * Fetches the content of the InRelease file from the given base suite URL.\n *\n * @param baseReleaseUrl - The base URL of the suite (e.g., 'https://deb.debian.org/debian/dists/bullseye').\n * @returns resolves to the content of the InRelease file.\n * @throws An error if the InRelease file could not be downloaded.\n */\nexport async function fetchInReleaseFile(\n baseReleaseUrl: string,\n http: Http,\n): Promise<string> {\n const inReleaseUrl = joinUrlParts(baseReleaseUrl, 'InRelease');\n const response = await http.getText(inReleaseUrl);\n return response.body;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAsBA,eAAsB,0BACpB,cACA,MACyD;CACzD,MAAM,iBAAiB,SAAS,YAAY;CAC5C,MAAM,eAAe,MAAMA,eAAAA,KAA6B;CACxD,MAAM,gBAAgB,MAAM,KAAK,cAAc,GAAG,eAAe,KAAK;CACtE,IAAI,gBAAgB,MAAM,oBAAoB,aAAa;CAE3D,MAAM,cAAc;CACpB,MAAM,iBAAiB,MAAM,KAC3B,cACA,GAAG,WAAW,EAAE,GAAG,eAAe,GAAG,aACvC;CAUA,IAAI,MARqB,oBACvB,cACA,aACA,gBACA,MACA,aACF,KAEkB,CAAC,eACjB,IAAI;EACF,MAAM,QAAQ,gBAAgB,aAAa,aAAa;EACxD,gBAAgB,MAAM,oBAAoB,aAAa;CACzD,SAAS,OAAO;EACd,OAAO,KACL;GACE;GACA;GACA;GACA,OAAO,MAAM;EACf,GACA,qDACF;CACF,UAAU;EACR,MAAMC,QAAW,cAAc;CACjC;CAGF,IAAI,CAAC,eAEH,MAAM,IAAI,MAAM,mDAAmD;CAGrE,OAAO;EAAE;EAAe;CAAc;AACxC;;;;;;;;;;AAWA,eAAsB,oBACpB,gBACA,aACA,gBACA,MACA,uBACkB;CAClB,MAAM,eAAe,gBAAgB,cAAc;CACnD,MAAM,aAAa,aAAa,gBAAgB,YAAY,aAAa;CACzE,IAAI,kBAAkB;CAEtB,IAAI,uBACF,kBAAkB,MAAM,gBACtB,YACA,uBACA,IACF;CAGF,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,uBAAuB,WAAW,sBAAsB;EACrE,OAAO;CACT;CACA,MAAM,aAAa,KAAK,OAAO,UAAU;CACzC,MAAM,cAAcC,uBAA0B,cAAc;CAC5D,MAAMC,SAAY,YAAY,WAAW;CACzC,OAAO,MACL;EAAE,KAAK;EAAY,YAAY;CAAe,GAC9C,iCACF;CAEA,IAAI,mBAAmB;CAEvB,IAAI;EACF,mBAAmB,MAAM,mBAAmB,cAAc,IAAI;CAChE,SAAS,OAAO;EAEd,OAAO,MACL;GAAE,KAAK;GAAc,KAAK;EAAM,GAChC,gCACF;CACF;CAEA,IAAI,kBAOE;MAAA,MANyB,oBAAoB,cAAc,MACtC,4BACvB,kBAEA,WAAW,QAAQ,GAAG,aAAa,IAAI,EAAE,CAEL,GAAG;GACvC,MAAMF,QAAW,cAAc;GAC/B,MAAM,IAAI,MAAM,mCAAmC;EACrD;;CAGF,OAAO;AACT;;;;;;;;AASA,eAAsB,mBACpB,gBACA,MACiB;CACjB,MAAM,eAAe,aAAa,gBAAgB,WAAW;CAE7D,QAAO,MADgB,KAAK,QAAQ,YAAY,EAAA,CAChC;AAClB"}
|
|
@@ -29,7 +29,8 @@ var DenoDatasource = class DenoDatasource extends Datasource {
|
|
|
29
29
|
logger.debug(`Could not extract rawPackageName from packageName: "${packageName}"`);
|
|
30
30
|
return null;
|
|
31
31
|
}
|
|
32
|
-
const
|
|
32
|
+
const massagedPackageName = rawPackageName.replace("x/", "");
|
|
33
|
+
const moduleAPIURL = joinUrlParts(massagedRegistryUrl, "v2/modules", massagedPackageName);
|
|
33
34
|
return await this.getReleaseResult(moduleAPIURL);
|
|
34
35
|
}
|
|
35
36
|
getReleases(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["semanticVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/deno/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as semanticVersioning from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { Release } from '../index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n DenoAPIModuleResponse,\n DenoAPIModuleVersionResponse,\n} from './schema.ts';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override readonly defaultRegistryUrls = ['https://apiland.deno.dev'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (isNullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getReleaseResult(\n moduleAPIURL: string,\n ): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> =\n (await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n )) ?? {};\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n /* v8 ignore next 3: hard to test */\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n\n getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n key: `getReleaseResult:${moduleAPIURL}`,\n },\n () => this._getReleaseResult(moduleAPIURL),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAgBA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,wBAA0C;CAE1C,mBAAqC;CAErC,oBAAsCA;CAEtC,sBAAwC,CAAC,0BAA0B;CAEnE,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,sBAAsB;EAK5B,MAAM,iBAHgB,MACpB,oDACF,CAAC,CAAC,KAAK,WAC4B,CAAC,EAAE,QAAQ;EAC9C,IAAI,kBAAkB,cAAc,GAAG;GACrC,OAAO,MACL,uDAAuD,YAAY,EACrE;GACA,OAAO;EACT;
|
|
1
|
+
{"version":3,"file":"index.js","names":["semanticVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/deno/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as semanticVersioning from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { Release } from '../index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n DenoAPIModuleResponse,\n DenoAPIModuleVersionResponse,\n} from './schema.ts';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override readonly defaultRegistryUrls = ['https://apiland.deno.dev'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (isNullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getReleaseResult(\n moduleAPIURL: string,\n ): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> =\n (await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n )) ?? {};\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n /* v8 ignore next 3: hard to test */\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n\n getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n key: `getReleaseResult:${moduleAPIURL}`,\n },\n () => this._getReleaseResult(moduleAPIURL),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAgBA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,wBAA0C;CAE1C,mBAAqC;CAErC,oBAAsCA;CAEtC,sBAAwC,CAAC,0BAA0B;CAEnE,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,sBAAsB;EAK5B,MAAM,iBAHgB,MACpB,oDACF,CAAC,CAAC,KAAK,WAC4B,CAAC,EAAE,QAAQ;EAC9C,IAAI,kBAAkB,cAAc,GAAG;GACrC,OAAO,MACL,uDAAuD,YAAY,EACrE;GACA,OAAO;EACT;EAGA,MAAM,sBAAsB,eAAe,QAAQ,MAAM,EAAE;EAG3D,MAAM,eAAe,aACnB,qBACA,cACA,mBACF;EAEA,OAAO,MAAM,KAAK,iBAAiB,YAAY;CACjD;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GAExC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,kBACZ,cACwB;EACxB,MAAM,kBAAkB,WAAW;EACnC,MAAM,gBACH,MAAMC,IACL,cAAc,eAAe,MAC7B,eACF,KAAM,CAAC;EACT,IAAI,gBAAgB;EAEpB,MAAM,EACJ,MAAM,EAAE,UAAU,WAChB,MAAM,KAAK,KAAK,QAAQ,cAAc,qBAAqB;EAG/D,MAAM,WAAW,MAAM,KACrB,UACA,OAAO,YAAY;GACjB,MAAM,eAAe,cAAc;;GAEnC,IAAI,cACF,OAAO;GAIT,MAAM,MAAM,aAAa,cAAc,OAAO;GAC9C,MAAM,EAAE,MAAM,YAAY,MAAM,KAAK,KAAK,QACxC,KACA,6BAA6B,OAAO,EAAE,OAAO,UAAU;IACrD,OAAO,KACL;KAAE;KAAK;IAAQ,GACf,qCACF;IACA,OAAO,EAAE,QAAQ;GACnB,CAAC,CACH;GAEA,cAAc,QAAQ,WAAW;GACjC,gBAAgB;GAEhB,OAAO;EACT,GACA,EAAE,aAAa,EAAE,CACnB;EAEA,IAAI,eAEF,MAAMC,IACJ,cAAc,eAAe,MAC7B,iBACA,eACA,KACF;EAGF,OAAO;GAAE;GAAU;EAAK;CAC1B;CAEA,iBAAiB,cAA8C;EAC7D,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,oBAAoB;EAC3B,SACM,KAAK,kBAAkB,YAAY,CAC3C;CACF;AACF"}
|
|
@@ -126,7 +126,7 @@ async function getAuthHeaders(http, registryHost, dockerRepository, apiCheckUrl
|
|
|
126
126
|
}
|
|
127
127
|
addSecretForSanitizing(token);
|
|
128
128
|
return { authorization: `Bearer ${token}` };
|
|
129
|
-
} catch (err)
|
|
129
|
+
} catch (err) /* istanbul ignore next */ {
|
|
130
130
|
/* v8 ignore if -- quay.io errors are swallowed pending #9604, not reproduced in specs */
|
|
131
131
|
if (err.host === "quay.io") return null;
|
|
132
132
|
/* v8 ignore if -- registry auth rejection is logged and swallowed, not mocked in specs */
|
|
@@ -177,7 +177,8 @@ function getRegistryRepository(packageName, registryUrl) {
|
|
|
177
177
|
let registryHost = trimTrailingSlash(registryUrl);
|
|
178
178
|
if (!regEx(/^https?:\/\//).test(registryHost)) registryHost = `https://${registryHost}`;
|
|
179
179
|
let dockerRepository = packageName.replace(registryEndingWithSlash, "");
|
|
180
|
-
const
|
|
180
|
+
const fullUrl = `${registryHost}/${dockerRepository}`;
|
|
181
|
+
const parsedFullUrl = parseUrl(fullUrl);
|
|
181
182
|
if (!parsedFullUrl) return {
|
|
182
183
|
registryHost,
|
|
183
184
|
dockerRepository
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["hostRules.find","dockerVersioning"],"sources":["../../../../lib/modules/datasource/docker/common.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport {\n HOST_DISABLED,\n PAGE_NOT_FOUND_ERROR,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport type {\n HttpOptions,\n HttpResponse,\n OutgoingHttpHeaders,\n} from '../../../util/http/types.ts';\nimport type { ParamsChallenge } from '../../../util/http/www-authenticate.ts';\nimport { BearerScheme, parse } from '../../../util/http/www-authenticate.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { addSecretForSanitizing } from '../../../util/sanitize.ts';\nimport {\n ensureTrailingSlash,\n parseUrl,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport { api as dockerVersioning } from '../../versioning/docker/index.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { ecrRegex, getECRAuthToken, isECRMaxResultsResponse } from './ecr.ts';\nimport { googleRegex } from './google.ts';\nimport type { OciHelmConfig } from './schema.ts';\nimport { RegistryAuthToken } from './schema.ts';\nimport type { RegistryRepository } from './types.ts';\n\nexport const dockerDatasourceId = 'docker';\n\nexport const imageUrlLabel = 'org.opencontainers.image.url';\n\nexport const sourceLabel = 'org.opencontainers.image.source';\nexport const sourceLabels = [sourceLabel, 'org.label-schema.vcs-url'] as const;\n\nexport const gitRefLabel = 'org.opencontainers.image.revision';\n\nexport const DOCKER_HUB = 'https://index.docker.io';\n\nexport function isDockerHost(host: string): boolean {\n const regex = regEx(/(?:^|\\.)docker\\.io$/);\n return regex.test(host);\n}\n\nexport async function getAuthHeaders(\n http: Http,\n registryHost: string,\n dockerRepository: string,\n apiCheckUrl = `${registryHost}/v2/`,\n): Promise<OutgoingHttpHeaders | null> {\n try {\n const options = {\n throwHttpErrors: false,\n noAuth: true,\n cacheProvider: memCacheProvider,\n };\n const apiCheckResponse = apiCheckUrl.endsWith('/v2/')\n ? await http.get(apiCheckUrl, options)\n : // use json request, as this will be cached for tags, so it returns json\n // TODO: add cache test\n await http.getJsonUnchecked(apiCheckUrl, options);\n\n if (apiCheckResponse.statusCode === 200) {\n logger.debug(`No registry auth required for ${apiCheckUrl}`);\n return {};\n }\n if (apiCheckResponse.statusCode === 404) {\n logger.debug(`Page Not Found ${apiCheckUrl}`);\n // throw error up to be caught and potentially retried with library/ prefix\n throw new Error(PAGE_NOT_FOUND_ERROR);\n }\n // Some ECR-compatible private registries (e.g. corporate Docker proxies) reject\n // n>1000 with 405 even on the auth-probe request. Fall back to probing the base\n // /v2/ endpoint so getAuthHeaders can still obtain a valid token; the main fetch\n // loop already retries with n=1000 when it encounters this same error.\n if (isECRMaxResultsResponse(apiCheckResponse)) {\n logger.debug(\n { apiCheckUrl },\n 'Registry rejected n>1000 on auth probe; retrying auth check via base /v2/ endpoint',\n );\n return getAuthHeaders(http, registryHost, dockerRepository);\n }\n if (\n apiCheckResponse.statusCode !== 401 ||\n !isNonEmptyString(apiCheckResponse.headers['www-authenticate'])\n ) {\n logger.warn(\n { apiCheckUrl, res: apiCheckResponse },\n 'Invalid registry response',\n );\n return null;\n }\n\n const rule = hostRules.find({\n hostType: dockerDatasourceId,\n url: apiCheckUrl,\n });\n const opts: HttpOptions = {};\n\n if (ecrRegex.test(registryHost)) {\n logger.once.debug(`hostRules: ecr auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using ecr auth for Docker registry`,\n );\n const [, region] = coerceArray(ecrRegex.exec(registryHost));\n const auth = await getECRAuthToken(region, rule);\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n }\n } else if (\n googleRegex.test(registryHost) &&\n typeof rule.username === 'undefined' &&\n typeof rule.password === 'undefined' &&\n typeof rule.token === 'undefined'\n ) {\n logger.once.debug(`hostRules: google auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using google auth for Docker registry`,\n );\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { registryHost, dockerRepository },\n 'Could not get Google access token, using no auth',\n );\n }\n } else if (rule.username && rule.password) {\n logger.once.debug(`hostRules: basic auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using basic auth for Docker registry`,\n );\n const auth = Buffer.from(`${rule.username}:${rule.password}`).toString(\n 'base64',\n );\n opts.headers = { authorization: `Basic ${auth}` };\n } else if (rule.token) {\n const authType = rule.authType ?? 'Bearer';\n logger.once.debug(\n `hostRules: ${authType} token auth for ${registryHost}`,\n );\n logger.trace(\n { registryHost, dockerRepository },\n `Using ${authType} token for Docker registry`,\n );\n opts.headers = { authorization: `${authType} ${rule.token}` };\n }\n\n const challenges = parse(apiCheckResponse.headers['www-authenticate']);\n const authenticateHeader = challenges.find(\n (c): c is ParamsChallenge => c.scheme === BearerScheme,\n );\n\n // If realm isn't an url, we should directly use auth header\n // Can happen when we get a Basic auth or some other auth type\n // * WWW-Authenticate: Basic realm=\"Artifactory Realm\"\n // * Www-Authenticate: Basic realm=\"https://123456789.dkr.ecr.eu-central-1.amazonaws.com/\",service=\"ecr.amazonaws.com\"\n // * www-authenticate: Bearer realm=\"https://ghcr.io/token\",service=\"ghcr.io\",scope=\"repository:user/image:pull\"\n // * www-authenticate: Bearer realm=\"https://auth.docker.io/token\",service=\"registry.docker.io\"\n // * www-authenticate: Bearer realm=\"https://codeberg.org/v2/token\",service=\"container_registry\",scope=\"*\",Basic realm=\"https://codeberg.org/v2\",service=\"container_registry\",scope=\"*\"\n if (\n !authenticateHeader ||\n !isString(authenticateHeader.params?.realm) ||\n parseUrl(authenticateHeader.params.realm) === null\n ) {\n logger.once.debug(`hostRules: testing direct auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository, authenticateHeader },\n `Invalid realm, testing direct auth`,\n );\n return opts.headers ?? null;\n }\n\n // already guarded by above clause\n const authUrl = parseUrl(`${authenticateHeader.params.realm}`)!;\n\n // repo isn't known to server yet, so causing wrong scope `repository:user/image:pull`\n if (\n isString(authenticateHeader.params.scope) &&\n !apiCheckUrl.endsWith('/v2/')\n ) {\n authUrl.searchParams.append('scope', authenticateHeader.params.scope);\n } else {\n authUrl.searchParams.append(\n 'scope',\n `repository:${dockerRepository}:pull`,\n );\n }\n\n if (isString(authenticateHeader.params.service)) {\n authUrl.searchParams.append('service', authenticateHeader.params.service);\n }\n\n logger.trace(\n { registryHost, dockerRepository, authUrl: authUrl.href },\n `Obtaining docker registry token`,\n );\n opts.noAuth = true;\n opts.cacheProvider = memCacheProvider;\n const authResponse = (\n await http.getJson(authUrl.href, opts, RegistryAuthToken)\n ).body;\n\n const token = authResponse.token ?? authResponse.access_token;\n /* v8 ignore next 4 -- TODO: add test */\n if (!token) {\n logger.warn('Failed to obtain docker registry token');\n return null;\n }\n // sanitize token\n addSecretForSanitizing(token);\n return {\n authorization: `Bearer ${token}`,\n };\n } catch (err) /* istanbul ignore next */ {\n /* v8 ignore if -- quay.io errors are swallowed pending #9604, not reproduced in specs */\n if (err.host === 'quay.io') {\n // TODO: debug why quay throws errors (#9604)\n return null;\n }\n /* v8 ignore if -- registry auth rejection is logged and swallowed, not mocked in specs */\n if (err.statusCode === 401) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Unauthorized docker lookup',\n );\n logger.debug({ err });\n return null;\n }\n /* v8 ignore if -- registry permission rejection is logged and swallowed, not mocked in specs */\n if (err.statusCode === 403) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Not allowed to access docker registry',\n );\n logger.debug({ err });\n return null;\n }\n if (err.name === 'RequestError' && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n /* v8 ignore if -- Docker Hub rate limiting maps to ExternalHostError, not mocked in specs */\n if (err.statusCode === 429 && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n /* v8 ignore if -- registry server errors map to ExternalHostError, not mocked in specs */\n if (err.statusCode >= 500 && err.statusCode < 600) {\n throw new ExternalHostError(err);\n }\n if (err.message === PAGE_NOT_FOUND_ERROR) {\n throw err;\n }\n /* v8 ignore if -- hostRules-disabled host is swallowed silently, not mocked in specs */\n if (err.message === HOST_DISABLED) {\n logger.trace({ registryHost, dockerRepository, err }, 'Host disabled');\n return null;\n }\n logger.warn(\n { registryHost, dockerRepository, err },\n 'Error obtaining docker token',\n );\n return null;\n }\n}\n\nexport function getRegistryRepository(\n packageName: string,\n registryUrl: string,\n): RegistryRepository {\n if (registryUrl !== DOCKER_HUB) {\n const registryEndingWithSlash = ensureTrailingSlash(\n registryUrl.replace(regEx(/^https?:\\/\\//), ''),\n );\n if (packageName.startsWith(registryEndingWithSlash)) {\n let registryHost = trimTrailingSlash(registryUrl);\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n let dockerRepository = packageName.replace(registryEndingWithSlash, '');\n const fullUrl = `${registryHost}/${dockerRepository}`;\n const parsedFullUrl = parseUrl(fullUrl);\n if (!parsedFullUrl) {\n return { registryHost, dockerRepository };\n }\n registryHost = parsedFullUrl.origin;\n dockerRepository = parsedFullUrl.pathname.substring(1);\n return {\n registryHost,\n dockerRepository,\n };\n }\n }\n let registryHost = registryUrl;\n const split = packageName.split('/');\n if (split.length > 1 && (split[0].includes('.') || split[0].includes(':'))) {\n [registryHost] = split;\n split.shift();\n }\n let dockerRepository = split.join('/');\n\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n\n const { path, base } =\n regEx(/^(?<base>https:\\/\\/[^/]+)\\/(?<path>.+)$/).exec(registryHost)\n ?.groups ?? {};\n if (base && path) {\n registryHost = base;\n dockerRepository = `${trimTrailingSlash(path)}/${dockerRepository}`;\n }\n\n registryHost = registryHost\n .replace('https://docker.io', 'https://index.docker.io')\n .replace('https://registry-1.docker.io', 'https://index.docker.io');\n\n const opts = hostRules.find({\n hostType: dockerDatasourceId,\n url: registryHost,\n });\n if (opts?.insecureRegistry) {\n registryHost = registryHost.replace('https', 'http');\n }\n if (registryHost.endsWith('.docker.io') && !dockerRepository.includes('/')) {\n dockerRepository = `library/${dockerRepository}`;\n }\n return {\n registryHost,\n dockerRepository,\n };\n}\n\nexport function extractDigestFromResponseBody(\n manifestResponse: HttpResponse,\n): string {\n return `sha256:${toSha256(manifestResponse.body)}`;\n}\n\nexport function findLatestStable(tags: string[]): string | null {\n let stable: string | null = null;\n\n for (const tag of tags) {\n if (!dockerVersioning.isValid(tag) || !dockerVersioning.isStable(tag)) {\n continue;\n }\n\n if (!stable || dockerVersioning.isGreaterThan(tag, stable)) {\n stable = tag;\n }\n }\n\n return stable;\n}\n\nconst chartRepo = regEx(/charts?|helm|helm-charts?/i);\n\nfunction isPossibleChartRepo(url: string): boolean {\n if (detectPlatform(url) === null) {\n return false;\n }\n\n const parsed = parseGitUrl(url);\n return chartRepo.test(parsed.name);\n}\n\nexport function findHelmSourceUrl(release: OciHelmConfig): string | null {\n if (release.home && isPossibleChartRepo(release.home)) {\n return release.home;\n }\n\n if (!release.sources?.length) {\n return null;\n }\n\n for (const url of release.sources) {\n if (isPossibleChartRepo(url)) {\n return url;\n }\n }\n\n // fallback\n return release.sources[0];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"common.js","names":["hostRules.find","dockerVersioning"],"sources":["../../../../lib/modules/datasource/docker/common.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport {\n HOST_DISABLED,\n PAGE_NOT_FOUND_ERROR,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport type {\n HttpOptions,\n HttpResponse,\n OutgoingHttpHeaders,\n} from '../../../util/http/types.ts';\nimport type { ParamsChallenge } from '../../../util/http/www-authenticate.ts';\nimport { BearerScheme, parse } from '../../../util/http/www-authenticate.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { addSecretForSanitizing } from '../../../util/sanitize.ts';\nimport {\n ensureTrailingSlash,\n parseUrl,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport { api as dockerVersioning } from '../../versioning/docker/index.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { ecrRegex, getECRAuthToken, isECRMaxResultsResponse } from './ecr.ts';\nimport { googleRegex } from './google.ts';\nimport type { OciHelmConfig } from './schema.ts';\nimport { RegistryAuthToken } from './schema.ts';\nimport type { RegistryRepository } from './types.ts';\n\nexport const dockerDatasourceId = 'docker';\n\nexport const imageUrlLabel = 'org.opencontainers.image.url';\n\nexport const sourceLabel = 'org.opencontainers.image.source';\nexport const sourceLabels = [sourceLabel, 'org.label-schema.vcs-url'] as const;\n\nexport const gitRefLabel = 'org.opencontainers.image.revision';\n\nexport const DOCKER_HUB = 'https://index.docker.io';\n\nexport function isDockerHost(host: string): boolean {\n const regex = regEx(/(?:^|\\.)docker\\.io$/);\n return regex.test(host);\n}\n\nexport async function getAuthHeaders(\n http: Http,\n registryHost: string,\n dockerRepository: string,\n apiCheckUrl = `${registryHost}/v2/`,\n): Promise<OutgoingHttpHeaders | null> {\n try {\n const options = {\n throwHttpErrors: false,\n noAuth: true,\n cacheProvider: memCacheProvider,\n };\n const apiCheckResponse = apiCheckUrl.endsWith('/v2/')\n ? await http.get(apiCheckUrl, options)\n : // use json request, as this will be cached for tags, so it returns json\n // TODO: add cache test\n await http.getJsonUnchecked(apiCheckUrl, options);\n\n if (apiCheckResponse.statusCode === 200) {\n logger.debug(`No registry auth required for ${apiCheckUrl}`);\n return {};\n }\n if (apiCheckResponse.statusCode === 404) {\n logger.debug(`Page Not Found ${apiCheckUrl}`);\n // throw error up to be caught and potentially retried with library/ prefix\n throw new Error(PAGE_NOT_FOUND_ERROR);\n }\n // Some ECR-compatible private registries (e.g. corporate Docker proxies) reject\n // n>1000 with 405 even on the auth-probe request. Fall back to probing the base\n // /v2/ endpoint so getAuthHeaders can still obtain a valid token; the main fetch\n // loop already retries with n=1000 when it encounters this same error.\n if (isECRMaxResultsResponse(apiCheckResponse)) {\n logger.debug(\n { apiCheckUrl },\n 'Registry rejected n>1000 on auth probe; retrying auth check via base /v2/ endpoint',\n );\n return getAuthHeaders(http, registryHost, dockerRepository);\n }\n if (\n apiCheckResponse.statusCode !== 401 ||\n !isNonEmptyString(apiCheckResponse.headers['www-authenticate'])\n ) {\n logger.warn(\n { apiCheckUrl, res: apiCheckResponse },\n 'Invalid registry response',\n );\n return null;\n }\n\n const rule = hostRules.find({\n hostType: dockerDatasourceId,\n url: apiCheckUrl,\n });\n const opts: HttpOptions = {};\n\n if (ecrRegex.test(registryHost)) {\n logger.once.debug(`hostRules: ecr auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using ecr auth for Docker registry`,\n );\n const [, region] = coerceArray(ecrRegex.exec(registryHost));\n const auth = await getECRAuthToken(region, rule);\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n }\n } else if (\n googleRegex.test(registryHost) &&\n typeof rule.username === 'undefined' &&\n typeof rule.password === 'undefined' &&\n typeof rule.token === 'undefined'\n ) {\n logger.once.debug(`hostRules: google auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using google auth for Docker registry`,\n );\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { registryHost, dockerRepository },\n 'Could not get Google access token, using no auth',\n );\n }\n } else if (rule.username && rule.password) {\n logger.once.debug(`hostRules: basic auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using basic auth for Docker registry`,\n );\n const auth = Buffer.from(`${rule.username}:${rule.password}`).toString(\n 'base64',\n );\n opts.headers = { authorization: `Basic ${auth}` };\n } else if (rule.token) {\n const authType = rule.authType ?? 'Bearer';\n logger.once.debug(\n `hostRules: ${authType} token auth for ${registryHost}`,\n );\n logger.trace(\n { registryHost, dockerRepository },\n `Using ${authType} token for Docker registry`,\n );\n opts.headers = { authorization: `${authType} ${rule.token}` };\n }\n\n const challenges = parse(apiCheckResponse.headers['www-authenticate']);\n const authenticateHeader = challenges.find(\n (c): c is ParamsChallenge => c.scheme === BearerScheme,\n );\n\n // If realm isn't an url, we should directly use auth header\n // Can happen when we get a Basic auth or some other auth type\n // * WWW-Authenticate: Basic realm=\"Artifactory Realm\"\n // * Www-Authenticate: Basic realm=\"https://123456789.dkr.ecr.eu-central-1.amazonaws.com/\",service=\"ecr.amazonaws.com\"\n // * www-authenticate: Bearer realm=\"https://ghcr.io/token\",service=\"ghcr.io\",scope=\"repository:user/image:pull\"\n // * www-authenticate: Bearer realm=\"https://auth.docker.io/token\",service=\"registry.docker.io\"\n // * www-authenticate: Bearer realm=\"https://codeberg.org/v2/token\",service=\"container_registry\",scope=\"*\",Basic realm=\"https://codeberg.org/v2\",service=\"container_registry\",scope=\"*\"\n if (\n !authenticateHeader ||\n !isString(authenticateHeader.params?.realm) ||\n parseUrl(authenticateHeader.params.realm) === null\n ) {\n logger.once.debug(`hostRules: testing direct auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository, authenticateHeader },\n `Invalid realm, testing direct auth`,\n );\n return opts.headers ?? null;\n }\n\n // already guarded by above clause\n const authUrl = parseUrl(`${authenticateHeader.params.realm}`)!;\n\n // repo isn't known to server yet, so causing wrong scope `repository:user/image:pull`\n if (\n isString(authenticateHeader.params.scope) &&\n !apiCheckUrl.endsWith('/v2/')\n ) {\n authUrl.searchParams.append('scope', authenticateHeader.params.scope);\n } else {\n authUrl.searchParams.append(\n 'scope',\n `repository:${dockerRepository}:pull`,\n );\n }\n\n if (isString(authenticateHeader.params.service)) {\n authUrl.searchParams.append('service', authenticateHeader.params.service);\n }\n\n logger.trace(\n { registryHost, dockerRepository, authUrl: authUrl.href },\n `Obtaining docker registry token`,\n );\n opts.noAuth = true;\n opts.cacheProvider = memCacheProvider;\n const authResponse = (\n await http.getJson(authUrl.href, opts, RegistryAuthToken)\n ).body;\n\n const token = authResponse.token ?? authResponse.access_token;\n /* v8 ignore next 4 -- TODO: add test */\n if (!token) {\n logger.warn('Failed to obtain docker registry token');\n return null;\n }\n // sanitize token\n addSecretForSanitizing(token);\n return {\n authorization: `Bearer ${token}`,\n };\n } catch (err) /* istanbul ignore next */ {\n /* v8 ignore if -- quay.io errors are swallowed pending #9604, not reproduced in specs */\n if (err.host === 'quay.io') {\n // TODO: debug why quay throws errors (#9604)\n return null;\n }\n /* v8 ignore if -- registry auth rejection is logged and swallowed, not mocked in specs */\n if (err.statusCode === 401) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Unauthorized docker lookup',\n );\n logger.debug({ err });\n return null;\n }\n /* v8 ignore if -- registry permission rejection is logged and swallowed, not mocked in specs */\n if (err.statusCode === 403) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Not allowed to access docker registry',\n );\n logger.debug({ err });\n return null;\n }\n if (err.name === 'RequestError' && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n /* v8 ignore if -- Docker Hub rate limiting maps to ExternalHostError, not mocked in specs */\n if (err.statusCode === 429 && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n /* v8 ignore if -- registry server errors map to ExternalHostError, not mocked in specs */\n if (err.statusCode >= 500 && err.statusCode < 600) {\n throw new ExternalHostError(err);\n }\n if (err.message === PAGE_NOT_FOUND_ERROR) {\n throw err;\n }\n /* v8 ignore if -- hostRules-disabled host is swallowed silently, not mocked in specs */\n if (err.message === HOST_DISABLED) {\n logger.trace({ registryHost, dockerRepository, err }, 'Host disabled');\n return null;\n }\n logger.warn(\n { registryHost, dockerRepository, err },\n 'Error obtaining docker token',\n );\n return null;\n }\n}\n\nexport function getRegistryRepository(\n packageName: string,\n registryUrl: string,\n): RegistryRepository {\n if (registryUrl !== DOCKER_HUB) {\n const registryEndingWithSlash = ensureTrailingSlash(\n registryUrl.replace(regEx(/^https?:\\/\\//), ''),\n );\n if (packageName.startsWith(registryEndingWithSlash)) {\n let registryHost = trimTrailingSlash(registryUrl);\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n let dockerRepository = packageName.replace(registryEndingWithSlash, '');\n const fullUrl = `${registryHost}/${dockerRepository}`;\n const parsedFullUrl = parseUrl(fullUrl);\n if (!parsedFullUrl) {\n return { registryHost, dockerRepository };\n }\n registryHost = parsedFullUrl.origin;\n dockerRepository = parsedFullUrl.pathname.substring(1);\n return {\n registryHost,\n dockerRepository,\n };\n }\n }\n let registryHost = registryUrl;\n const split = packageName.split('/');\n if (split.length > 1 && (split[0].includes('.') || split[0].includes(':'))) {\n [registryHost] = split;\n split.shift();\n }\n let dockerRepository = split.join('/');\n\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n\n const { path, base } =\n regEx(/^(?<base>https:\\/\\/[^/]+)\\/(?<path>.+)$/).exec(registryHost)\n ?.groups ?? {};\n if (base && path) {\n registryHost = base;\n dockerRepository = `${trimTrailingSlash(path)}/${dockerRepository}`;\n }\n\n registryHost = registryHost\n .replace('https://docker.io', 'https://index.docker.io')\n .replace('https://registry-1.docker.io', 'https://index.docker.io');\n\n const opts = hostRules.find({\n hostType: dockerDatasourceId,\n url: registryHost,\n });\n if (opts?.insecureRegistry) {\n registryHost = registryHost.replace('https', 'http');\n }\n if (registryHost.endsWith('.docker.io') && !dockerRepository.includes('/')) {\n dockerRepository = `library/${dockerRepository}`;\n }\n return {\n registryHost,\n dockerRepository,\n };\n}\n\nexport function extractDigestFromResponseBody(\n manifestResponse: HttpResponse,\n): string {\n return `sha256:${toSha256(manifestResponse.body)}`;\n}\n\nexport function findLatestStable(tags: string[]): string | null {\n let stable: string | null = null;\n\n for (const tag of tags) {\n if (!dockerVersioning.isValid(tag) || !dockerVersioning.isStable(tag)) {\n continue;\n }\n\n if (!stable || dockerVersioning.isGreaterThan(tag, stable)) {\n stable = tag;\n }\n }\n\n return stable;\n}\n\nconst chartRepo = regEx(/charts?|helm|helm-charts?/i);\n\nfunction isPossibleChartRepo(url: string): boolean {\n if (detectPlatform(url) === null) {\n return false;\n }\n\n const parsed = parseGitUrl(url);\n return chartRepo.test(parsed.name);\n}\n\nexport function findHelmSourceUrl(release: OciHelmConfig): string | null {\n if (release.home && isPossibleChartRepo(release.home)) {\n return release.home;\n }\n\n if (!release.sources?.length) {\n return null;\n }\n\n for (const url of release.sources) {\n if (isPossibleChartRepo(url)) {\n return url;\n }\n }\n\n // fallback\n return release.sources[0];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoCA,MAAa,qBAAqB;AAElC,MAAa,gBAAgB;AAE7B,MAAa,cAAc;AAC3B,MAAa,eAAe,CAAC,aAAa,0BAA0B;AAEpE,MAAa,cAAc;AAE3B,MAAa,aAAa;AAE1B,SAAgB,aAAa,MAAuB;CAElD,OADc,MAAM,qBACT,CAAC,CAAC,KAAK,IAAI;AACxB;AAEA,eAAsB,eACpB,MACA,cACA,kBACA,cAAc,GAAG,aAAa,OACO;CACrC,IAAI;EACF,MAAM,UAAU;GACd,iBAAiB;GACjB,QAAQ;GACR,eAAe;EACjB;EACA,MAAM,mBAAmB,YAAY,SAAS,MAAM,IAChD,MAAM,KAAK,IAAI,aAAa,OAAO,IAGnC,MAAM,KAAK,iBAAiB,aAAa,OAAO;EAEpD,IAAI,iBAAiB,eAAe,KAAK;GACvC,OAAO,MAAM,iCAAiC,aAAa;GAC3D,OAAO,CAAC;EACV;EACA,IAAI,iBAAiB,eAAe,KAAK;GACvC,OAAO,MAAM,kBAAkB,aAAa;GAE5C,MAAM,IAAI,MAAM,oBAAoB;EACtC;EAKA,IAAI,wBAAwB,gBAAgB,GAAG;GAC7C,OAAO,MACL,EAAE,YAAY,GACd,oFACF;GACA,OAAO,eAAe,MAAM,cAAc,gBAAgB;EAC5D;EACA,IACE,iBAAiB,eAAe,OAChC,CAAC,iBAAiB,iBAAiB,QAAQ,mBAAmB,GAC9D;GACA,OAAO,KACL;IAAE;IAAa,KAAK;GAAiB,GACrC,2BACF;GACA,OAAO;EACT;EAEA,MAAM,OAAOA,KAAe;GAC1B,UAAU;GACV,KAAK;EACP,CAAC;EACD,MAAM,OAAoB,CAAC;EAE3B,IAAI,SAAS,KAAK,YAAY,GAAG;GAC/B,OAAO,KAAK,MAAM,2BAA2B,cAAc;GAC3D,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,oCACF;GACA,MAAM,GAAG,UAAU,YAAY,SAAS,KAAK,YAAY,CAAC;GAC1D,MAAM,OAAO,MAAM,gBAAgB,QAAQ,IAAI;GAC/C,IAAI,MACF,KAAK,UAAU,EAAE,eAAe,SAAS,OAAO;EAEpD,OAAO,IACL,YAAY,KAAK,YAAY,KAC7B,OAAO,KAAK,aAAa,eACzB,OAAO,KAAK,aAAa,eACzB,OAAO,KAAK,UAAU,aACtB;GACA,OAAO,KAAK,MAAM,8BAA8B,cAAc;GAC9D,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,uCACF;GACA,MAAM,OAAO,MAAM,mBAAmB;GACtC,IAAI,MACF,KAAK,UAAU,EAAE,eAAe,SAAS,OAAO;QAEhD,OAAO,KAAK,MACV;IAAE;IAAc;GAAiB,GACjC,kDACF;EAEJ,OAAO,IAAI,KAAK,YAAY,KAAK,UAAU;GACzC,OAAO,KAAK,MAAM,6BAA6B,cAAc;GAC7D,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,sCACF;GAIA,KAAK,UAAU,EAAE,eAAe,SAHnB,OAAO,KAAK,GAAG,KAAK,SAAS,GAAG,KAAK,UAAU,CAAC,CAAC,SAC5D,QAE0C,IAAI;EAClD,OAAO,IAAI,KAAK,OAAO;GACrB,MAAM,WAAW,KAAK,YAAY;GAClC,OAAO,KAAK,MACV,cAAc,SAAS,kBAAkB,cAC3C;GACA,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,SAAS,SAAS,2BACpB;GACA,KAAK,UAAU,EAAE,eAAe,GAAG,SAAS,GAAG,KAAK,QAAQ;EAC9D;EAGA,MAAM,qBADa,MAAM,iBAAiB,QAAQ,mBACd,CAAC,CAAC,MACnC,MAA4B,EAAE,WAAW,YAC5C;EASA,IACE,CAAC,sBACD,CAAC,SAAS,mBAAmB,QAAQ,KAAK,KAC1C,SAAS,mBAAmB,OAAO,KAAK,MAAM,MAC9C;GACA,OAAO,KAAK,MAAM,sCAAsC,cAAc;GACtE,OAAO,MACL;IAAE;IAAc;IAAkB;GAAmB,GACrD,oCACF;GACA,OAAO,KAAK,WAAW;EACzB;EAGA,MAAM,UAAU,SAAS,GAAG,mBAAmB,OAAO,OAAO;EAG7D,IACE,SAAS,mBAAmB,OAAO,KAAK,KACxC,CAAC,YAAY,SAAS,MAAM,GAE5B,QAAQ,aAAa,OAAO,SAAS,mBAAmB,OAAO,KAAK;OAEpE,QAAQ,aAAa,OACnB,SACA,cAAc,iBAAiB,MACjC;EAGF,IAAI,SAAS,mBAAmB,OAAO,OAAO,GAC5C,QAAQ,aAAa,OAAO,WAAW,mBAAmB,OAAO,OAAO;EAG1E,OAAO,MACL;GAAE;GAAc;GAAkB,SAAS,QAAQ;EAAK,GACxD,iCACF;EACA,KAAK,SAAS;EACd,KAAK,gBAAgB;EACrB,MAAM,gBACJ,MAAM,KAAK,QAAQ,QAAQ,MAAM,MAAM,iBAAiB,EAAA,CACxD;EAEF,MAAM,QAAQ,aAAa,SAAS,aAAa;;EAEjD,IAAI,CAAC,OAAO;GACV,OAAO,KAAK,wCAAwC;GACpD,OAAO;EACT;EAEA,uBAAuB,KAAK;EAC5B,OAAO,EACL,eAAe,UAAU,QAC3B;CACF,SAAS,gCAAgC;;EAEvC,IAAI,IAAI,SAAS,WAEf,OAAO;;EAGT,IAAI,IAAI,eAAe,KAAK;GAC1B,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,4BACF;GACA,OAAO,MAAM,EAAE,IAAI,CAAC;GACpB,OAAO;EACT;;EAEA,IAAI,IAAI,eAAe,KAAK;GAC1B,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,uCACF;GACA,OAAO,MAAM,EAAE,IAAI,CAAC;GACpB,OAAO;EACT;EACA,IAAI,IAAI,SAAS,kBAAkB,aAAa,YAAY,GAC1D,MAAM,IAAI,kBAAkB,GAAG;;EAGjC,IAAI,IAAI,eAAe,OAAO,aAAa,YAAY,GACrD,MAAM,IAAI,kBAAkB,GAAG;;EAGjC,IAAI,IAAI,cAAc,OAAO,IAAI,aAAa,KAC5C,MAAM,IAAI,kBAAkB,GAAG;EAEjC,IAAI,IAAI,YAAA,kBACN,MAAM;;EAGR,IAAI,IAAI,YAAA,iBAA2B;GACjC,OAAO,MAAM;IAAE;IAAc;IAAkB;GAAI,GAAG,eAAe;GACrE,OAAO;EACT;EACA,OAAO,KACL;GAAE;GAAc;GAAkB;EAAI,GACtC,8BACF;EACA,OAAO;CACT;AACF;AAEA,SAAgB,sBACd,aACA,aACoB;CACpB,IAAI,gBAAA,2BAA4B;EAC9B,MAAM,0BAA0B,oBAC9B,YAAY,QAAQ,MAAM,cAAc,GAAG,EAAE,CAC/C;EACA,IAAI,YAAY,WAAW,uBAAuB,GAAG;GACnD,IAAI,eAAe,kBAAkB,WAAW;GAChD,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,KAAK,YAAY,GAC1C,eAAe,WAAW;GAE5B,IAAI,mBAAmB,YAAY,QAAQ,yBAAyB,EAAE;GACtE,MAAM,UAAU,GAAG,aAAa,GAAG;GACnC,MAAM,gBAAgB,SAAS,OAAO;GACtC,IAAI,CAAC,eACH,OAAO;IAAE;IAAc;GAAiB;GAE1C,eAAe,cAAc;GAC7B,mBAAmB,cAAc,SAAS,UAAU,CAAC;GACrD,OAAO;IACL;IACA;GACF;EACF;CACF;CACA,IAAI,eAAe;CACnB,MAAM,QAAQ,YAAY,MAAM,GAAG;CACnC,IAAI,MAAM,SAAS,MAAM,MAAM,EAAE,CAAC,SAAS,GAAG,KAAK,MAAM,EAAE,CAAC,SAAS,GAAG,IAAI;EAC1E,CAAC,gBAAgB;EACjB,MAAM,MAAM;CACd;CACA,IAAI,mBAAmB,MAAM,KAAK,GAAG;CAErC,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,KAAK,YAAY,GAC1C,eAAe,WAAW;CAG5B,MAAM,EAAE,MAAM,SACZ,MAAM,yCAAyC,CAAC,CAAC,KAAK,YAAY,CAAC,EAC/D,UAAU,CAAC;CACjB,IAAI,QAAQ,MAAM;EAChB,eAAe;EACf,mBAAmB,GAAG,kBAAkB,IAAI,EAAE,GAAG;CACnD;CAEA,eAAe,aACZ,QAAQ,qBAAqB,yBAAyB,CAAC,CACvD,QAAQ,gCAAgC,yBAAyB;CAMpE,IAJaA,KAAe;EAC1B,UAAA;EACA,KAAK;CACP,CACO,CAAC,EAAE,kBACR,eAAe,aAAa,QAAQ,SAAS,MAAM;CAErD,IAAI,aAAa,SAAS,YAAY,KAAK,CAAC,iBAAiB,SAAS,GAAG,GACvE,mBAAmB,WAAW;CAEhC,OAAO;EACL;EACA;CACF;AACF;AAEA,SAAgB,8BACd,kBACQ;CACR,OAAO,UAAU,SAAS,iBAAiB,IAAI;AACjD;AAEA,SAAgB,iBAAiB,MAA+B;CAC9D,IAAI,SAAwB;CAE5B,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,CAACC,IAAiB,QAAQ,GAAG,KAAK,CAACA,IAAiB,SAAS,GAAG,GAClE;EAGF,IAAI,CAAC,UAAUA,IAAiB,cAAc,KAAK,MAAM,GACvD,SAAS;CAEb;CAEA,OAAO;AACT;AAEA,MAAM,YAAY,MAAM,4BAA4B;AAEpD,SAAS,oBAAoB,KAAsB;CACjD,IAAI,eAAe,GAAG,MAAM,MAC1B,OAAO;CAGT,MAAM,SAAS,YAAY,GAAG;CAC9B,OAAO,UAAU,KAAK,OAAO,IAAI;AACnC;AAEA,SAAgB,kBAAkB,SAAuC;CACvE,IAAI,QAAQ,QAAQ,oBAAoB,QAAQ,IAAI,GAClD,OAAO,QAAQ;CAGjB,IAAI,CAAC,QAAQ,SAAS,QACpB,OAAO;CAGT,KAAK,MAAM,OAAO,QAAQ,SACxB,IAAI,oBAAoB,GAAG,GACzB,OAAO;CAKX,OAAO,QAAQ,QAAQ;AACzB"}
|
|
@@ -56,7 +56,7 @@ var DockerHubCache = class DockerHubCache {
|
|
|
56
56
|
return needNextPage;
|
|
57
57
|
}
|
|
58
58
|
async save() {
|
|
59
|
-
if (this.isChanged) await set(cacheNamespace, this.dockerRepository, this.cache,
|
|
59
|
+
if (this.isChanged) await set(cacheNamespace, this.dockerRepository, this.cache, 129600);
|
|
60
60
|
}
|
|
61
61
|
getItems() {
|
|
62
62
|
return Object.values(this.cache.items);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dockerhub-cache.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/docker/dockerhub-cache.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport type { DockerHubTag } from './schema.ts';\n\nexport interface DockerHubCacheData {\n items: Record<number, DockerHubTag>;\n updatedAt: string | null;\n}\n\nconst cacheNamespace = 'datasource-docker-hub-cache';\n\nexport class DockerHubCache {\n private isChanged = false;\n private reconciledIds = new Set<number>();\n private dockerRepository: string;\n private cache: DockerHubCacheData;\n\n private constructor(dockerRepository: string, cache: DockerHubCacheData) {\n this.dockerRepository = dockerRepository;\n this.cache = cache;\n }\n\n static async init(dockerRepository: string): Promise<DockerHubCache> {\n let repoCache = await packageCache.get<DockerHubCacheData>(\n cacheNamespace,\n dockerRepository,\n );\n\n repoCache ??= {\n items: {},\n updatedAt: null,\n };\n\n return new DockerHubCache(dockerRepository, repoCache);\n }\n\n reconcile(items: DockerHubTag[], expectedCount: number): boolean {\n let needNextPage = true;\n\n let earliestDate = null;\n\n let { updatedAt } = this.cache;\n let latestDate = updatedAt ? DateTime.fromISO(updatedAt) : null;\n\n for (const newItem of items) {\n const id = newItem.id;\n this.reconciledIds.add(id);\n\n const oldItem = this.cache.items[id];\n\n const itemDate = DateTime.fromISO(newItem.last_updated);\n\n if (!earliestDate || earliestDate > itemDate) {\n earliestDate = itemDate;\n }\n\n if (!latestDate || latestDate < itemDate) {\n latestDate = itemDate;\n updatedAt = newItem.last_updated;\n }\n\n if (dequal(oldItem, newItem)) {\n needNextPage = false;\n continue;\n }\n\n this.cache.items[newItem.id] = newItem;\n this.isChanged = true;\n }\n\n this.cache.updatedAt = updatedAt;\n\n if (earliestDate && latestDate) {\n for (const [key, item] of Object.entries(this.cache.items)) {\n const id = parseInt(key, 10);\n\n const itemDate = DateTime.fromISO(item.last_updated);\n\n if (\n itemDate < earliestDate ||\n itemDate > latestDate ||\n this.reconciledIds.has(id)\n ) {\n continue;\n }\n\n delete this.cache.items[id];\n this.isChanged = true;\n }\n\n if (Object.keys(this.cache.items).length > expectedCount) {\n return true;\n }\n }\n\n return needNextPage;\n }\n\n async save(): Promise<void> {\n if (this.isChanged) {\n await packageCache.set(\n cacheNamespace,\n this.dockerRepository,\n this.cache,\n 3 * 60 * 24 * 30,\n );\n }\n }\n\n getItems(): DockerHubTag[] {\n return Object.values(this.cache.items);\n }\n\n getDigestForTag(tagName: string): string | null {\n return (\n this.getItems().find((item) => item.name === tagName)?.digest ?? null\n );\n }\n\n getArchDigestForTag(tagName: string, architecture: string): string | null {\n const tag = this.getItems().find((item) => item.name === tagName);\n return (\n tag?.images.find((img) => img.architecture === architecture)?.digest ??\n null\n );\n }\n}\n"],"mappings":";;;;AAUA,MAAM,iBAAiB;AAEvB,IAAa,iBAAb,MAAa,eAAe;CAC1B,YAAoB;CACpB,gCAAwB,IAAI,IAAY;CACxC;CACA;CAEA,YAAoB,kBAA0B,OAA2B;EACvE,KAAK,mBAAmB;EACxB,KAAK,QAAQ;CACf;CAEA,aAAa,KAAK,kBAAmD;EACnE,IAAI,YAAY,MAAMA,IACpB,gBACA,gBACF;EAEA,cAAc;GACZ,OAAO,CAAC;GACR,WAAW;EACb;EAEA,OAAO,IAAI,eAAe,kBAAkB,SAAS;CACvD;CAEA,UAAU,OAAuB,eAAgC;EAC/D,IAAI,eAAe;EAEnB,IAAI,eAAe;EAEnB,IAAI,EAAE,cAAc,KAAK;EACzB,IAAI,aAAa,YAAY,SAAS,QAAQ,SAAS,IAAI;EAE3D,KAAK,MAAM,WAAW,OAAO;GAC3B,MAAM,KAAK,QAAQ;GACnB,KAAK,cAAc,IAAI,EAAE;GAEzB,MAAM,UAAU,KAAK,MAAM,MAAM;GAEjC,MAAM,WAAW,SAAS,QAAQ,QAAQ,YAAY;GAEtD,IAAI,CAAC,gBAAgB,eAAe,UAClC,eAAe;GAGjB,IAAI,CAAC,cAAc,aAAa,UAAU;IACxC,aAAa;IACb,YAAY,QAAQ;GACtB;GAEA,IAAI,OAAO,SAAS,OAAO,GAAG;IAC5B,eAAe;IACf;GACF;GAEA,KAAK,MAAM,MAAM,QAAQ,MAAM;GAC/B,KAAK,YAAY;EACnB;EAEA,KAAK,MAAM,YAAY;EAEvB,IAAI,gBAAgB,YAAY;GAC9B,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,MAAM,KAAK,GAAG;IAC1D,MAAM,KAAK,SAAS,KAAK,EAAE;IAE3B,MAAM,WAAW,SAAS,QAAQ,KAAK,YAAY;IAEnD,IACE,WAAW,gBACX,WAAW,cACX,KAAK,cAAc,IAAI,EAAE,GAEzB;IAGF,OAAO,KAAK,MAAM,MAAM;IACxB,KAAK,YAAY;GACnB;GAEA,IAAI,OAAO,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,SAAS,eACzC,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,MAAM,OAAsB;EAC1B,IAAI,KAAK,WACP,MAAMC,IACJ,gBACA,KAAK,kBACL,KAAK,OACL,
|
|
1
|
+
{"version":3,"file":"dockerhub-cache.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/docker/dockerhub-cache.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport type { DockerHubTag } from './schema.ts';\n\nexport interface DockerHubCacheData {\n items: Record<number, DockerHubTag>;\n updatedAt: string | null;\n}\n\nconst cacheNamespace = 'datasource-docker-hub-cache';\n\nexport class DockerHubCache {\n private isChanged = false;\n private reconciledIds = new Set<number>();\n private dockerRepository: string;\n private cache: DockerHubCacheData;\n\n private constructor(dockerRepository: string, cache: DockerHubCacheData) {\n this.dockerRepository = dockerRepository;\n this.cache = cache;\n }\n\n static async init(dockerRepository: string): Promise<DockerHubCache> {\n let repoCache = await packageCache.get<DockerHubCacheData>(\n cacheNamespace,\n dockerRepository,\n );\n\n repoCache ??= {\n items: {},\n updatedAt: null,\n };\n\n return new DockerHubCache(dockerRepository, repoCache);\n }\n\n reconcile(items: DockerHubTag[], expectedCount: number): boolean {\n let needNextPage = true;\n\n let earliestDate = null;\n\n let { updatedAt } = this.cache;\n let latestDate = updatedAt ? DateTime.fromISO(updatedAt) : null;\n\n for (const newItem of items) {\n const id = newItem.id;\n this.reconciledIds.add(id);\n\n const oldItem = this.cache.items[id];\n\n const itemDate = DateTime.fromISO(newItem.last_updated);\n\n if (!earliestDate || earliestDate > itemDate) {\n earliestDate = itemDate;\n }\n\n if (!latestDate || latestDate < itemDate) {\n latestDate = itemDate;\n updatedAt = newItem.last_updated;\n }\n\n if (dequal(oldItem, newItem)) {\n needNextPage = false;\n continue;\n }\n\n this.cache.items[newItem.id] = newItem;\n this.isChanged = true;\n }\n\n this.cache.updatedAt = updatedAt;\n\n if (earliestDate && latestDate) {\n for (const [key, item] of Object.entries(this.cache.items)) {\n const id = parseInt(key, 10);\n\n const itemDate = DateTime.fromISO(item.last_updated);\n\n if (\n itemDate < earliestDate ||\n itemDate > latestDate ||\n this.reconciledIds.has(id)\n ) {\n continue;\n }\n\n delete this.cache.items[id];\n this.isChanged = true;\n }\n\n if (Object.keys(this.cache.items).length > expectedCount) {\n return true;\n }\n }\n\n return needNextPage;\n }\n\n async save(): Promise<void> {\n if (this.isChanged) {\n await packageCache.set(\n cacheNamespace,\n this.dockerRepository,\n this.cache,\n 3 * 60 * 24 * 30,\n );\n }\n }\n\n getItems(): DockerHubTag[] {\n return Object.values(this.cache.items);\n }\n\n getDigestForTag(tagName: string): string | null {\n return (\n this.getItems().find((item) => item.name === tagName)?.digest ?? null\n );\n }\n\n getArchDigestForTag(tagName: string, architecture: string): string | null {\n const tag = this.getItems().find((item) => item.name === tagName);\n return (\n tag?.images.find((img) => img.architecture === architecture)?.digest ??\n null\n );\n }\n}\n"],"mappings":";;;;AAUA,MAAM,iBAAiB;AAEvB,IAAa,iBAAb,MAAa,eAAe;CAC1B,YAAoB;CACpB,gCAAwB,IAAI,IAAY;CACxC;CACA;CAEA,YAAoB,kBAA0B,OAA2B;EACvE,KAAK,mBAAmB;EACxB,KAAK,QAAQ;CACf;CAEA,aAAa,KAAK,kBAAmD;EACnE,IAAI,YAAY,MAAMA,IACpB,gBACA,gBACF;EAEA,cAAc;GACZ,OAAO,CAAC;GACR,WAAW;EACb;EAEA,OAAO,IAAI,eAAe,kBAAkB,SAAS;CACvD;CAEA,UAAU,OAAuB,eAAgC;EAC/D,IAAI,eAAe;EAEnB,IAAI,eAAe;EAEnB,IAAI,EAAE,cAAc,KAAK;EACzB,IAAI,aAAa,YAAY,SAAS,QAAQ,SAAS,IAAI;EAE3D,KAAK,MAAM,WAAW,OAAO;GAC3B,MAAM,KAAK,QAAQ;GACnB,KAAK,cAAc,IAAI,EAAE;GAEzB,MAAM,UAAU,KAAK,MAAM,MAAM;GAEjC,MAAM,WAAW,SAAS,QAAQ,QAAQ,YAAY;GAEtD,IAAI,CAAC,gBAAgB,eAAe,UAClC,eAAe;GAGjB,IAAI,CAAC,cAAc,aAAa,UAAU;IACxC,aAAa;IACb,YAAY,QAAQ;GACtB;GAEA,IAAI,OAAO,SAAS,OAAO,GAAG;IAC5B,eAAe;IACf;GACF;GAEA,KAAK,MAAM,MAAM,QAAQ,MAAM;GAC/B,KAAK,YAAY;EACnB;EAEA,KAAK,MAAM,YAAY;EAEvB,IAAI,gBAAgB,YAAY;GAC9B,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,MAAM,KAAK,GAAG;IAC1D,MAAM,KAAK,SAAS,KAAK,EAAE;IAE3B,MAAM,WAAW,SAAS,QAAQ,KAAK,YAAY;IAEnD,IACE,WAAW,gBACX,WAAW,cACX,KAAK,cAAc,IAAI,EAAE,GAEzB;IAGF,OAAO,KAAK,MAAM,MAAM;IACxB,KAAK,YAAY;GACnB;GAEA,IAAI,OAAO,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,SAAS,eACzC,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,MAAM,OAAsB;EAC1B,IAAI,KAAK,WACP,MAAMC,IACJ,gBACA,KAAK,kBACL,KAAK,OACL,MACF;CAEJ;CAEA,WAA2B;EACzB,OAAO,OAAO,OAAO,KAAK,MAAM,KAAK;CACvC;CAEA,gBAAgB,SAAgC;EAC9C,OACE,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAAO,CAAC,EAAE,UAAU;CAErE;CAEA,oBAAoB,SAAiB,cAAqC;EAExE,OADY,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAErD,CAAC,EAAE,OAAO,MAAM,QAAQ,IAAI,iBAAiB,YAAY,CAAC,EAAE,UAC9D;CAEJ;AACF"}
|
|
@@ -74,7 +74,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
74
74
|
noAuth: true,
|
|
75
75
|
cacheProvider: memCacheProvider
|
|
76
76
|
});
|
|
77
|
-
} catch (err)
|
|
77
|
+
} catch (err) /* istanbul ignore next */ {
|
|
78
78
|
if (err instanceof ExternalHostError) throw err;
|
|
79
79
|
if (err.statusCode === 401) {
|
|
80
80
|
logger.debug({
|
|
@@ -127,7 +127,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
127
127
|
return withCache({
|
|
128
128
|
namespace: "datasource-docker-imageconfig",
|
|
129
129
|
key: `${registryHost}:${dockerRepository}@${configDigest}`,
|
|
130
|
-
ttlMinutes:
|
|
130
|
+
ttlMinutes: 40320
|
|
131
131
|
}, () => this._getImageConfig(registryHost, dockerRepository, configDigest));
|
|
132
132
|
}
|
|
133
133
|
async _getHelmConfig(registryHost, dockerRepository, configDigest) {
|
|
@@ -148,7 +148,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
148
148
|
return withCache({
|
|
149
149
|
namespace: "datasource-docker-imageconfig",
|
|
150
150
|
key: `${registryHost}:${dockerRepository}@${configDigest}`,
|
|
151
|
-
ttlMinutes:
|
|
151
|
+
ttlMinutes: 40320
|
|
152
152
|
}, () => this._getHelmConfig(registryHost, dockerRepository, configDigest));
|
|
153
153
|
}
|
|
154
154
|
async getConfigDigest(registry, dockerRepository, tag) {
|
|
@@ -203,7 +203,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
203
203
|
try {
|
|
204
204
|
manifestResponse = await this.getManifestResponse(registryHost, dockerRepository, currentDigest, "head");
|
|
205
205
|
} catch (_err) {
|
|
206
|
-
const err = _err instanceof ExternalHostError ? _err.err :
|
|
206
|
+
const err = _err instanceof ExternalHostError ? _err.err : /* istanbul ignore next: can never happen */ _err;
|
|
207
207
|
if (typeof err.statusCode === "number" && err.statusCode >= 500 && err.statusCode < 600) return null;
|
|
208
208
|
/* istanbul ignore next */
|
|
209
209
|
throw _err;
|
|
@@ -217,7 +217,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
217
217
|
logger.debug(`Current digest ${currentDigest} relates to architecture ${architecture ?? "null"}`);
|
|
218
218
|
return architecture;
|
|
219
219
|
}
|
|
220
|
-
} catch (err)
|
|
220
|
+
} catch (err) /* istanbul ignore next */ {
|
|
221
221
|
if (err.statusCode !== 404 || err.message === "page-not-found") throw err;
|
|
222
222
|
logger.debug({
|
|
223
223
|
registryHost,
|
|
@@ -231,7 +231,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
231
231
|
return withCache({
|
|
232
232
|
namespace: "datasource-docker-architecture",
|
|
233
233
|
key: `${registryHost}:${dockerRepository}@${currentDigest}`,
|
|
234
|
-
ttlMinutes:
|
|
234
|
+
ttlMinutes: 40320,
|
|
235
235
|
shouldCacheResult: isNonEmptyString
|
|
236
236
|
}, () => this._getImageArchitecture(registryHost, dockerRepository, currentDigest));
|
|
237
237
|
}
|
|
@@ -297,7 +297,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
297
297
|
}
|
|
298
298
|
if (labels) logger.debug({ labels }, "found labels in manifest");
|
|
299
299
|
return labels;
|
|
300
|
-
} catch (err)
|
|
300
|
+
} catch (err) /* istanbul ignore next: should be tested in future */ {
|
|
301
301
|
if (err instanceof ExternalHostError) throw err;
|
|
302
302
|
if (err.statusCode === 400 || err.statusCode === 401) logger.debug({
|
|
303
303
|
registryHost,
|
|
@@ -437,7 +437,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
437
437
|
}
|
|
438
438
|
else tags = await this.getDockerApiTags(registryHost, dockerRepository);
|
|
439
439
|
return tags;
|
|
440
|
-
} catch (_err)
|
|
440
|
+
} catch (_err) /* istanbul ignore next */ {
|
|
441
441
|
const err = _err instanceof ExternalHostError ? _err.err : _err;
|
|
442
442
|
if ((err.statusCode === 404 || err.message === "page-not-found") && !dockerRepository.includes("/")) {
|
|
443
443
|
logger.debug(`Retrying Tags for ${registryHost}/${dockerRepository} using library/ prefix`);
|
|
@@ -563,7 +563,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
563
563
|
}, newValue);
|
|
564
564
|
}
|
|
565
565
|
if (manifestResponse) logger.debug(`Got docker digest ${digest}`);
|
|
566
|
-
} catch (err)
|
|
566
|
+
} catch (err) /* istanbul ignore next */ {
|
|
567
567
|
if (err instanceof ExternalHostError) throw err;
|
|
568
568
|
logger.debug({
|
|
569
569
|
err,
|
|
@@ -576,9 +576,10 @@ var DockerDatasource = class DockerDatasource extends Datasource {
|
|
|
576
576
|
getDigest(config, newValue) {
|
|
577
577
|
const newTag = newValue ?? "latest";
|
|
578
578
|
const { registryHost, dockerRepository } = getRegistryRepository(config.packageName, config.registryUrl);
|
|
579
|
+
const digest = config.currentDigest ? `@${config.currentDigest}` : "";
|
|
579
580
|
return withCache({
|
|
580
581
|
namespace: "datasource-docker-digest",
|
|
581
|
-
key: `${registryHost}:${dockerRepository}:${newTag}${
|
|
582
|
+
key: `${registryHost}:${dockerRepository}:${newTag}${digest}`,
|
|
582
583
|
fallback: true,
|
|
583
584
|
shouldCacheResult: isNonEmptyString
|
|
584
585
|
}, () => this._getDigest(config, newValue));
|