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
|
@@ -55,7 +55,7 @@ var SbtPackageDatasource = class SbtPackageDatasource extends MavenDatasource {
|
|
|
55
55
|
for (const packageRootUrl of packageRootUrls) {
|
|
56
56
|
const packageRootContent = await downloadHttpContent(this.http, packageRootUrl);
|
|
57
57
|
if (!packageRootContent) continue;
|
|
58
|
-
await set("datasource-sbt-package", validRootUrlKey, packageRootUrl,
|
|
58
|
+
await set("datasource-sbt-package", validRootUrlKey, packageRootUrl, 43200);
|
|
59
59
|
dependencyUrl = trimTrailingSlash(packageRootUrl);
|
|
60
60
|
const parsedPackageRootUrl = parseUrl(packageRootUrl);
|
|
61
61
|
if (!parsedPackageRootUrl) {
|
|
@@ -104,8 +104,11 @@ var SbtPackageDatasource = class SbtPackageDatasource extends MavenDatasource {
|
|
|
104
104
|
});
|
|
105
105
|
for (const version of versions) allVersions.add(version);
|
|
106
106
|
}
|
|
107
|
-
if (invalidPackageUrls.size > 0) await set("datasource-sbt-package", invalidPackageUrlsKey, [...invalidPackageUrls],
|
|
108
|
-
if (packageUrls.length > 0)
|
|
107
|
+
if (invalidPackageUrls.size > 0) await set("datasource-sbt-package", invalidPackageUrlsKey, [...invalidPackageUrls], 43200);
|
|
108
|
+
if (packageUrls.length > 0) {
|
|
109
|
+
const packageUrlsKey = `package-urls:${registryUrl}:${packageName}`;
|
|
110
|
+
await set("datasource-sbt-package", packageUrlsKey, packageUrls, 43200);
|
|
111
|
+
}
|
|
109
112
|
const versions = [...allVersions];
|
|
110
113
|
if (!versions.length) return null;
|
|
111
114
|
const res = {
|
|
@@ -129,7 +132,7 @@ var SbtPackageDatasource = class SbtPackageDatasource extends MavenDatasource {
|
|
|
129
132
|
const invalidPomFilesKey = `invalid-pom-files:${registryUrl}:${packageName}:${version}`;
|
|
130
133
|
const invalidPomFiles = new Set(await get("datasource-sbt-package", invalidPomFilesKey));
|
|
131
134
|
async function saveCache() {
|
|
132
|
-
if (invalidPomFiles.size > 0) await set("datasource-sbt-package", invalidPomFilesKey, [...invalidPomFiles],
|
|
135
|
+
if (invalidPomFiles.size > 0) await set("datasource-sbt-package", invalidPomFilesKey, [...invalidPomFiles], 43200);
|
|
133
136
|
}
|
|
134
137
|
for (const packageUrl of packageUrls) {
|
|
135
138
|
const artifactDir = upath.basename(packageUrl);
|
|
@@ -180,7 +183,7 @@ var SbtPackageDatasource = class SbtPackageDatasource extends MavenDatasource {
|
|
|
180
183
|
return withCache({
|
|
181
184
|
namespace: "datasource-sbt-package",
|
|
182
185
|
key: `postprocessRelease:${config.registryUrl}:${config.packageName}:${release.version}`,
|
|
183
|
-
ttlMinutes:
|
|
186
|
+
ttlMinutes: 43200
|
|
184
187
|
}, () => this._postprocessRelease(config, release));
|
|
185
188
|
}
|
|
186
189
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/sbt-package/index.ts"],"sourcesContent":["import upath from 'upath';\nimport { XmlDocument } from 'xmldoc';\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 { Http } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport {\n ensureTrailingSlash,\n parseUrl,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport * as ivyVersioning from '../../versioning/ivy/index.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\nimport { MAVEN_REPO } from '../maven/common.ts';\nimport { MavenDatasource } from '../maven/index.ts';\nimport { downloadHttpContent, downloadHttpProtocol } from '../maven/util.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { extractPageLinks, getLatestVersion } from './util.ts';\n\ninterface ScalaDepCoordinate {\n groupId: string;\n artifactId: string;\n scalaVersion?: string;\n}\n\ninterface PomInfo {\n homepage?: string;\n sourceUrl?: string;\n releaseTimestamp?: Timestamp;\n}\n\nexport class SbtPackageDatasource extends MavenDatasource {\n static override readonly id = 'sbt-package';\n\n override readonly defaultRegistryUrls = [MAVEN_REPO];\n\n override readonly defaultVersioning = ivyVersioning.id;\n\n override readonly registryStrategy: RegistryStrategy = 'hunt';\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` tags in the results.';\n\n constructor(id = SbtPackageDatasource.id) {\n super(id);\n this.http = new Http('sbt');\n }\n\n protected static parseDepCoordinate(packageName: string): ScalaDepCoordinate {\n const [groupId, javaArtifactId] = packageName.split(':');\n const [artifactId, scalaVersion] = javaArtifactId.split('_');\n return { groupId, artifactId, scalaVersion };\n }\n\n async getSbtReleases(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult | null> {\n const { groupId, artifactId, scalaVersion } =\n SbtPackageDatasource.parseDepCoordinate(packageName);\n\n const groupIdSplit = groupId.split('.');\n const repoRootUrl = ensureTrailingSlash(registryUrl);\n\n const validRootUrlKey = `valid-root-url:${registryUrl}:${packageName}`;\n const validRootUrl = await packageCache.get<string>(\n 'datasource-sbt-package',\n validRootUrlKey,\n );\n\n const packageRootUrls: string[] = [];\n // istanbul ignore if: not easily testable\n if (validRootUrl) {\n packageRootUrls.push(validRootUrl);\n } else {\n function packageRootUrlWith(sep: string): string {\n return `${repoRootUrl}${groupIdSplit.join(sep)}`;\n }\n packageRootUrls.push(ensureTrailingSlash(packageRootUrlWith('/')));\n packageRootUrls.push(ensureTrailingSlash(packageRootUrlWith('.')));\n }\n\n let dependencyUrl: string | undefined;\n let packageUrls: string[] | undefined;\n for (const packageRootUrl of packageRootUrls) {\n const packageRootContent = await downloadHttpContent(\n this.http,\n packageRootUrl,\n );\n if (!packageRootContent) {\n continue;\n }\n\n await packageCache.set(\n 'datasource-sbt-package',\n validRootUrlKey,\n packageRootUrl,\n 30 * 24 * 60,\n );\n\n dependencyUrl = trimTrailingSlash(packageRootUrl);\n\n const parsedPackageRootUrl = parseUrl(packageRootUrl);\n if (!parsedPackageRootUrl) {\n logger.warn({ packageRootUrl }, 'Failed to parse packageURL');\n continue;\n }\n const rootPath = parsedPackageRootUrl.pathname;\n const artifactSubdirs = extractPageLinks(packageRootContent, (href) => {\n const path = href.replace(rootPath, '');\n\n if (\n path.startsWith(`${artifactId}_native`) ||\n path.startsWith(`${artifactId}_sjs`)\n ) {\n return null;\n }\n\n if (path === artifactId || path.startsWith(`${artifactId}_`)) {\n return ensureTrailingSlash(`${packageRootUrl}${path}`);\n }\n\n return null;\n });\n\n if (scalaVersion) {\n const scalaSubdir = artifactSubdirs.find((x) =>\n x.endsWith(`/${artifactId}_${scalaVersion}/`),\n );\n if (scalaSubdir) {\n packageUrls = [scalaSubdir];\n break;\n }\n }\n\n packageUrls = artifactSubdirs;\n break;\n }\n\n if (!packageUrls) {\n return null;\n }\n\n const invalidPackageUrlsKey = `invalid-package-urls:${registryUrl}:${packageName}`;\n const invalidPackageUrls = new Set(\n await packageCache.get<string[]>(\n 'datasource-sbt-package',\n invalidPackageUrlsKey,\n ),\n );\n packageUrls = packageUrls.filter((url) => !invalidPackageUrls.has(url));\n\n const allVersions = new Set<string>();\n for (const pkgUrl of packageUrls) {\n const parsedPkgUrl = parseUrl(pkgUrl);\n if (!parsedPkgUrl) {\n invalidPackageUrls.add(pkgUrl);\n continue;\n }\n\n const packageContent = await downloadHttpContent(this.http, pkgUrl);\n // istanbul ignore if\n if (!packageContent) {\n invalidPackageUrls.add(pkgUrl);\n continue;\n }\n\n const rootPath = parsedPkgUrl.pathname;\n const versions = extractPageLinks(packageContent, (href) => {\n const path = href.replace(rootPath, '');\n if (path.startsWith('.')) {\n return null;\n }\n\n return path;\n });\n\n for (const version of versions) {\n allVersions.add(version);\n }\n }\n\n if (invalidPackageUrls.size > 0) {\n await packageCache.set(\n 'datasource-sbt-package',\n invalidPackageUrlsKey,\n [...invalidPackageUrls],\n 30 * 24 * 60,\n );\n }\n\n if (packageUrls.length > 0) {\n const packageUrlsKey = `package-urls:${registryUrl}:${packageName}`;\n await packageCache.set(\n 'datasource-sbt-package',\n packageUrlsKey,\n packageUrls,\n 30 * 24 * 60,\n );\n }\n\n const versions = [...allVersions];\n if (!versions.length) {\n return null;\n }\n\n const releases: Release[] = [...allVersions]\n .sort(compare)\n .map((version) => ({ version }));\n const res: ReleaseResult = { releases, dependencyUrl };\n\n const latestVersion = getLatestVersion(versions);\n const pomInfo = await this.getPomInfo(\n registryUrl,\n packageName,\n latestVersion,\n packageUrls,\n );\n\n if (pomInfo?.homepage) {\n res.homepage = pomInfo.homepage;\n }\n\n if (pomInfo?.sourceUrl) {\n res.sourceUrl = pomInfo.sourceUrl;\n }\n\n return res;\n }\n\n async getPomInfo(\n registryUrl: string,\n packageName: string,\n version: string | null,\n pkgUrls?: string[],\n ): Promise<PomInfo | null> {\n const packageUrlsKey = `package-urls:${registryUrl}:${packageName}`;\n // istanbul ignore next: will be covered later\n const packageUrls =\n pkgUrls ??\n (await packageCache.get<string[]>(\n 'datasource-sbt-package',\n packageUrlsKey,\n ));\n\n // istanbul ignore if\n if (!packageUrls?.length) {\n return null;\n }\n\n // istanbul ignore if\n if (!version) {\n return null;\n }\n\n const invalidPomFilesKey = `invalid-pom-files:${registryUrl}:${packageName}:${version}`;\n const invalidPomFiles = new Set(\n await packageCache.get<string[]>(\n 'datasource-sbt-package',\n invalidPomFilesKey,\n ),\n );\n\n async function saveCache(): Promise<void> {\n if (invalidPomFiles.size > 0) {\n await packageCache.set(\n 'datasource-sbt-package',\n invalidPomFilesKey,\n [...invalidPomFiles],\n 30 * 24 * 60,\n );\n }\n }\n\n for (const packageUrl of packageUrls) {\n const artifactDir = upath.basename(packageUrl);\n const [artifact] = artifactDir.split('_');\n\n for (const pomFilePrefix of [artifactDir, artifact]) {\n const pomFileName = `${pomFilePrefix}-${version}.pom`;\n const pomUrl = `${packageUrl}${version}/${pomFileName}`;\n if (invalidPomFiles.has(pomUrl)) {\n continue;\n }\n\n const res = await downloadHttpProtocol(this.http, pomUrl);\n const { val } = res.unwrap();\n if (!val) {\n invalidPomFiles.add(pomUrl);\n continue;\n }\n\n const result: PomInfo = {};\n\n const releaseTimestamp = asTimestamp(val.lastModified);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n const pomXml = new XmlDocument(val.data);\n\n const homepage = pomXml.valueWithPath('url');\n if (homepage) {\n result.homepage = homepage;\n }\n\n const sourceUrl = pomXml.valueWithPath('scm.url');\n if (sourceUrl) {\n result.sourceUrl = sourceUrl\n .replace(regEx(/^scm:/), '')\n .replace(regEx(/^git:/), '')\n .replace(regEx(/^git@github.com:/), 'https://github.com/')\n .replace(regEx(/\\.git$/), '');\n }\n\n await saveCache();\n return result;\n }\n }\n\n await saveCache();\n return null;\n }\n\n override async getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName, registryUrl } = config;\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n\n const sbtReleases = await this.getSbtReleases(registryUrl, packageName);\n if (sbtReleases) {\n return sbtReleases;\n }\n\n logger.debug(\n `Sbt: no versions discovered for ${packageName} listing organization root package folder, fallback to maven datasource for version discovery`,\n );\n const mavenReleaseResult = await super.getReleases(config);\n if (mavenReleaseResult) {\n return mavenReleaseResult;\n }\n\n logger.debug(`Sbt: no versions found for \"${packageName}\"`);\n return null;\n }\n\n private async _postprocessRelease(\n config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n /* v8 ignore next 3 -- should never happen */\n if (!config.registryUrl) {\n return release;\n }\n\n const res = await this.getPomInfo(\n config.registryUrl,\n config.packageName,\n release.version,\n );\n\n if (res?.releaseTimestamp) {\n release.releaseTimestamp = res.releaseTimestamp;\n }\n\n return release;\n }\n\n override postprocessRelease(\n config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n return withCache(\n {\n namespace: 'datasource-sbt-package',\n key: `postprocessRelease:${config.registryUrl}:${config.packageName}:${release.version}`,\n ttlMinutes: 30 * 24 * 60,\n },\n () => this._postprocessRelease(config, release),\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/sbt-package/index.ts"],"sourcesContent":["import upath from 'upath';\nimport { XmlDocument } from 'xmldoc';\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 { Http } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport {\n ensureTrailingSlash,\n parseUrl,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport * as ivyVersioning from '../../versioning/ivy/index.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\nimport { MAVEN_REPO } from '../maven/common.ts';\nimport { MavenDatasource } from '../maven/index.ts';\nimport { downloadHttpContent, downloadHttpProtocol } from '../maven/util.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { extractPageLinks, getLatestVersion } from './util.ts';\n\ninterface ScalaDepCoordinate {\n groupId: string;\n artifactId: string;\n scalaVersion?: string;\n}\n\ninterface PomInfo {\n homepage?: string;\n sourceUrl?: string;\n releaseTimestamp?: Timestamp;\n}\n\nexport class SbtPackageDatasource extends MavenDatasource {\n static override readonly id = 'sbt-package';\n\n override readonly defaultRegistryUrls = [MAVEN_REPO];\n\n override readonly defaultVersioning = ivyVersioning.id;\n\n override readonly registryStrategy: RegistryStrategy = 'hunt';\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` tags in the results.';\n\n constructor(id = SbtPackageDatasource.id) {\n super(id);\n this.http = new Http('sbt');\n }\n\n protected static parseDepCoordinate(packageName: string): ScalaDepCoordinate {\n const [groupId, javaArtifactId] = packageName.split(':');\n const [artifactId, scalaVersion] = javaArtifactId.split('_');\n return { groupId, artifactId, scalaVersion };\n }\n\n async getSbtReleases(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult | null> {\n const { groupId, artifactId, scalaVersion } =\n SbtPackageDatasource.parseDepCoordinate(packageName);\n\n const groupIdSplit = groupId.split('.');\n const repoRootUrl = ensureTrailingSlash(registryUrl);\n\n const validRootUrlKey = `valid-root-url:${registryUrl}:${packageName}`;\n const validRootUrl = await packageCache.get<string>(\n 'datasource-sbt-package',\n validRootUrlKey,\n );\n\n const packageRootUrls: string[] = [];\n // istanbul ignore if: not easily testable\n if (validRootUrl) {\n packageRootUrls.push(validRootUrl);\n } else {\n function packageRootUrlWith(sep: string): string {\n return `${repoRootUrl}${groupIdSplit.join(sep)}`;\n }\n packageRootUrls.push(ensureTrailingSlash(packageRootUrlWith('/')));\n packageRootUrls.push(ensureTrailingSlash(packageRootUrlWith('.')));\n }\n\n let dependencyUrl: string | undefined;\n let packageUrls: string[] | undefined;\n for (const packageRootUrl of packageRootUrls) {\n const packageRootContent = await downloadHttpContent(\n this.http,\n packageRootUrl,\n );\n if (!packageRootContent) {\n continue;\n }\n\n await packageCache.set(\n 'datasource-sbt-package',\n validRootUrlKey,\n packageRootUrl,\n 30 * 24 * 60,\n );\n\n dependencyUrl = trimTrailingSlash(packageRootUrl);\n\n const parsedPackageRootUrl = parseUrl(packageRootUrl);\n if (!parsedPackageRootUrl) {\n logger.warn({ packageRootUrl }, 'Failed to parse packageURL');\n continue;\n }\n const rootPath = parsedPackageRootUrl.pathname;\n const artifactSubdirs = extractPageLinks(packageRootContent, (href) => {\n const path = href.replace(rootPath, '');\n\n if (\n path.startsWith(`${artifactId}_native`) ||\n path.startsWith(`${artifactId}_sjs`)\n ) {\n return null;\n }\n\n if (path === artifactId || path.startsWith(`${artifactId}_`)) {\n return ensureTrailingSlash(`${packageRootUrl}${path}`);\n }\n\n return null;\n });\n\n if (scalaVersion) {\n const scalaSubdir = artifactSubdirs.find((x) =>\n x.endsWith(`/${artifactId}_${scalaVersion}/`),\n );\n if (scalaSubdir) {\n packageUrls = [scalaSubdir];\n break;\n }\n }\n\n packageUrls = artifactSubdirs;\n break;\n }\n\n if (!packageUrls) {\n return null;\n }\n\n const invalidPackageUrlsKey = `invalid-package-urls:${registryUrl}:${packageName}`;\n const invalidPackageUrls = new Set(\n await packageCache.get<string[]>(\n 'datasource-sbt-package',\n invalidPackageUrlsKey,\n ),\n );\n packageUrls = packageUrls.filter((url) => !invalidPackageUrls.has(url));\n\n const allVersions = new Set<string>();\n for (const pkgUrl of packageUrls) {\n const parsedPkgUrl = parseUrl(pkgUrl);\n if (!parsedPkgUrl) {\n invalidPackageUrls.add(pkgUrl);\n continue;\n }\n\n const packageContent = await downloadHttpContent(this.http, pkgUrl);\n // istanbul ignore if\n if (!packageContent) {\n invalidPackageUrls.add(pkgUrl);\n continue;\n }\n\n const rootPath = parsedPkgUrl.pathname;\n const versions = extractPageLinks(packageContent, (href) => {\n const path = href.replace(rootPath, '');\n if (path.startsWith('.')) {\n return null;\n }\n\n return path;\n });\n\n for (const version of versions) {\n allVersions.add(version);\n }\n }\n\n if (invalidPackageUrls.size > 0) {\n await packageCache.set(\n 'datasource-sbt-package',\n invalidPackageUrlsKey,\n [...invalidPackageUrls],\n 30 * 24 * 60,\n );\n }\n\n if (packageUrls.length > 0) {\n const packageUrlsKey = `package-urls:${registryUrl}:${packageName}`;\n await packageCache.set(\n 'datasource-sbt-package',\n packageUrlsKey,\n packageUrls,\n 30 * 24 * 60,\n );\n }\n\n const versions = [...allVersions];\n if (!versions.length) {\n return null;\n }\n\n const releases: Release[] = [...allVersions]\n .sort(compare)\n .map((version) => ({ version }));\n const res: ReleaseResult = { releases, dependencyUrl };\n\n const latestVersion = getLatestVersion(versions);\n const pomInfo = await this.getPomInfo(\n registryUrl,\n packageName,\n latestVersion,\n packageUrls,\n );\n\n if (pomInfo?.homepage) {\n res.homepage = pomInfo.homepage;\n }\n\n if (pomInfo?.sourceUrl) {\n res.sourceUrl = pomInfo.sourceUrl;\n }\n\n return res;\n }\n\n async getPomInfo(\n registryUrl: string,\n packageName: string,\n version: string | null,\n pkgUrls?: string[],\n ): Promise<PomInfo | null> {\n const packageUrlsKey = `package-urls:${registryUrl}:${packageName}`;\n // istanbul ignore next: will be covered later\n const packageUrls =\n pkgUrls ??\n (await packageCache.get<string[]>(\n 'datasource-sbt-package',\n packageUrlsKey,\n ));\n\n // istanbul ignore if\n if (!packageUrls?.length) {\n return null;\n }\n\n // istanbul ignore if\n if (!version) {\n return null;\n }\n\n const invalidPomFilesKey = `invalid-pom-files:${registryUrl}:${packageName}:${version}`;\n const invalidPomFiles = new Set(\n await packageCache.get<string[]>(\n 'datasource-sbt-package',\n invalidPomFilesKey,\n ),\n );\n\n async function saveCache(): Promise<void> {\n if (invalidPomFiles.size > 0) {\n await packageCache.set(\n 'datasource-sbt-package',\n invalidPomFilesKey,\n [...invalidPomFiles],\n 30 * 24 * 60,\n );\n }\n }\n\n for (const packageUrl of packageUrls) {\n const artifactDir = upath.basename(packageUrl);\n const [artifact] = artifactDir.split('_');\n\n for (const pomFilePrefix of [artifactDir, artifact]) {\n const pomFileName = `${pomFilePrefix}-${version}.pom`;\n const pomUrl = `${packageUrl}${version}/${pomFileName}`;\n if (invalidPomFiles.has(pomUrl)) {\n continue;\n }\n\n const res = await downloadHttpProtocol(this.http, pomUrl);\n const { val } = res.unwrap();\n if (!val) {\n invalidPomFiles.add(pomUrl);\n continue;\n }\n\n const result: PomInfo = {};\n\n const releaseTimestamp = asTimestamp(val.lastModified);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n const pomXml = new XmlDocument(val.data);\n\n const homepage = pomXml.valueWithPath('url');\n if (homepage) {\n result.homepage = homepage;\n }\n\n const sourceUrl = pomXml.valueWithPath('scm.url');\n if (sourceUrl) {\n result.sourceUrl = sourceUrl\n .replace(regEx(/^scm:/), '')\n .replace(regEx(/^git:/), '')\n .replace(regEx(/^git@github.com:/), 'https://github.com/')\n .replace(regEx(/\\.git$/), '');\n }\n\n await saveCache();\n return result;\n }\n }\n\n await saveCache();\n return null;\n }\n\n override async getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName, registryUrl } = config;\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n\n const sbtReleases = await this.getSbtReleases(registryUrl, packageName);\n if (sbtReleases) {\n return sbtReleases;\n }\n\n logger.debug(\n `Sbt: no versions discovered for ${packageName} listing organization root package folder, fallback to maven datasource for version discovery`,\n );\n const mavenReleaseResult = await super.getReleases(config);\n if (mavenReleaseResult) {\n return mavenReleaseResult;\n }\n\n logger.debug(`Sbt: no versions found for \"${packageName}\"`);\n return null;\n }\n\n private async _postprocessRelease(\n config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n /* v8 ignore next 3 -- should never happen */\n if (!config.registryUrl) {\n return release;\n }\n\n const res = await this.getPomInfo(\n config.registryUrl,\n config.packageName,\n release.version,\n );\n\n if (res?.releaseTimestamp) {\n release.releaseTimestamp = res.releaseTimestamp;\n }\n\n return release;\n }\n\n override postprocessRelease(\n config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n return withCache(\n {\n namespace: 'datasource-sbt-package',\n key: `postprocessRelease:${config.registryUrl}:${config.packageName}:${release.version}`,\n ttlMinutes: 30 * 24 * 60,\n },\n () => this._postprocessRelease(config, release),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,8 @@ import { compare } from "../../versioning/maven/compare.js";
|
|
|
4
4
|
//#region lib/modules/datasource/sbt-package/util.ts
|
|
5
5
|
const linkRegExp = /(?<=href=['"])[^'"]*(?=\/['"])/gi;
|
|
6
6
|
function extractPageLinks(html, filterMapHref) {
|
|
7
|
-
|
|
7
|
+
const unfiltered = coerceArray(html.match(linkRegExp));
|
|
8
|
+
return filterMap(unfiltered, filterMapHref);
|
|
8
9
|
}
|
|
9
10
|
function getLatestVersion(versions) {
|
|
10
11
|
if (versions?.length) return versions.reduce((latestVersion, version) => compare(version, latestVersion) === 1 ? version : latestVersion);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","names":[],"sources":["../../../../lib/modules/datasource/sbt-package/util.ts"],"sourcesContent":["import { coerceArray } from '../../../util/array.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\n\nconst linkRegExp = /(?<=href=['\"])[^'\"]*(?=\\/['\"])/gi;\n\nexport function extractPageLinks(\n html: string,\n filterMapHref: (href: string) => string | null | undefined,\n): string[] {\n const unfiltered = coerceArray(html.match(linkRegExp));\n return filterMap(unfiltered, filterMapHref);\n}\n\nexport function getLatestVersion(versions: string[] | null): string | null {\n if (versions?.length) {\n return versions.reduce((latestVersion, version) =>\n compare(version, latestVersion) === 1 ? version : latestVersion,\n );\n }\n return null;\n}\n"],"mappings":";;;;AAIA,MAAM,aAAa;AAEnB,SAAgB,iBACd,MACA,eACU;
|
|
1
|
+
{"version":3,"file":"util.js","names":[],"sources":["../../../../lib/modules/datasource/sbt-package/util.ts"],"sourcesContent":["import { coerceArray } from '../../../util/array.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\n\nconst linkRegExp = /(?<=href=['\"])[^'\"]*(?=\\/['\"])/gi;\n\nexport function extractPageLinks(\n html: string,\n filterMapHref: (href: string) => string | null | undefined,\n): string[] {\n const unfiltered = coerceArray(html.match(linkRegExp));\n return filterMap(unfiltered, filterMapHref);\n}\n\nexport function getLatestVersion(versions: string[] | null): string | null {\n if (versions?.length) {\n return versions.reduce((latestVersion, version) =>\n compare(version, latestVersion) === 1 ? version : latestVersion,\n );\n }\n return null;\n}\n"],"mappings":";;;;AAIA,MAAM,aAAa;AAEnB,SAAgB,iBACd,MACA,eACU;CACV,MAAM,aAAa,YAAY,KAAK,MAAM,UAAU,CAAC;CACrD,OAAO,UAAU,YAAY,aAAa;AAC5C;AAEA,SAAgB,iBAAiB,UAA0C;CACzE,IAAI,UAAU,QACZ,OAAO,SAAS,QAAQ,eAAe,YACrC,QAAQ,SAAS,aAAa,MAAM,IAAI,UAAU,aACpD;CAEF,OAAO;AACT"}
|
|
@@ -86,7 +86,8 @@ var TerraformModuleDatasource = class TerraformModuleDatasource extends Terrafor
|
|
|
86
86
|
* https://developer.hashicorp.com/terraform/registry/api-docs#get-a-specific-module
|
|
87
87
|
*/
|
|
88
88
|
async queryTerraformRegistry(registryUrl, repository) {
|
|
89
|
-
const
|
|
89
|
+
const serviceDiscovery = await this.getTerraformServiceDiscoveryResult(registryUrl);
|
|
90
|
+
const pkgUrl = createSDBackendURL(registryUrl, "modules.v1", serviceDiscovery, repository);
|
|
90
91
|
const { body: res } = await this.http.getJson(pkgUrl, TerraformModuleResponse);
|
|
91
92
|
return {
|
|
92
93
|
releases: res.versions,
|
|
@@ -104,7 +105,8 @@ var TerraformModuleDatasource = class TerraformModuleDatasource extends Terrafor
|
|
|
104
105
|
* https://developer.hashicorp.com/terraform/internals/module-registry-protocol
|
|
105
106
|
*/
|
|
106
107
|
async queryModuleRegistry(registryUrl, repository) {
|
|
107
|
-
const
|
|
108
|
+
const serviceDiscovery = await this.getTerraformServiceDiscoveryResult(registryUrl);
|
|
109
|
+
const pkgUrl = createSDBackendURL(registryUrl, "modules.v1", serviceDiscovery, `${repository}/versions`);
|
|
108
110
|
const { body: res } = await this.http.getJson(pkgUrl, ProtocolModuleResponse);
|
|
109
111
|
return {
|
|
110
112
|
releases: res.versions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["hashicorpVersioning.id"],"sources":["../../../../lib/modules/datasource/terraform-module/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getQueryString, isHttpUrl, joinUrlParts } from '../../../util/url.ts';\nimport * as hashicorpVersioning from '../../versioning/hashicorp/index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { TerraformDatasource } from './base.ts';\nimport {\n OpenTofuModuleDocsResponse,\n ProtocolModuleResponse,\n TerraformModuleResponse,\n TerraformModuleV2Response,\n} from './schema.ts';\nimport { createSDBackendURL, getRegistryRepository } from './utils.ts';\n\nexport class TerraformModuleDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-module';\n\n static readonly terraformCloudUrl = 'https://app.terraform.io';\n\n static readonly defaultRegistryUrls = [\n TerraformModuleDatasource.terraformRegistryUrl,\n ];\n\n constructor() {\n super(TerraformModuleDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformModuleDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'For `registry.terraform.io` and `registry.opentofu.org` (via `api.opentofu.org`), release timestamps are available for all versions. For `app.terraform.io`, only the latest version is annotated, using the `published_at` field from the extended module endpoint.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'For `registry.terraform.io` and `app.terraform.io`, the source URL is taken from the `source` field of the registry response. For `registry.opentofu.org`, it is derived from the package name following the OpenTofu registry policy of `github.com/NAMESPACE/terraform-TARGETSYSTEM-NAME`.';\n\n /**\n * Resolves a module release list for the configured registry.\n *\n * Requests against the public Terraform registry and Terraform Cloud use the\n * registry-specific module endpoint, while other registries use the generic\n * Module Registry Protocol versions endpoint.\n */\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const { registry, repository } = getRegistryRepository(\n packageName,\n registryUrl,\n );\n logger.trace(\n { registryUrlNormalized: registry, terraformRepository: repository },\n 'terraform-module.getReleases()',\n );\n\n try {\n if (registry === TerraformModuleDatasource.terraformRegistryUrl) {\n return await this.queryTerraformRegistryV2(registry, repository);\n }\n if (\n registry === TerraformModuleDatasource.openTofuRegistryUrl ||\n registry === TerraformModuleDatasource.openTofuApiUrl\n ) {\n return await this.queryOpenTofuRegistry(repository);\n }\n if (registry === TerraformModuleDatasource.terraformCloudUrl) {\n return await this.queryTerraformRegistry(registry, repository);\n }\n\n // Use the standard Module Registry Protocol for other conformant registries.\n return await this.queryModuleRegistry(registry, repository);\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${TerraformModuleDatasource.id}`,\n key: TerraformModuleDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Query the Terraform Registry using the undocumented v2 JSON:API.\n *\n * Returns release timestamps for all versions, unlike the v1 extended\n * module endpoint which only exposed the timestamp for the latest version.\n */\n private async queryTerraformRegistryV2(\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult> {\n const moduleUrl = `${joinUrlParts(\n registryUrl,\n 'v2/modules',\n repository,\n )}?${getQueryString({ include: 'module-versions' })}`;\n const { body: res } = await this.http.getJson(\n moduleUrl,\n TerraformModuleV2Response,\n );\n res.homepage = `${registryUrl}/modules/${repository}`;\n return res;\n }\n\n /**\n * Query the OpenTofu registry docs API.\n * https://api.opentofu.org/\n *\n * Used when the registry URL is `registry.opentofu.org`.\n * Queries `api.opentofu.org` for module versions with release timestamps.\n */\n private async queryOpenTofuRegistry(\n repository: string,\n ): Promise<ReleaseResult> {\n const docsUrl = joinUrlParts(\n TerraformModuleDatasource.openTofuApiUrl,\n 'registry/docs/modules',\n repository,\n 'index.json',\n );\n const { body: res } = await this.http.getJson(\n docsUrl,\n OpenTofuModuleDocsResponse,\n );\n res.homepage = `https://search.opentofu.org/module/${repository}`;\n\n // The OpenTofu registry only indexes modules hosted on GitHub under the\n // `NAMESPACE/terraform-TARGETSYSTEM-NAME` repository naming convention, so\n // the source URL can be derived deterministically from the package name.\n // https://github.com/opentofu/registry/blob/main/PROCEDURES.md\n const [namespace, name, target] = repository.split('/');\n res.sourceUrl = `https://github.com/${namespace}/terraform-${target}-${name}`;\n\n return res;\n }\n\n /**\n * Queries the Terraform Registry module endpoint.\n *\n * The response includes the latest published version separately, so only that\n * release can be annotated with `releaseTimestamp`.\n *\n * https://developer.hashicorp.com/terraform/registry/api-docs#get-a-specific-module\n */\n private async queryTerraformRegistry(\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult> {\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const pkgUrl = createSDBackendURL(\n registryUrl,\n 'modules.v1',\n serviceDiscovery,\n repository,\n );\n const { body: res } = await this.http.getJson(\n pkgUrl,\n TerraformModuleResponse,\n );\n return {\n releases: res.versions,\n sourceUrl: res.source,\n homepage: `${registryUrl}/modules/${repository}`,\n };\n }\n\n /**\n * Queries a registry through the Terraform Module Registry Protocol.\n *\n * This is the default path for registries implementing the standard module\n * registry protocol. It returns release versions and, when present and valid,\n * the upstream source URL.\n *\n * https://developer.hashicorp.com/terraform/internals/module-registry-protocol\n */\n private async queryModuleRegistry(\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult | null> {\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const pkgUrl = createSDBackendURL(\n registryUrl,\n 'modules.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const { body: res } = await this.http.getJson(\n pkgUrl,\n ProtocolModuleResponse,\n );\n return {\n releases: res.versions,\n sourceUrl: isHttpUrl(res.source) ? res.source : undefined,\n };\n }\n\n private static getCacheKey({\n packageName,\n registryUrl,\n }: GetReleasesConfig): string {\n const { registry, repository } = getRegistryRepository(\n packageName,\n registryUrl,\n );\n return `${registry}/${repository}`;\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,4BAAb,MAAa,kCAAkC,oBAAoB;CACjE,OAAyB,KAAK;CAE9B,OAAgB,oBAAoB;CAEpC,OAAgB,sBAAsB,CACpC,0BAA0B,oBAC5B;CAEA,cAAc;EACZ,MAAM,0BAA0B,EAAE;CACpC;CAEA,sBACE,0BAA0B;CAE5B,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;;;;;;;;CASF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,EAAE,UAAU,eAAe,sBAC/B,aACA,WACF;EACA,OAAO,MACL;GAAE,uBAAuB;GAAU,qBAAqB;EAAW,GACnE,gCACF;EAEA,IAAI;GACF,IAAI,aAAa,0BAA0B,sBACzC,OAAO,MAAM,KAAK,yBAAyB,UAAU,UAAU;GAEjE,IACE,aAAa,0BAA0B,uBACvC,aAAa,0BAA0B,gBAEvC,OAAO,MAAM,KAAK,sBAAsB,UAAU;GAEpD,IAAI,aAAa,0BAA0B,mBACzC,OAAO,MAAM,KAAK,uBAAuB,UAAU,UAAU;GAI/D,OAAO,MAAM,KAAK,oBAAoB,UAAU,UAAU;EAC5D,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,0BAA0B;GACnD,KAAK,0BAA0B,YAAY,MAAM;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;;;;;;;CAQA,MAAc,yBACZ,aACA,YACwB;EACxB,MAAM,YAAY,GAAG,aACnB,aACA,cACA,UACF,EAAE,GAAG,eAAe,EAAE,SAAS,kBAAkB,CAAC;EAClD,MAAM,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,QACpC,WACA,yBACF;EACA,IAAI,WAAW,GAAG,YAAY,WAAW;EACzC,OAAO;CACT;;;;;;;;CASA,MAAc,sBACZ,YACwB;EACxB,MAAM,UAAU,aACd,0BAA0B,gBAC1B,yBACA,YACA,YACF;EACA,MAAM,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,QACpC,SACA,0BACF;EACA,IAAI,WAAW,sCAAsC;EAMrD,MAAM,CAAC,WAAW,MAAM,UAAU,WAAW,MAAM,GAAG;EACtD,IAAI,YAAY,sBAAsB,UAAU,aAAa,OAAO,GAAG;EAEvE,OAAO;CACT;;;;;;;;;CAUA,MAAc,uBACZ,aACA,YACwB;
|
|
1
|
+
{"version":3,"file":"index.js","names":["hashicorpVersioning.id"],"sources":["../../../../lib/modules/datasource/terraform-module/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getQueryString, isHttpUrl, joinUrlParts } from '../../../util/url.ts';\nimport * as hashicorpVersioning from '../../versioning/hashicorp/index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { TerraformDatasource } from './base.ts';\nimport {\n OpenTofuModuleDocsResponse,\n ProtocolModuleResponse,\n TerraformModuleResponse,\n TerraformModuleV2Response,\n} from './schema.ts';\nimport { createSDBackendURL, getRegistryRepository } from './utils.ts';\n\nexport class TerraformModuleDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-module';\n\n static readonly terraformCloudUrl = 'https://app.terraform.io';\n\n static readonly defaultRegistryUrls = [\n TerraformModuleDatasource.terraformRegistryUrl,\n ];\n\n constructor() {\n super(TerraformModuleDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformModuleDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'For `registry.terraform.io` and `registry.opentofu.org` (via `api.opentofu.org`), release timestamps are available for all versions. For `app.terraform.io`, only the latest version is annotated, using the `published_at` field from the extended module endpoint.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'For `registry.terraform.io` and `app.terraform.io`, the source URL is taken from the `source` field of the registry response. For `registry.opentofu.org`, it is derived from the package name following the OpenTofu registry policy of `github.com/NAMESPACE/terraform-TARGETSYSTEM-NAME`.';\n\n /**\n * Resolves a module release list for the configured registry.\n *\n * Requests against the public Terraform registry and Terraform Cloud use the\n * registry-specific module endpoint, while other registries use the generic\n * Module Registry Protocol versions endpoint.\n */\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const { registry, repository } = getRegistryRepository(\n packageName,\n registryUrl,\n );\n logger.trace(\n { registryUrlNormalized: registry, terraformRepository: repository },\n 'terraform-module.getReleases()',\n );\n\n try {\n if (registry === TerraformModuleDatasource.terraformRegistryUrl) {\n return await this.queryTerraformRegistryV2(registry, repository);\n }\n if (\n registry === TerraformModuleDatasource.openTofuRegistryUrl ||\n registry === TerraformModuleDatasource.openTofuApiUrl\n ) {\n return await this.queryOpenTofuRegistry(repository);\n }\n if (registry === TerraformModuleDatasource.terraformCloudUrl) {\n return await this.queryTerraformRegistry(registry, repository);\n }\n\n // Use the standard Module Registry Protocol for other conformant registries.\n return await this.queryModuleRegistry(registry, repository);\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${TerraformModuleDatasource.id}`,\n key: TerraformModuleDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Query the Terraform Registry using the undocumented v2 JSON:API.\n *\n * Returns release timestamps for all versions, unlike the v1 extended\n * module endpoint which only exposed the timestamp for the latest version.\n */\n private async queryTerraformRegistryV2(\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult> {\n const moduleUrl = `${joinUrlParts(\n registryUrl,\n 'v2/modules',\n repository,\n )}?${getQueryString({ include: 'module-versions' })}`;\n const { body: res } = await this.http.getJson(\n moduleUrl,\n TerraformModuleV2Response,\n );\n res.homepage = `${registryUrl}/modules/${repository}`;\n return res;\n }\n\n /**\n * Query the OpenTofu registry docs API.\n * https://api.opentofu.org/\n *\n * Used when the registry URL is `registry.opentofu.org`.\n * Queries `api.opentofu.org` for module versions with release timestamps.\n */\n private async queryOpenTofuRegistry(\n repository: string,\n ): Promise<ReleaseResult> {\n const docsUrl = joinUrlParts(\n TerraformModuleDatasource.openTofuApiUrl,\n 'registry/docs/modules',\n repository,\n 'index.json',\n );\n const { body: res } = await this.http.getJson(\n docsUrl,\n OpenTofuModuleDocsResponse,\n );\n res.homepage = `https://search.opentofu.org/module/${repository}`;\n\n // The OpenTofu registry only indexes modules hosted on GitHub under the\n // `NAMESPACE/terraform-TARGETSYSTEM-NAME` repository naming convention, so\n // the source URL can be derived deterministically from the package name.\n // https://github.com/opentofu/registry/blob/main/PROCEDURES.md\n const [namespace, name, target] = repository.split('/');\n res.sourceUrl = `https://github.com/${namespace}/terraform-${target}-${name}`;\n\n return res;\n }\n\n /**\n * Queries the Terraform Registry module endpoint.\n *\n * The response includes the latest published version separately, so only that\n * release can be annotated with `releaseTimestamp`.\n *\n * https://developer.hashicorp.com/terraform/registry/api-docs#get-a-specific-module\n */\n private async queryTerraformRegistry(\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult> {\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const pkgUrl = createSDBackendURL(\n registryUrl,\n 'modules.v1',\n serviceDiscovery,\n repository,\n );\n const { body: res } = await this.http.getJson(\n pkgUrl,\n TerraformModuleResponse,\n );\n return {\n releases: res.versions,\n sourceUrl: res.source,\n homepage: `${registryUrl}/modules/${repository}`,\n };\n }\n\n /**\n * Queries a registry through the Terraform Module Registry Protocol.\n *\n * This is the default path for registries implementing the standard module\n * registry protocol. It returns release versions and, when present and valid,\n * the upstream source URL.\n *\n * https://developer.hashicorp.com/terraform/internals/module-registry-protocol\n */\n private async queryModuleRegistry(\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult | null> {\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const pkgUrl = createSDBackendURL(\n registryUrl,\n 'modules.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const { body: res } = await this.http.getJson(\n pkgUrl,\n ProtocolModuleResponse,\n );\n return {\n releases: res.versions,\n sourceUrl: isHttpUrl(res.source) ? res.source : undefined,\n };\n }\n\n private static getCacheKey({\n packageName,\n registryUrl,\n }: GetReleasesConfig): string {\n const { registry, repository } = getRegistryRepository(\n packageName,\n registryUrl,\n );\n return `${registry}/${repository}`;\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,4BAAb,MAAa,kCAAkC,oBAAoB;CACjE,OAAyB,KAAK;CAE9B,OAAgB,oBAAoB;CAEpC,OAAgB,sBAAsB,CACpC,0BAA0B,oBAC5B;CAEA,cAAc;EACZ,MAAM,0BAA0B,EAAE;CACpC;CAEA,sBACE,0BAA0B;CAE5B,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;;;;;;;;CASF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,EAAE,UAAU,eAAe,sBAC/B,aACA,WACF;EACA,OAAO,MACL;GAAE,uBAAuB;GAAU,qBAAqB;EAAW,GACnE,gCACF;EAEA,IAAI;GACF,IAAI,aAAa,0BAA0B,sBACzC,OAAO,MAAM,KAAK,yBAAyB,UAAU,UAAU;GAEjE,IACE,aAAa,0BAA0B,uBACvC,aAAa,0BAA0B,gBAEvC,OAAO,MAAM,KAAK,sBAAsB,UAAU;GAEpD,IAAI,aAAa,0BAA0B,mBACzC,OAAO,MAAM,KAAK,uBAAuB,UAAU,UAAU;GAI/D,OAAO,MAAM,KAAK,oBAAoB,UAAU,UAAU;EAC5D,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,0BAA0B;GACnD,KAAK,0BAA0B,YAAY,MAAM;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;;;;;;;CAQA,MAAc,yBACZ,aACA,YACwB;EACxB,MAAM,YAAY,GAAG,aACnB,aACA,cACA,UACF,EAAE,GAAG,eAAe,EAAE,SAAS,kBAAkB,CAAC;EAClD,MAAM,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,QACpC,WACA,yBACF;EACA,IAAI,WAAW,GAAG,YAAY,WAAW;EACzC,OAAO;CACT;;;;;;;;CASA,MAAc,sBACZ,YACwB;EACxB,MAAM,UAAU,aACd,0BAA0B,gBAC1B,yBACA,YACA,YACF;EACA,MAAM,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,QACpC,SACA,0BACF;EACA,IAAI,WAAW,sCAAsC;EAMrD,MAAM,CAAC,WAAW,MAAM,UAAU,WAAW,MAAM,GAAG;EACtD,IAAI,YAAY,sBAAsB,UAAU,aAAa,OAAO,GAAG;EAEvE,OAAO;CACT;;;;;;;;;CAUA,MAAc,uBACZ,aACA,YACwB;EACxB,MAAM,mBACJ,MAAM,KAAK,mCAAmC,WAAW;EAC3D,MAAM,SAAS,mBACb,aACA,cACA,kBACA,UACF;EACA,MAAM,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,QACpC,QACA,uBACF;EACA,OAAO;GACL,UAAU,IAAI;GACd,WAAW,IAAI;GACf,UAAU,GAAG,YAAY,WAAW;EACtC;CACF;;;;;;;;;;CAWA,MAAc,oBACZ,aACA,YAC+B;EAC/B,MAAM,mBACJ,MAAM,KAAK,mCAAmC,WAAW;EAC3D,MAAM,SAAS,mBACb,aACA,cACA,kBACA,GAAG,WAAW,UAChB;EACA,MAAM,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,QACpC,QACA,sBACF;EACA,OAAO;GACL,UAAU,IAAI;GACd,WAAW,UAAU,IAAI,MAAM,IAAI,IAAI,SAAS,KAAA;EAClD;CACF;CAEA,OAAe,YAAY,EACzB,aACA,eAC4B;EAC5B,MAAM,EAAE,UAAU,eAAe,sBAC/B,aACA,WACF;EACA,OAAO,GAAG,SAAS,GAAG;CACxB;AACF"}
|
|
@@ -3,7 +3,8 @@ import { coerceString } from "../../../util/string.js";
|
|
|
3
3
|
import { isHttpUrl, joinUrlParts } from "../../../util/url.js";
|
|
4
4
|
//#region lib/modules/datasource/terraform-module/utils.ts
|
|
5
5
|
function createSDBackendURL(registryURL, sdType, sdResult, subPath) {
|
|
6
|
-
const
|
|
6
|
+
const sdEndpoint = sdResult[sdType] ?? "";
|
|
7
|
+
const fullPath = joinUrlParts(sdEndpoint, subPath);
|
|
7
8
|
if (isHttpUrl(fullPath)) return fullPath;
|
|
8
9
|
return joinUrlParts(registryURL, fullPath);
|
|
9
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-module/utils.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport { isHttpUrl, joinUrlParts } from '../../../util/url.ts';\nimport type {\n ServiceDiscoveryEndpointType,\n ServiceDiscoveryResponse,\n} from './schema.ts';\nimport type { RegistryRepository } from './types.ts';\n\nexport function createSDBackendURL(\n registryURL: string,\n sdType: ServiceDiscoveryEndpointType,\n sdResult: ServiceDiscoveryResponse,\n subPath: string,\n): string {\n const sdEndpoint = sdResult[sdType] ?? '';\n const fullPath = joinUrlParts(sdEndpoint, subPath);\n if (isHttpUrl(fullPath)) {\n return fullPath;\n }\n return joinUrlParts(registryURL, fullPath);\n}\n\nexport function getRegistryRepository(\n packageName: string,\n registryUrl: string | undefined,\n): RegistryRepository {\n let registry: string;\n const split = packageName.split('/');\n if (split.length > 3 && split[0].includes('.')) {\n registry = split.shift()!;\n } else {\n registry = coerceString(registryUrl);\n }\n if (!regEx(/^https?:\\/\\//).test(registry)) {\n registry = `https://${registry}`;\n }\n const repository = split.join('/');\n return {\n registry,\n repository,\n };\n}\n"],"mappings":";;;;AASA,SAAgB,mBACd,aACA,QACA,UACA,SACQ;
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-module/utils.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport { isHttpUrl, joinUrlParts } from '../../../util/url.ts';\nimport type {\n ServiceDiscoveryEndpointType,\n ServiceDiscoveryResponse,\n} from './schema.ts';\nimport type { RegistryRepository } from './types.ts';\n\nexport function createSDBackendURL(\n registryURL: string,\n sdType: ServiceDiscoveryEndpointType,\n sdResult: ServiceDiscoveryResponse,\n subPath: string,\n): string {\n const sdEndpoint = sdResult[sdType] ?? '';\n const fullPath = joinUrlParts(sdEndpoint, subPath);\n if (isHttpUrl(fullPath)) {\n return fullPath;\n }\n return joinUrlParts(registryURL, fullPath);\n}\n\nexport function getRegistryRepository(\n packageName: string,\n registryUrl: string | undefined,\n): RegistryRepository {\n let registry: string;\n const split = packageName.split('/');\n if (split.length > 3 && split[0].includes('.')) {\n registry = split.shift()!;\n } else {\n registry = coerceString(registryUrl);\n }\n if (!regEx(/^https?:\\/\\//).test(registry)) {\n registry = `https://${registry}`;\n }\n const repository = split.join('/');\n return {\n registry,\n repository,\n };\n}\n"],"mappings":";;;;AASA,SAAgB,mBACd,aACA,QACA,UACA,SACQ;CACR,MAAM,aAAa,SAAS,WAAW;CACvC,MAAM,WAAW,aAAa,YAAY,OAAO;CACjD,IAAI,UAAU,QAAQ,GACpB,OAAO;CAET,OAAO,aAAa,aAAa,QAAQ;AAC3C;AAEA,SAAgB,sBACd,aACA,aACoB;CACpB,IAAI;CACJ,MAAM,QAAQ,YAAY,MAAM,GAAG;CACnC,IAAI,MAAM,SAAS,KAAK,MAAM,EAAE,CAAC,SAAS,GAAG,GAC3C,WAAW,MAAM,MAAM;MAEvB,WAAW,aAAa,WAAW;CAErC,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,KAAK,QAAQ,GACtC,WAAW,WAAW;CAExB,MAAM,aAAa,MAAM,KAAK,GAAG;CACjC,OAAO;EACL;EACA;CACF;AACF"}
|
|
@@ -81,7 +81,8 @@ var TerraformProviderDatasource = class TerraformProviderDatasource extends Terr
|
|
|
81
81
|
*/
|
|
82
82
|
async queryProviderRegistry(registryUrl, packageName) {
|
|
83
83
|
const repository = TerraformProviderDatasource.getRepository({ packageName });
|
|
84
|
-
const
|
|
84
|
+
const serviceDiscovery = await this.getTerraformServiceDiscoveryResult(registryUrl);
|
|
85
|
+
const backendURL = createSDBackendURL(registryUrl, "providers.v1", serviceDiscovery, `${repository}/versions`);
|
|
85
86
|
return { releases: (await this.http.getJson(backendURL, TerraformProviderVersions)).body.versions.map(({ version }) => ({ version })) };
|
|
86
87
|
}
|
|
87
88
|
async queryReleaseBackend(packageName, registryURL) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["hashicorpVersioning.id","p.map"],"sources":["../../../../lib/modules/datasource/terraform-provider/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { getQueryString, joinUrlParts } from '../../../util/url.ts';\nimport * as hashicorpVersioning from '../../versioning/hashicorp/index.ts';\nimport { TerraformDatasource } from '../terraform-module/base.ts';\nimport { createSDBackendURL } from '../terraform-module/utils.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n OpenTofuProviderDocsResponse,\n type TerraformBuild,\n TerraformProviderReleaseBackend,\n TerraformProviderV2Response,\n TerraformProviderVersions,\n TerraformRegistryBuildResponse,\n TerraformRegistryVersions,\n VersionDetailResponse,\n} from './schema.ts';\n\nexport class TerraformProviderDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-provider';\n\n static readonly hashicorpReleaseUrl = 'https://releases.hashicorp.com';\n\n static readonly defaultRegistryUrls = [\n TerraformProviderDatasource.terraformRegistryUrl,\n TerraformProviderDatasource.hashicorpReleaseUrl,\n ];\n\n static repositoryRegex = regEx(/^hashicorp\\/(?<packageName>\\S+)$/);\n\n constructor() {\n super(TerraformProviderDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformProviderDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is only available for `registry.terraform.io` (v2 API) and `registry.opentofu.org` (via `api.opentofu.org`). Other registries using the Provider Registry Protocol do not provide timestamps.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'For `registry.terraform.io`, the source URL is taken from the `source` field of the v2 API response. For `registry.opentofu.org`, it is derived from the package name following the OpenTofu registry policy of `github.com/NAMESPACE/terraform-provider-NAME`.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n logger.trace(\n `terraform-provider.getDependencies() packageName: ${packageName}`,\n );\n\n if (registryUrl === TerraformProviderDatasource.terraformRegistryUrl) {\n return await this.queryTerraformRegistryV2(registryUrl, packageName);\n }\n if (\n registryUrl === TerraformProviderDatasource.openTofuRegistryUrl ||\n registryUrl === TerraformProviderDatasource.openTofuApiUrl\n ) {\n return await this.queryOpenTofuRegistry(packageName);\n }\n if (registryUrl === TerraformProviderDatasource.hashicorpReleaseUrl) {\n return await this.queryReleaseBackend(packageName, registryUrl);\n }\n\n // Fall back to the standard Provider Registry Protocol for other registries.\n return await this.queryProviderRegistry(registryUrl, packageName);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = config.registryUrl;\n const repo = TerraformProviderDatasource.getRepository(config);\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleases:${url}/${repo}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private static getRepository({ packageName }: GetReleasesConfig): string {\n return packageName.includes('/') ? packageName : `hashicorp/${packageName}`;\n }\n\n /**\n * Query the Terraform Registry using the undocumented v2 JSON:API.\n *\n * Returns release timestamps for all versions, unlike the v1 API\n * which only exposed the timestamp for the latest version.\n */\n private async queryTerraformRegistryV2(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const providerUrl = `${joinUrlParts(\n registryUrl,\n 'v2/providers',\n repository,\n )}?${getQueryString({ include: 'provider-versions' })}`;\n const { body: res } = await this.http.getJson(\n providerUrl,\n TerraformProviderV2Response,\n );\n res.homepage = `${registryUrl}/providers/${repository}`;\n return res;\n }\n\n /**\n * Query the OpenTofu registry docs API.\n * https://api.opentofu.org/\n *\n * Used when the registry URL is `registry.opentofu.org`.\n * Queries `api.opentofu.org` for provider versions with release timestamps.\n */\n private async queryOpenTofuRegistry(\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const docsUrl = joinUrlParts(\n TerraformProviderDatasource.openTofuApiUrl,\n 'registry/docs/providers',\n repository,\n 'index.json',\n );\n const { body: res } = await this.http.getJson(\n docsUrl,\n OpenTofuProviderDocsResponse,\n );\n res.homepage = `https://search.opentofu.org/provider/${repository}`;\n\n // The OpenTofu registry only indexes providers hosted on GitHub under the\n // `NAMESPACE/terraform-provider-NAME` repository naming convention, so the\n // source URL can be derived deterministically from the package name.\n // https://github.com/opentofu/registry/blob/main/PROCEDURES.md\n const [namespace, name] = repository.split('/');\n res.sourceUrl = `https://github.com/${namespace}/terraform-provider-${name}`;\n\n return res;\n }\n\n /**\n * Query a registry using the Provider Registry Protocol that all registries\n * are required to implement.\n * https://www.terraform.io/internals/provider-registry-protocol\n */\n private async queryProviderRegistry(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const res = (await this.http.getJson(backendURL, TerraformProviderVersions))\n .body;\n const dep: ReleaseResult = {\n releases: res.versions.map(({ version }) => ({\n version,\n })),\n };\n return dep;\n }\n\n private async queryReleaseBackend(\n packageName: string,\n registryURL: string,\n ): Promise<ReleaseResult | null> {\n const hashicorpPackage = packageName.replace('hashicorp/', '');\n const backendLookUpName = `terraform-provider-${hashicorpPackage}`;\n const backendURL = joinUrlParts(\n registryURL,\n backendLookUpName,\n `index.json`,\n );\n const res = (\n await this.http.getJson(backendURL, TerraformProviderReleaseBackend)\n ).body;\n\n const dep: ReleaseResult = {\n releases: Object.keys(res.versions).map((version) => ({\n version,\n })),\n sourceUrl: joinUrlParts(\n 'https://github.com/terraform-providers',\n backendLookUpName,\n ),\n };\n return dep;\n }\n\n private async _getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n if (registryURL === TerraformProviderDatasource.hashicorpReleaseUrl) {\n // check if registryURL === secondary backend\n const repositoryRegexResult =\n TerraformProviderDatasource.repositoryRegex.exec(repository)?.groups;\n if (!repositoryRegexResult) {\n // non hashicorp builds are not supported with releases.hashicorp.com\n return null;\n }\n const packageName = repositoryRegexResult.packageName;\n const backendLookUpName = `terraform-provider-${packageName}`;\n let versionReleaseBackend: VersionDetailResponse;\n try {\n versionReleaseBackend = await this.getReleaseBackendIndex(\n backendLookUpName,\n version,\n );\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, backendLookUpName, version },\n `Failed to retrieve builds for ${backendLookUpName} ${version}`,\n );\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n return versionReleaseBackend.builds;\n }\n\n // check public or private Terraform registry\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryURL);\n if (!serviceDiscovery) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Service discovery not found for ${registryURL}`),\n );\n }\n const backendURL = createSDBackendURL(\n registryURL,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const versionsResponse = (\n await this.http.getJson(\n `${backendURL}/versions`,\n TerraformRegistryVersions,\n )\n ).body;\n if (!versionsResponse.versions) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Failed to retrieve version list for ${backendURL}`),\n );\n }\n const builds = versionsResponse.versions.find(\n (value) => value.version === version,\n );\n if (!builds) {\n // should never happen, but just in case\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(\n `No builds found for ${repository}:${version} on ${registryURL}`,\n ),\n );\n }\n const result = await p.map(\n builds.platforms,\n async (platform) => {\n const buildURL = `${backendURL}/${version}/download/${platform.os}/${platform.arch}`;\n try {\n const res = (\n await this.http.getJson(buildURL, TerraformRegistryBuildResponse)\n ).body;\n const newBuild: TerraformBuild = {\n name: repository,\n url: res.download_url,\n version,\n ...res,\n };\n return newBuild;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug({ err, url: buildURL }, 'Failed to retrieve build');\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n },\n { concurrency: 4 },\n );\n\n return result;\n }\n\n getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getBuilds:${registryURL}/${repository}/${version}`,\n },\n () => this._getBuilds(registryURL, repository, version),\n );\n }\n\n private async _getZipHashes(\n zipHashUrl: string,\n ): Promise<string[] | undefined> {\n // The hashes are formatted as the result of sha256sum in plain text, each line: <hash>\\t<filename>\n let rawHashData: string;\n try {\n rawHashData = (await this.http.getText(zipHashUrl)).body;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, zipHashUrl },\n `Failed to retrieve zip hashes from ${zipHashUrl}`,\n );\n return undefined;\n }\n\n return rawHashData\n .trimEnd()\n .split('\\n')\n .map((line) => line.split(/\\s/)[0]);\n }\n\n getZipHashes(zipHashUrl: string): Promise<string[] | undefined> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getZipHashes:${zipHashUrl}`,\n },\n () => this._getZipHashes(zipHashUrl),\n );\n }\n\n private async _getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return (\n await this.http.getJson(\n `${TerraformProviderDatasource.hashicorpReleaseUrl}/${backendLookUpName}/${version}/index.json`,\n VersionDetailResponse,\n )\n ).body;\n }\n\n getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleaseBackendIndex:${backendLookUpName}/${version}`,\n },\n () => this._getReleaseBackendIndex(backendLookUpName, version),\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["hashicorpVersioning.id","p.map"],"sources":["../../../../lib/modules/datasource/terraform-provider/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { getQueryString, joinUrlParts } from '../../../util/url.ts';\nimport * as hashicorpVersioning from '../../versioning/hashicorp/index.ts';\nimport { TerraformDatasource } from '../terraform-module/base.ts';\nimport { createSDBackendURL } from '../terraform-module/utils.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n OpenTofuProviderDocsResponse,\n type TerraformBuild,\n TerraformProviderReleaseBackend,\n TerraformProviderV2Response,\n TerraformProviderVersions,\n TerraformRegistryBuildResponse,\n TerraformRegistryVersions,\n VersionDetailResponse,\n} from './schema.ts';\n\nexport class TerraformProviderDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-provider';\n\n static readonly hashicorpReleaseUrl = 'https://releases.hashicorp.com';\n\n static readonly defaultRegistryUrls = [\n TerraformProviderDatasource.terraformRegistryUrl,\n TerraformProviderDatasource.hashicorpReleaseUrl,\n ];\n\n static repositoryRegex = regEx(/^hashicorp\\/(?<packageName>\\S+)$/);\n\n constructor() {\n super(TerraformProviderDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformProviderDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is only available for `registry.terraform.io` (v2 API) and `registry.opentofu.org` (via `api.opentofu.org`). Other registries using the Provider Registry Protocol do not provide timestamps.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'For `registry.terraform.io`, the source URL is taken from the `source` field of the v2 API response. For `registry.opentofu.org`, it is derived from the package name following the OpenTofu registry policy of `github.com/NAMESPACE/terraform-provider-NAME`.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n logger.trace(\n `terraform-provider.getDependencies() packageName: ${packageName}`,\n );\n\n if (registryUrl === TerraformProviderDatasource.terraformRegistryUrl) {\n return await this.queryTerraformRegistryV2(registryUrl, packageName);\n }\n if (\n registryUrl === TerraformProviderDatasource.openTofuRegistryUrl ||\n registryUrl === TerraformProviderDatasource.openTofuApiUrl\n ) {\n return await this.queryOpenTofuRegistry(packageName);\n }\n if (registryUrl === TerraformProviderDatasource.hashicorpReleaseUrl) {\n return await this.queryReleaseBackend(packageName, registryUrl);\n }\n\n // Fall back to the standard Provider Registry Protocol for other registries.\n return await this.queryProviderRegistry(registryUrl, packageName);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = config.registryUrl;\n const repo = TerraformProviderDatasource.getRepository(config);\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleases:${url}/${repo}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private static getRepository({ packageName }: GetReleasesConfig): string {\n return packageName.includes('/') ? packageName : `hashicorp/${packageName}`;\n }\n\n /**\n * Query the Terraform Registry using the undocumented v2 JSON:API.\n *\n * Returns release timestamps for all versions, unlike the v1 API\n * which only exposed the timestamp for the latest version.\n */\n private async queryTerraformRegistryV2(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const providerUrl = `${joinUrlParts(\n registryUrl,\n 'v2/providers',\n repository,\n )}?${getQueryString({ include: 'provider-versions' })}`;\n const { body: res } = await this.http.getJson(\n providerUrl,\n TerraformProviderV2Response,\n );\n res.homepage = `${registryUrl}/providers/${repository}`;\n return res;\n }\n\n /**\n * Query the OpenTofu registry docs API.\n * https://api.opentofu.org/\n *\n * Used when the registry URL is `registry.opentofu.org`.\n * Queries `api.opentofu.org` for provider versions with release timestamps.\n */\n private async queryOpenTofuRegistry(\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const docsUrl = joinUrlParts(\n TerraformProviderDatasource.openTofuApiUrl,\n 'registry/docs/providers',\n repository,\n 'index.json',\n );\n const { body: res } = await this.http.getJson(\n docsUrl,\n OpenTofuProviderDocsResponse,\n );\n res.homepage = `https://search.opentofu.org/provider/${repository}`;\n\n // The OpenTofu registry only indexes providers hosted on GitHub under the\n // `NAMESPACE/terraform-provider-NAME` repository naming convention, so the\n // source URL can be derived deterministically from the package name.\n // https://github.com/opentofu/registry/blob/main/PROCEDURES.md\n const [namespace, name] = repository.split('/');\n res.sourceUrl = `https://github.com/${namespace}/terraform-provider-${name}`;\n\n return res;\n }\n\n /**\n * Query a registry using the Provider Registry Protocol that all registries\n * are required to implement.\n * https://www.terraform.io/internals/provider-registry-protocol\n */\n private async queryProviderRegistry(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const res = (await this.http.getJson(backendURL, TerraformProviderVersions))\n .body;\n const dep: ReleaseResult = {\n releases: res.versions.map(({ version }) => ({\n version,\n })),\n };\n return dep;\n }\n\n private async queryReleaseBackend(\n packageName: string,\n registryURL: string,\n ): Promise<ReleaseResult | null> {\n const hashicorpPackage = packageName.replace('hashicorp/', '');\n const backendLookUpName = `terraform-provider-${hashicorpPackage}`;\n const backendURL = joinUrlParts(\n registryURL,\n backendLookUpName,\n `index.json`,\n );\n const res = (\n await this.http.getJson(backendURL, TerraformProviderReleaseBackend)\n ).body;\n\n const dep: ReleaseResult = {\n releases: Object.keys(res.versions).map((version) => ({\n version,\n })),\n sourceUrl: joinUrlParts(\n 'https://github.com/terraform-providers',\n backendLookUpName,\n ),\n };\n return dep;\n }\n\n private async _getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n if (registryURL === TerraformProviderDatasource.hashicorpReleaseUrl) {\n // check if registryURL === secondary backend\n const repositoryRegexResult =\n TerraformProviderDatasource.repositoryRegex.exec(repository)?.groups;\n if (!repositoryRegexResult) {\n // non hashicorp builds are not supported with releases.hashicorp.com\n return null;\n }\n const packageName = repositoryRegexResult.packageName;\n const backendLookUpName = `terraform-provider-${packageName}`;\n let versionReleaseBackend: VersionDetailResponse;\n try {\n versionReleaseBackend = await this.getReleaseBackendIndex(\n backendLookUpName,\n version,\n );\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, backendLookUpName, version },\n `Failed to retrieve builds for ${backendLookUpName} ${version}`,\n );\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n return versionReleaseBackend.builds;\n }\n\n // check public or private Terraform registry\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryURL);\n if (!serviceDiscovery) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Service discovery not found for ${registryURL}`),\n );\n }\n const backendURL = createSDBackendURL(\n registryURL,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const versionsResponse = (\n await this.http.getJson(\n `${backendURL}/versions`,\n TerraformRegistryVersions,\n )\n ).body;\n if (!versionsResponse.versions) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Failed to retrieve version list for ${backendURL}`),\n );\n }\n const builds = versionsResponse.versions.find(\n (value) => value.version === version,\n );\n if (!builds) {\n // should never happen, but just in case\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(\n `No builds found for ${repository}:${version} on ${registryURL}`,\n ),\n );\n }\n const result = await p.map(\n builds.platforms,\n async (platform) => {\n const buildURL = `${backendURL}/${version}/download/${platform.os}/${platform.arch}`;\n try {\n const res = (\n await this.http.getJson(buildURL, TerraformRegistryBuildResponse)\n ).body;\n const newBuild: TerraformBuild = {\n name: repository,\n url: res.download_url,\n version,\n ...res,\n };\n return newBuild;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug({ err, url: buildURL }, 'Failed to retrieve build');\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n },\n { concurrency: 4 },\n );\n\n return result;\n }\n\n getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getBuilds:${registryURL}/${repository}/${version}`,\n },\n () => this._getBuilds(registryURL, repository, version),\n );\n }\n\n private async _getZipHashes(\n zipHashUrl: string,\n ): Promise<string[] | undefined> {\n // The hashes are formatted as the result of sha256sum in plain text, each line: <hash>\\t<filename>\n let rawHashData: string;\n try {\n rawHashData = (await this.http.getText(zipHashUrl)).body;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, zipHashUrl },\n `Failed to retrieve zip hashes from ${zipHashUrl}`,\n );\n return undefined;\n }\n\n return rawHashData\n .trimEnd()\n .split('\\n')\n .map((line) => line.split(/\\s/)[0]);\n }\n\n getZipHashes(zipHashUrl: string): Promise<string[] | undefined> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getZipHashes:${zipHashUrl}`,\n },\n () => this._getZipHashes(zipHashUrl),\n );\n }\n\n private async _getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return (\n await this.http.getJson(\n `${TerraformProviderDatasource.hashicorpReleaseUrl}/${backendLookUpName}/${version}/index.json`,\n VersionDetailResponse,\n )\n ).body;\n }\n\n getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleaseBackendIndex:${backendLookUpName}/${version}`,\n },\n () => this._getReleaseBackendIndex(backendLookUpName, version),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { LooseArray } from "../../../util/schema-utils/index.js";
|
|
2
2
|
import { asTimestamp } from "../../../util/timestamp.js";
|
|
3
3
|
import { z } from "zod/v4";
|
|
4
|
-
|
|
4
|
+
//#region lib/modules/datasource/typst/schema.ts
|
|
5
|
+
const ReleaseItem = z.object({
|
|
5
6
|
name: z.string().min(1),
|
|
6
7
|
version: z.string().min(1),
|
|
7
8
|
repository: z.string().url(),
|
|
@@ -13,7 +14,8 @@ const Registry = LooseArray(z.object({
|
|
|
13
14
|
sourceUrl,
|
|
14
15
|
releaseTimestamp: asTimestamp(updatedAt)
|
|
15
16
|
};
|
|
16
|
-
})
|
|
17
|
+
});
|
|
18
|
+
const Registry = LooseArray(ReleaseItem).transform((items) => {
|
|
17
19
|
const result = {};
|
|
18
20
|
for (const item of items) {
|
|
19
21
|
const { packageName, sourceUrl, ...release } = item;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/typst/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport type { ReleaseResult } from '../types.ts';\n\nconst ReleaseItem = z\n .object({\n name: z.string().min(1),\n version: z.string().min(1),\n repository: z.string().url(),\n updatedAt: z.number(),\n })\n .transform(\n ({ name: packageName, version, repository: sourceUrl, updatedAt }) => {\n const releaseTimestamp = asTimestamp(updatedAt);\n return { packageName, version, sourceUrl, releaseTimestamp };\n },\n );\n\nexport const Registry = LooseArray(ReleaseItem).transform((items) => {\n const result: Record<string, ReleaseResult> = {};\n for (const item of items) {\n const { packageName, sourceUrl, ...release } = item;\n result[packageName] ??= { releases: [] };\n result[packageName].releases.push(release);\n result[packageName].sourceUrl = sourceUrl;\n }\n return result;\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/typst/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport type { ReleaseResult } from '../types.ts';\n\nconst ReleaseItem = z\n .object({\n name: z.string().min(1),\n version: z.string().min(1),\n repository: z.string().url(),\n updatedAt: z.number(),\n })\n .transform(\n ({ name: packageName, version, repository: sourceUrl, updatedAt }) => {\n const releaseTimestamp = asTimestamp(updatedAt);\n return { packageName, version, sourceUrl, releaseTimestamp };\n },\n );\n\nexport const Registry = LooseArray(ReleaseItem).transform((items) => {\n const result: Record<string, ReleaseResult> = {};\n for (const item of items) {\n const { packageName, sourceUrl, ...release } = item;\n result[packageName] ??= { releases: [] };\n result[packageName].releases.push(release);\n result[packageName].sourceUrl = sourceUrl;\n }\n return result;\n});\n"],"mappings":";;;;AAKA,MAAM,cAAc,EACjB,OAAO;CACN,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACzB,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI;CAC3B,WAAW,EAAE,OAAO;AACtB,CAAC,CAAC,CACD,WACE,EAAE,MAAM,aAAa,SAAS,YAAY,WAAW,gBAAgB;CAEpE,OAAO;EAAE;EAAa;EAAS;EAAW,kBADjB,YAAY,SACoB;CAAE;AAC7D,CACF;AAEF,MAAa,WAAW,WAAW,WAAW,CAAC,CAAC,WAAW,UAAU;CACnE,MAAM,SAAwC,CAAC;CAC/C,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,EAAE,aAAa,WAAW,GAAG,YAAY;EAC/C,OAAO,iBAAiB,EAAE,UAAU,CAAC,EAAE;EACvC,OAAO,YAAY,CAAC,SAAS,KAAK,OAAO;EACzC,OAAO,YAAY,CAAC,YAAY;CAClC;CACA,OAAO;AACT,CAAC"}
|
|
@@ -19,7 +19,7 @@ function interpretLine(lineMatch, dependency) {
|
|
|
19
19
|
case "source":
|
|
20
20
|
localDependency.managerData.source = value;
|
|
21
21
|
if (value?.startsWith("git@") || value?.endsWith(".git")) localDependency.packageName = value;
|
|
22
|
-
else localDependency.registryUrls = value ? [value] :
|
|
22
|
+
else localDependency.registryUrls = value ? [value] : /* istanbul ignore next: should have test */ [];
|
|
23
23
|
break;
|
|
24
24
|
case "type":
|
|
25
25
|
localDependency.managerData.type = value;
|
|
@@ -43,7 +43,7 @@ function handleGitDep(dep, nameMatch) {
|
|
|
43
43
|
function handleGalaxyDep(dep) {
|
|
44
44
|
dep.datasource = GalaxyCollectionDatasource.id;
|
|
45
45
|
dep.depName = dep.managerData.name;
|
|
46
|
-
dep.registryUrls = dep.managerData.source ? [dep.managerData.source] : [];
|
|
46
|
+
dep.registryUrls = dep.managerData.source ? /* istanbul ignore next: should have test */ [dep.managerData.source] : [];
|
|
47
47
|
dep.currentValue = dep.managerData.version;
|
|
48
48
|
}
|
|
49
49
|
function finalize(dependency) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","names":[],"sources":["../../../../lib/modules/manager/ansible-galaxy/collections.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GalaxyCollectionDatasource } from '../../datasource/galaxy-collection/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { AnsibleGalaxyPackageDependency } from './types.ts';\nimport {\n blockLineRegEx,\n galaxyDepRegex,\n nameMatchRegex,\n newBlockRegEx,\n} from './util.ts';\n\nfunction interpretLine(\n lineMatch: RegExpMatchArray,\n dependency: AnsibleGalaxyPackageDependency,\n): void {\n const localDependency = dependency;\n const key = lineMatch[2];\n const value = lineMatch[3].replace(regEx(/[\"']/g), '');\n switch (key) {\n case 'name': {\n localDependency.managerData.name = value;\n break;\n }\n case 'version': {\n localDependency.managerData.version = value;\n localDependency.currentValue = value;\n break;\n }\n case 'source': {\n localDependency.managerData.source = value;\n if (value?.startsWith('git@') || value?.endsWith('.git')) {\n localDependency.packageName = value;\n } else {\n localDependency.registryUrls = value\n ? [value]\n : /* istanbul ignore next: should have test */ [];\n }\n break;\n }\n case 'type': {\n localDependency.managerData.type = value;\n break;\n }\n default: {\n // fail if we find an unexpected key\n localDependency.skipReason = 'unsupported';\n }\n }\n}\n\nfunction handleGitDep(\n dep: AnsibleGalaxyPackageDependency,\n nameMatch: RegExpExecArray | null,\n): void {\n dep.datasource = GitTagsDatasource.id;\n\n if (nameMatch?.groups) {\n // if a github.com repository is referenced use github-tags instead of git-tags\n if (nameMatch.groups.hostname === 'github.com') {\n dep.datasource = GithubTagsDatasource.id;\n } else {\n dep.datasource = GitTagsDatasource.id;\n }\n // source definition without version appendix\n const source = nameMatch.groups.source;\n const massagedDepName = nameMatch.groups.depName.replace(\n regEx(/.git$/),\n '',\n );\n dep.depName = `${nameMatch.groups.hostname}/${massagedDepName}`;\n // remove leading `git+` from URLs like `git+https://...`\n dep.packageName = source.replace(regEx(/git\\+/), '');\n\n // if version is declared using version appendix `<source url>,v1.2.0`, use it\n if (nameMatch.groups.version) {\n dep.currentValue = nameMatch.groups.version;\n } else {\n dep.currentValue = dep.managerData.version;\n }\n }\n}\n\nfunction handleGalaxyDep(dep: AnsibleGalaxyPackageDependency): void {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n dep.registryUrls = dep.managerData.source\n ? /* istanbul ignore next: should have test */ [dep.managerData.source]\n : [];\n dep.currentValue = dep.managerData.version;\n}\n\nfunction finalize(dependency: AnsibleGalaxyPackageDependency): boolean {\n const dep = dependency;\n dep.depName = dep.managerData.name;\n\n const name = dep.managerData.name;\n const nameMatch = nameMatchRegex.exec(name);\n\n // use type if defined\n switch (dependency.managerData.type) {\n case 'galaxy':\n handleGalaxyDep(dep);\n break;\n case 'git':\n handleGitDep(dep, nameMatch);\n break;\n case 'file':\n dep.skipReason = 'local-dependency';\n break;\n case null:\n // try to find out type based on source\n if (nameMatch) {\n handleGitDep(dep, nameMatch);\n break;\n }\n if (galaxyDepRegex.exec(dep.managerData.name)) {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n break;\n }\n dep.skipReason = 'no-source-match';\n break;\n default:\n dep.skipReason = 'unsupported';\n return true;\n }\n\n if (!dependency.currentValue && !dep.skipReason) {\n dep.skipReason = 'unspecified-version';\n }\n return true;\n}\n\nexport function extractCollections(lines: string[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {\n let lineMatch = newBlockRegEx.exec(lines[lineNumber]);\n if (lineMatch) {\n const dep: AnsibleGalaxyPackageDependency = {\n depType: 'galaxy-collection',\n managerData: {\n name: null,\n version: null,\n type: null,\n source: null,\n },\n };\n do {\n interpretLine(lineMatch, dep);\n const line = lines[lineNumber + 1];\n\n if (!line) {\n break;\n }\n lineMatch = blockLineRegEx.exec(line);\n if (lineMatch) {\n lineNumber += 1;\n }\n } while (lineMatch);\n if (finalize(dep)) {\n delete (dep as PackageDependency).managerData;\n deps.push(dep);\n }\n }\n }\n return deps;\n}\n"],"mappings":";;;;;;AAaA,SAAS,cACP,WACA,YACM;CACN,MAAM,kBAAkB;CACxB,MAAM,MAAM,UAAU;CACtB,MAAM,QAAQ,UAAU,EAAE,CAAC,QAAQ,MAAM,OAAO,GAAG,EAAE;CACrD,QAAQ,KAAR;EACE,KAAK;GACH,gBAAgB,YAAY,OAAO;GACnC;EAEF,KAAK;GACH,gBAAgB,YAAY,UAAU;GACtC,gBAAgB,eAAe;GAC/B;EAEF,KAAK;GACH,gBAAgB,YAAY,SAAS;GACrC,IAAI,OAAO,WAAW,MAAM,KAAK,OAAO,SAAS,MAAM,GACrD,gBAAgB,cAAc;QAE9B,gBAAgB,eAAe,QAC3B,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"collections.js","names":[],"sources":["../../../../lib/modules/manager/ansible-galaxy/collections.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GalaxyCollectionDatasource } from '../../datasource/galaxy-collection/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { AnsibleGalaxyPackageDependency } from './types.ts';\nimport {\n blockLineRegEx,\n galaxyDepRegex,\n nameMatchRegex,\n newBlockRegEx,\n} from './util.ts';\n\nfunction interpretLine(\n lineMatch: RegExpMatchArray,\n dependency: AnsibleGalaxyPackageDependency,\n): void {\n const localDependency = dependency;\n const key = lineMatch[2];\n const value = lineMatch[3].replace(regEx(/[\"']/g), '');\n switch (key) {\n case 'name': {\n localDependency.managerData.name = value;\n break;\n }\n case 'version': {\n localDependency.managerData.version = value;\n localDependency.currentValue = value;\n break;\n }\n case 'source': {\n localDependency.managerData.source = value;\n if (value?.startsWith('git@') || value?.endsWith('.git')) {\n localDependency.packageName = value;\n } else {\n localDependency.registryUrls = value\n ? [value]\n : /* istanbul ignore next: should have test */ [];\n }\n break;\n }\n case 'type': {\n localDependency.managerData.type = value;\n break;\n }\n default: {\n // fail if we find an unexpected key\n localDependency.skipReason = 'unsupported';\n }\n }\n}\n\nfunction handleGitDep(\n dep: AnsibleGalaxyPackageDependency,\n nameMatch: RegExpExecArray | null,\n): void {\n dep.datasource = GitTagsDatasource.id;\n\n if (nameMatch?.groups) {\n // if a github.com repository is referenced use github-tags instead of git-tags\n if (nameMatch.groups.hostname === 'github.com') {\n dep.datasource = GithubTagsDatasource.id;\n } else {\n dep.datasource = GitTagsDatasource.id;\n }\n // source definition without version appendix\n const source = nameMatch.groups.source;\n const massagedDepName = nameMatch.groups.depName.replace(\n regEx(/.git$/),\n '',\n );\n dep.depName = `${nameMatch.groups.hostname}/${massagedDepName}`;\n // remove leading `git+` from URLs like `git+https://...`\n dep.packageName = source.replace(regEx(/git\\+/), '');\n\n // if version is declared using version appendix `<source url>,v1.2.0`, use it\n if (nameMatch.groups.version) {\n dep.currentValue = nameMatch.groups.version;\n } else {\n dep.currentValue = dep.managerData.version;\n }\n }\n}\n\nfunction handleGalaxyDep(dep: AnsibleGalaxyPackageDependency): void {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n dep.registryUrls = dep.managerData.source\n ? /* istanbul ignore next: should have test */ [dep.managerData.source]\n : [];\n dep.currentValue = dep.managerData.version;\n}\n\nfunction finalize(dependency: AnsibleGalaxyPackageDependency): boolean {\n const dep = dependency;\n dep.depName = dep.managerData.name;\n\n const name = dep.managerData.name;\n const nameMatch = nameMatchRegex.exec(name);\n\n // use type if defined\n switch (dependency.managerData.type) {\n case 'galaxy':\n handleGalaxyDep(dep);\n break;\n case 'git':\n handleGitDep(dep, nameMatch);\n break;\n case 'file':\n dep.skipReason = 'local-dependency';\n break;\n case null:\n // try to find out type based on source\n if (nameMatch) {\n handleGitDep(dep, nameMatch);\n break;\n }\n if (galaxyDepRegex.exec(dep.managerData.name)) {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n break;\n }\n dep.skipReason = 'no-source-match';\n break;\n default:\n dep.skipReason = 'unsupported';\n return true;\n }\n\n if (!dependency.currentValue && !dep.skipReason) {\n dep.skipReason = 'unspecified-version';\n }\n return true;\n}\n\nexport function extractCollections(lines: string[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {\n let lineMatch = newBlockRegEx.exec(lines[lineNumber]);\n if (lineMatch) {\n const dep: AnsibleGalaxyPackageDependency = {\n depType: 'galaxy-collection',\n managerData: {\n name: null,\n version: null,\n type: null,\n source: null,\n },\n };\n do {\n interpretLine(lineMatch, dep);\n const line = lines[lineNumber + 1];\n\n if (!line) {\n break;\n }\n lineMatch = blockLineRegEx.exec(line);\n if (lineMatch) {\n lineNumber += 1;\n }\n } while (lineMatch);\n if (finalize(dep)) {\n delete (dep as PackageDependency).managerData;\n deps.push(dep);\n }\n }\n }\n return deps;\n}\n"],"mappings":"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"}
|
|
@@ -29,9 +29,11 @@ function extractPackageFile(content, packageFile) {
|
|
|
29
29
|
if (regEx(/^roles:/).exec(line)) positions.roles = index;
|
|
30
30
|
});
|
|
31
31
|
if (positions.collections >= 0 || positions.roles >= 0) {
|
|
32
|
-
const
|
|
32
|
+
const collectionLines = lines.slice(positions.collections, getSliceEndNumber(positions.collections, lines.length, positions.roles));
|
|
33
|
+
const collectionDeps = extractCollections(collectionLines);
|
|
33
34
|
deps.push(...collectionDeps);
|
|
34
|
-
const
|
|
35
|
+
const roleLines = lines.slice(positions.roles, getSliceEndNumber(positions.roles, lines.length, positions.collections));
|
|
36
|
+
const roleDeps = extractRoles(roleLines);
|
|
35
37
|
deps.push(...roleDeps);
|
|
36
38
|
} else {
|
|
37
39
|
const galaxyDeps = extractRoles(lines);
|
|
@@ -40,7 +42,7 @@ function extractPackageFile(content, packageFile) {
|
|
|
40
42
|
}
|
|
41
43
|
if (!deps.length) return null;
|
|
42
44
|
return { deps };
|
|
43
|
-
} catch (err)
|
|
45
|
+
} catch (err) /* istanbul ignore next */ {
|
|
44
46
|
logger.debug({
|
|
45
47
|
err,
|
|
46
48
|
packageFile
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ansible-galaxy/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport { extractCollections } from './collections.ts';\nimport { extractCollectionsMetaDataFile } from './collections-metadata.ts';\nimport { extractRoles } from './roles.ts';\n\nexport function getSliceEndNumber(\n start: number,\n numberOfLines: number,\n ...blocks: number[]\n): number {\n if (start < 0 || start > numberOfLines - 1) {\n return -1;\n }\n let nearestEnd = numberOfLines;\n for (const blocksKey of blocks) {\n if (start < blocksKey && blocksKey < nearestEnd) {\n nearestEnd = blocksKey;\n }\n }\n return nearestEnd;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n logger.trace(`ansible-galaxy.extractPackageFile(${packageFile})`);\n const galaxyFileNameRegEx = regEx(/galaxy\\.ya?ml$/);\n const deps: PackageDependency[] = [];\n const lines = content.split(newlineRegex);\n\n try {\n // if this is a galaxy.yml file we have to interpret the dependencies differently\n if (galaxyFileNameRegEx.exec(packageFile)) {\n const galaxyDeps = extractCollectionsMetaDataFile(lines);\n deps.push(...galaxyDeps);\n } else {\n // interpret requirements file\n // check if new or old format is used and save start lines for collection and roles.\n const positions = {\n collections: -1,\n roles: -1,\n };\n // find role and collection block\n lines.forEach((line, index) => {\n if (regEx(/^collections:/).exec(line)) {\n positions.collections = index;\n }\n if (regEx(/^roles:/).exec(line)) {\n positions.roles = index;\n }\n });\n if (positions.collections >= 0 || positions.roles >= 0) {\n // using new format\n const collectionLines = lines.slice(\n positions.collections,\n getSliceEndNumber(\n positions.collections,\n lines.length,\n positions.roles,\n ),\n );\n const collectionDeps = extractCollections(collectionLines);\n deps.push(...collectionDeps);\n\n const roleLines = lines.slice(\n positions.roles,\n getSliceEndNumber(\n positions.roles,\n lines.length,\n positions.collections,\n ),\n );\n const roleDeps = extractRoles(roleLines);\n deps.push(...roleDeps);\n } else {\n // use old format which only has only roles\n const galaxyDeps = extractRoles(lines);\n deps.push(...galaxyDeps);\n }\n }\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Error extracting ansible-galaxy deps');\n return null;\n }\n}\n"],"mappings":";;;;;;AAOA,SAAgB,kBACd,OACA,eACA,GAAG,QACK;CACR,IAAI,QAAQ,KAAK,QAAQ,gBAAgB,GACvC,OAAO;CAET,IAAI,aAAa;CACjB,KAAK,MAAM,aAAa,QACtB,IAAI,QAAQ,aAAa,YAAY,YACnC,aAAa;CAGjB,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,aAC2B;CAC3B,OAAO,MAAM,qCAAqC,YAAY,EAAE;CAChE,MAAM,sBAAsB,MAAM,gBAAgB;CAClD,MAAM,OAA4B,CAAC;CACnC,MAAM,QAAQ,QAAQ,MAAM,YAAY;CAExC,IAAI;EAEF,IAAI,oBAAoB,KAAK,WAAW,GAAG;GACzC,MAAM,aAAa,+BAA+B,KAAK;GACvD,KAAK,KAAK,GAAG,UAAU;EACzB,OAAO;GAGL,MAAM,YAAY;IAChB,aAAa;IACb,OAAO;GACT;GAEA,MAAM,SAAS,MAAM,UAAU;IAC7B,IAAI,MAAM,eAAe,CAAC,CAAC,KAAK,IAAI,GAClC,UAAU,cAAc;IAE1B,IAAI,MAAM,SAAS,CAAC,CAAC,KAAK,IAAI,GAC5B,UAAU,QAAQ;GAEtB,CAAC;GACD,IAAI,UAAU,eAAe,KAAK,UAAU,SAAS,GAAG;
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ansible-galaxy/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport { extractCollections } from './collections.ts';\nimport { extractCollectionsMetaDataFile } from './collections-metadata.ts';\nimport { extractRoles } from './roles.ts';\n\nexport function getSliceEndNumber(\n start: number,\n numberOfLines: number,\n ...blocks: number[]\n): number {\n if (start < 0 || start > numberOfLines - 1) {\n return -1;\n }\n let nearestEnd = numberOfLines;\n for (const blocksKey of blocks) {\n if (start < blocksKey && blocksKey < nearestEnd) {\n nearestEnd = blocksKey;\n }\n }\n return nearestEnd;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n logger.trace(`ansible-galaxy.extractPackageFile(${packageFile})`);\n const galaxyFileNameRegEx = regEx(/galaxy\\.ya?ml$/);\n const deps: PackageDependency[] = [];\n const lines = content.split(newlineRegex);\n\n try {\n // if this is a galaxy.yml file we have to interpret the dependencies differently\n if (galaxyFileNameRegEx.exec(packageFile)) {\n const galaxyDeps = extractCollectionsMetaDataFile(lines);\n deps.push(...galaxyDeps);\n } else {\n // interpret requirements file\n // check if new or old format is used and save start lines for collection and roles.\n const positions = {\n collections: -1,\n roles: -1,\n };\n // find role and collection block\n lines.forEach((line, index) => {\n if (regEx(/^collections:/).exec(line)) {\n positions.collections = index;\n }\n if (regEx(/^roles:/).exec(line)) {\n positions.roles = index;\n }\n });\n if (positions.collections >= 0 || positions.roles >= 0) {\n // using new format\n const collectionLines = lines.slice(\n positions.collections,\n getSliceEndNumber(\n positions.collections,\n lines.length,\n positions.roles,\n ),\n );\n const collectionDeps = extractCollections(collectionLines);\n deps.push(...collectionDeps);\n\n const roleLines = lines.slice(\n positions.roles,\n getSliceEndNumber(\n positions.roles,\n lines.length,\n positions.collections,\n ),\n );\n const roleDeps = extractRoles(roleLines);\n deps.push(...roleDeps);\n } else {\n // use old format which only has only roles\n const galaxyDeps = extractRoles(lines);\n deps.push(...galaxyDeps);\n }\n }\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Error extracting ansible-galaxy deps');\n return null;\n }\n}\n"],"mappings":";;;;;;AAOA,SAAgB,kBACd,OACA,eACA,GAAG,QACK;CACR,IAAI,QAAQ,KAAK,QAAQ,gBAAgB,GACvC,OAAO;CAET,IAAI,aAAa;CACjB,KAAK,MAAM,aAAa,QACtB,IAAI,QAAQ,aAAa,YAAY,YACnC,aAAa;CAGjB,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,aAC2B;CAC3B,OAAO,MAAM,qCAAqC,YAAY,EAAE;CAChE,MAAM,sBAAsB,MAAM,gBAAgB;CAClD,MAAM,OAA4B,CAAC;CACnC,MAAM,QAAQ,QAAQ,MAAM,YAAY;CAExC,IAAI;EAEF,IAAI,oBAAoB,KAAK,WAAW,GAAG;GACzC,MAAM,aAAa,+BAA+B,KAAK;GACvD,KAAK,KAAK,GAAG,UAAU;EACzB,OAAO;GAGL,MAAM,YAAY;IAChB,aAAa;IACb,OAAO;GACT;GAEA,MAAM,SAAS,MAAM,UAAU;IAC7B,IAAI,MAAM,eAAe,CAAC,CAAC,KAAK,IAAI,GAClC,UAAU,cAAc;IAE1B,IAAI,MAAM,SAAS,CAAC,CAAC,KAAK,IAAI,GAC5B,UAAU,QAAQ;GAEtB,CAAC;GACD,IAAI,UAAU,eAAe,KAAK,UAAU,SAAS,GAAG;IAEtD,MAAM,kBAAkB,MAAM,MAC5B,UAAU,aACV,kBACE,UAAU,aACV,MAAM,QACN,UAAU,KACZ,CACF;IACA,MAAM,iBAAiB,mBAAmB,eAAe;IACzD,KAAK,KAAK,GAAG,cAAc;IAE3B,MAAM,YAAY,MAAM,MACtB,UAAU,OACV,kBACE,UAAU,OACV,MAAM,QACN,UAAU,WACZ,CACF;IACA,MAAM,WAAW,aAAa,SAAS;IACvC,KAAK,KAAK,GAAG,QAAQ;GACvB,OAAO;IAEL,MAAM,aAAa,aAAa,KAAK;IACrC,KAAK,KAAK,GAAG,UAAU;GACzB;EACF;EAEA,IAAI,CAAC,KAAK,QACR,OAAO;EAET,OAAO,EAAE,KAAK;CAChB,SAAS,gCAAgC;EACvC,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,sCAAsC;EACzE,OAAO;CACT;AACF"}
|
|
@@ -52,7 +52,7 @@ async function getHashFromUrl(url) {
|
|
|
52
52
|
const hash = await hashStream(http.stream(url), "sha256");
|
|
53
53
|
await set(cacheNamespace, url, hash, 4320);
|
|
54
54
|
return hash;
|
|
55
|
-
} catch
|
|
55
|
+
} catch /* istanbul ignore next */ {
|
|
56
56
|
return null;
|
|
57
57
|
}
|
|
58
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","names":["packageCache.get","packageCache.set","pMap"],"sources":["../../../../lib/modules/manager/bazel/artifacts.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { map as pMap } from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n ArtifactError,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport {\n findCodeFragment,\n patchCodeAtFragments,\n updateCode,\n} from './common.ts';\nimport type { RecordFragment, StringFragment } from './types.ts';\n\nconst http = new Http('bazel');\n\nfunction getUrlFragments(rule: RecordFragment): StringFragment[] {\n const urls: StringFragment[] = [];\n\n const urlRecord = rule.children.url;\n if (urlRecord?.type === 'string') {\n urls.push(urlRecord);\n }\n\n const urlsRecord = rule.children.urls;\n if (urlsRecord?.type === 'array') {\n for (const urlRecord of urlsRecord.children) {\n if (urlRecord.type === 'string') {\n urls.push(urlRecord);\n }\n }\n }\n\n return urls;\n}\n\nconst urlMassages = {\n 'bazel-skylib.': 'bazel_skylib-',\n '/bazel-gazelle/releases/download/0': '/bazel-gazelle/releases/download/v0',\n '/bazel-gazelle-0': '/bazel-gazelle-v0',\n '/rules_go/releases/download/0': '/rules_go/releases/download/v0',\n '/rules_go-0': '/rules_go-v0',\n};\n\nfunction massageUrl(url: string): string {\n let result = url;\n for (const [from, to] of Object.entries(urlMassages)) {\n result = result.replace(from, to);\n }\n return result;\n}\n\nfunction migrateUrl(url: string, upgrade: Upgrade): string {\n const newValue = upgrade.newValue?.replace(regEx(/^v/), '');\n\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.3.5\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.4.0\n if (\n url.endsWith('/rules_webtesting.tar.gz') &&\n !newValue?.match(regEx(/^0\\.[0123]\\./))\n ) {\n return url.replace(regEx(/\\.tar\\.gz$/), `-${newValue}.tar.gz`);\n }\n\n return url;\n}\n\nfunction replaceAll(input: string, from: string, to: string): string {\n return input.split(from).join(to);\n}\n\nfunction replaceValues(\n content: string,\n from: string | null | undefined,\n to: string | null | undefined,\n): string {\n // istanbul ignore if\n if (!from || !to || from === to) {\n return content;\n }\n const massagedFrom = from.replace(regEx(/^v/), '');\n const massagedTo = to.replace(regEx(/^v/), '');\n return replaceAll(content, massagedFrom, massagedTo);\n}\n\nasync function getHashFromUrl(url: string): Promise<string | null> {\n const cacheNamespace = 'url-sha256';\n const cachedResult = await packageCache.get<string | null>(\n cacheNamespace,\n url,\n );\n /* istanbul ignore next line */\n if (cachedResult) {\n return cachedResult;\n }\n try {\n const hash = await hashStream(http.stream(url), 'sha256');\n const cacheMinutes = 3 * 24 * 60; // 3 days\n await packageCache.set(cacheNamespace, url, hash, cacheMinutes);\n return hash;\n } catch /* istanbul ignore next */ {\n return null;\n }\n}\n\nasync function getHashFromUrls(urls: string[]): Promise<string | null> {\n const hashes = (\n await pMap(urls, (url) => getHashFromUrl(massageUrl(url)))\n ).filter(isTruthy);\n if (!hashes.length) {\n logger.debug({ urls }, 'Could not calculate hash for URLs');\n return null;\n }\n\n const distinctHashes = new Set(hashes);\n // istanbul ignore if\n if (distinctHashes.size > 1) {\n logger.warn({ urls }, 'Found multiple hashes for single def');\n }\n\n return hashes[0];\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName: path, updatedDeps: upgrades } = updateArtifact;\n const oldContents = updateArtifact.newPackageFileContent;\n let newContents = oldContents;\n const artifactErrors: ArtifactError[] = [];\n for (const upgrade of upgrades) {\n const { managerData } = upgrade;\n const idx = managerData?.idx as number;\n\n if (upgrade.depType === 'http_file' || upgrade.depType === 'http_archive') {\n const rule = findCodeFragment(newContents, [idx]);\n /* v8 ignore next -- used only for type narrowing */\n if (rule?.type !== 'record') {\n continue;\n }\n\n const urlFragments = getUrlFragments(rule);\n if (!urlFragments?.length) {\n logger.debug(`def: ${rule.value}, urls is empty`);\n continue;\n }\n\n function updateValues(oldUrl: string): string {\n let url = oldUrl;\n url = replaceValues(url, upgrade.currentValue, upgrade.newValue);\n url = replaceValues(url, upgrade.currentDigest, upgrade.newDigest);\n url = migrateUrl(url, upgrade);\n return url;\n }\n\n const urls = urlFragments.map(({ value }) => updateValues(value));\n const hash = await getHashFromUrls(urls);\n if (!hash) {\n if (urlFragments.length >= 1) {\n artifactErrors.push({\n fileName: path,\n stderr: `Could not calculate sha256 for ${upgrade.depName} at ${upgrade.newValue}. Checked URLs: ${urls.join(', ')}`,\n });\n }\n continue;\n }\n\n newContents = patchCodeAtFragments(\n newContents,\n urlFragments,\n updateValues,\n );\n newContents = updateCode(\n newContents,\n [idx, 'strip_prefix'],\n updateValues,\n );\n newContents = updateCode(newContents, [idx, 'sha256'], hash);\n }\n }\n\n if (oldContents === newContents) {\n if (artifactErrors.length) {\n // If we have artifact errors, return them even if we have file changes\n return artifactErrors.map((error) => ({\n artifactError: error,\n }));\n }\n return null;\n }\n\n return [\n {\n file: {\n type: 'addition',\n path,\n contents: newContents,\n },\n },\n ];\n}\n"],"mappings":";;;;;;;;;AAoBA,MAAM,OAAO,IAAI,KAAK,OAAO;AAE7B,SAAS,gBAAgB,MAAwC;CAC/D,MAAM,OAAyB,CAAC;CAEhC,MAAM,YAAY,KAAK,SAAS;CAChC,IAAI,WAAW,SAAS,UACtB,KAAK,KAAK,SAAS;CAGrB,MAAM,aAAa,KAAK,SAAS;CACjC,IAAI,YAAY,SAAS,SAClB;OAAA,MAAM,aAAa,WAAW,UACjC,IAAI,UAAU,SAAS,UACrB,KAAK,KAAK,SAAS;CAAA;CAKzB,OAAO;AACT;AAEA,MAAM,cAAc;CAClB,iBAAiB;CACjB,sCAAsC;CACtC,oBAAoB;CACpB,iCAAiC;CACjC,eAAe;AACjB;AAEA,SAAS,WAAW,KAAqB;CACvC,IAAI,SAAS;CACb,KAAK,MAAM,CAAC,MAAM,OAAO,OAAO,QAAQ,WAAW,GACjD,SAAS,OAAO,QAAQ,MAAM,EAAE;CAElC,OAAO;AACT;AAEA,SAAS,WAAW,KAAa,SAA0B;CACzD,MAAM,WAAW,QAAQ,UAAU,QAAQ,MAAM,IAAI,GAAG,EAAE;CAI1D,IACE,IAAI,SAAS,0BAA0B,KACvC,CAAC,UAAU,MAAM,MAAM,cAAc,CAAC,GAEtC,OAAO,IAAI,QAAQ,MAAM,YAAY,GAAG,IAAI,SAAS,QAAQ;CAG/D,OAAO;AACT;AAEA,SAAS,WAAW,OAAe,MAAc,IAAoB;CACnE,OAAO,MAAM,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE;AAClC;AAEA,SAAS,cACP,SACA,MACA,IACQ;;CAER,IAAI,CAAC,QAAQ,CAAC,MAAM,SAAS,IAC3B,OAAO;CAIT,OAAO,WAAW,SAFG,KAAK,QAAQ,MAAM,IAAI,GAAG,EAET,GADnB,GAAG,QAAQ,MAAM,IAAI,GAAG,EACO,CAAC;AACrD;AAEA,eAAe,eAAe,KAAqC;CACjE,MAAM,iBAAiB;CACvB,MAAM,eAAe,MAAMA,IACzB,gBACA,GACF;;CAEA,IAAI,cACF,OAAO;CAET,IAAI;EACF,MAAM,OAAO,MAAM,WAAW,KAAK,OAAO,GAAG,GAAG,QAAQ;EAExD,MAAMC,IAAiB,gBAAgB,KAAK,MAAM,IAAY;EAC9D,OAAO;CACT,
|
|
1
|
+
{"version":3,"file":"artifacts.js","names":["packageCache.get","packageCache.set","pMap"],"sources":["../../../../lib/modules/manager/bazel/artifacts.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { map as pMap } from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n ArtifactError,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport {\n findCodeFragment,\n patchCodeAtFragments,\n updateCode,\n} from './common.ts';\nimport type { RecordFragment, StringFragment } from './types.ts';\n\nconst http = new Http('bazel');\n\nfunction getUrlFragments(rule: RecordFragment): StringFragment[] {\n const urls: StringFragment[] = [];\n\n const urlRecord = rule.children.url;\n if (urlRecord?.type === 'string') {\n urls.push(urlRecord);\n }\n\n const urlsRecord = rule.children.urls;\n if (urlsRecord?.type === 'array') {\n for (const urlRecord of urlsRecord.children) {\n if (urlRecord.type === 'string') {\n urls.push(urlRecord);\n }\n }\n }\n\n return urls;\n}\n\nconst urlMassages = {\n 'bazel-skylib.': 'bazel_skylib-',\n '/bazel-gazelle/releases/download/0': '/bazel-gazelle/releases/download/v0',\n '/bazel-gazelle-0': '/bazel-gazelle-v0',\n '/rules_go/releases/download/0': '/rules_go/releases/download/v0',\n '/rules_go-0': '/rules_go-v0',\n};\n\nfunction massageUrl(url: string): string {\n let result = url;\n for (const [from, to] of Object.entries(urlMassages)) {\n result = result.replace(from, to);\n }\n return result;\n}\n\nfunction migrateUrl(url: string, upgrade: Upgrade): string {\n const newValue = upgrade.newValue?.replace(regEx(/^v/), '');\n\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.3.5\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.4.0\n if (\n url.endsWith('/rules_webtesting.tar.gz') &&\n !newValue?.match(regEx(/^0\\.[0123]\\./))\n ) {\n return url.replace(regEx(/\\.tar\\.gz$/), `-${newValue}.tar.gz`);\n }\n\n return url;\n}\n\nfunction replaceAll(input: string, from: string, to: string): string {\n return input.split(from).join(to);\n}\n\nfunction replaceValues(\n content: string,\n from: string | null | undefined,\n to: string | null | undefined,\n): string {\n // istanbul ignore if\n if (!from || !to || from === to) {\n return content;\n }\n const massagedFrom = from.replace(regEx(/^v/), '');\n const massagedTo = to.replace(regEx(/^v/), '');\n return replaceAll(content, massagedFrom, massagedTo);\n}\n\nasync function getHashFromUrl(url: string): Promise<string | null> {\n const cacheNamespace = 'url-sha256';\n const cachedResult = await packageCache.get<string | null>(\n cacheNamespace,\n url,\n );\n /* istanbul ignore next line */\n if (cachedResult) {\n return cachedResult;\n }\n try {\n const hash = await hashStream(http.stream(url), 'sha256');\n const cacheMinutes = 3 * 24 * 60; // 3 days\n await packageCache.set(cacheNamespace, url, hash, cacheMinutes);\n return hash;\n } catch /* istanbul ignore next */ {\n return null;\n }\n}\n\nasync function getHashFromUrls(urls: string[]): Promise<string | null> {\n const hashes = (\n await pMap(urls, (url) => getHashFromUrl(massageUrl(url)))\n ).filter(isTruthy);\n if (!hashes.length) {\n logger.debug({ urls }, 'Could not calculate hash for URLs');\n return null;\n }\n\n const distinctHashes = new Set(hashes);\n // istanbul ignore if\n if (distinctHashes.size > 1) {\n logger.warn({ urls }, 'Found multiple hashes for single def');\n }\n\n return hashes[0];\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName: path, updatedDeps: upgrades } = updateArtifact;\n const oldContents = updateArtifact.newPackageFileContent;\n let newContents = oldContents;\n const artifactErrors: ArtifactError[] = [];\n for (const upgrade of upgrades) {\n const { managerData } = upgrade;\n const idx = managerData?.idx as number;\n\n if (upgrade.depType === 'http_file' || upgrade.depType === 'http_archive') {\n const rule = findCodeFragment(newContents, [idx]);\n /* v8 ignore next -- used only for type narrowing */\n if (rule?.type !== 'record') {\n continue;\n }\n\n const urlFragments = getUrlFragments(rule);\n if (!urlFragments?.length) {\n logger.debug(`def: ${rule.value}, urls is empty`);\n continue;\n }\n\n function updateValues(oldUrl: string): string {\n let url = oldUrl;\n url = replaceValues(url, upgrade.currentValue, upgrade.newValue);\n url = replaceValues(url, upgrade.currentDigest, upgrade.newDigest);\n url = migrateUrl(url, upgrade);\n return url;\n }\n\n const urls = urlFragments.map(({ value }) => updateValues(value));\n const hash = await getHashFromUrls(urls);\n if (!hash) {\n if (urlFragments.length >= 1) {\n artifactErrors.push({\n fileName: path,\n stderr: `Could not calculate sha256 for ${upgrade.depName} at ${upgrade.newValue}. Checked URLs: ${urls.join(', ')}`,\n });\n }\n continue;\n }\n\n newContents = patchCodeAtFragments(\n newContents,\n urlFragments,\n updateValues,\n );\n newContents = updateCode(\n newContents,\n [idx, 'strip_prefix'],\n updateValues,\n );\n newContents = updateCode(newContents, [idx, 'sha256'], hash);\n }\n }\n\n if (oldContents === newContents) {\n if (artifactErrors.length) {\n // If we have artifact errors, return them even if we have file changes\n return artifactErrors.map((error) => ({\n artifactError: error,\n }));\n }\n return null;\n }\n\n return [\n {\n file: {\n type: 'addition',\n path,\n contents: newContents,\n },\n },\n ];\n}\n"],"mappings":"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"}
|
|
@@ -218,7 +218,7 @@ function parse(input, packageFile) {
|
|
|
218
218
|
try {
|
|
219
219
|
const parsedResult = starlark.query(input, query$1, emptyCtx(input));
|
|
220
220
|
if (parsedResult) result = parsedResult.results;
|
|
221
|
-
} catch (err)
|
|
221
|
+
} catch (err) /* istanbul ignore next */ {
|
|
222
222
|
logger.debug({
|
|
223
223
|
err,
|
|
224
224
|
packageFile
|