renovate 44.61.0 → 44.61.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.
Files changed (243) hide show
  1. package/dist/config/migration.js +1 -1
  2. package/dist/config/migration.js.map +1 -1
  3. package/dist/config/migrations/custom/schedule-migration.js +8 -8
  4. package/dist/config/migrations/custom/schedule-migration.js.map +1 -1
  5. package/dist/config/options/env.js +1 -1
  6. package/dist/config/options/env.js.map +1 -1
  7. package/dist/config/parse.js +1 -1
  8. package/dist/config/parse.js.map +1 -1
  9. package/dist/config/presets/parse.js +1 -1
  10. package/dist/config/presets/parse.js.map +1 -1
  11. package/dist/config/validation.js +1 -1
  12. package/dist/config/validation.js.map +1 -1
  13. package/dist/logger/utils.js +2 -2
  14. package/dist/logger/utils.js.map +1 -1
  15. package/dist/modules/datasource/deno/index.js +1 -1
  16. package/dist/modules/datasource/deno/index.js.map +1 -1
  17. package/dist/modules/datasource/docker/ecr.js +1 -1
  18. package/dist/modules/datasource/docker/ecr.js.map +1 -1
  19. package/dist/modules/datasource/docker/google.js +1 -1
  20. package/dist/modules/datasource/docker/google.js.map +1 -1
  21. package/dist/modules/datasource/go/base.js +1 -1
  22. package/dist/modules/datasource/go/base.js.map +1 -1
  23. package/dist/modules/datasource/go/goproxy-parser.js +1 -1
  24. package/dist/modules/datasource/go/goproxy-parser.js.map +1 -1
  25. package/dist/modules/datasource/go/releases-goproxy.js +1 -1
  26. package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
  27. package/dist/modules/datasource/gradle-version/index.js +1 -1
  28. package/dist/modules/datasource/gradle-version/index.js.map +1 -1
  29. package/dist/modules/datasource/helm/schema.js +2 -2
  30. package/dist/modules/datasource/helm/schema.js.map +1 -1
  31. package/dist/modules/datasource/hexpm-bob/index.js +1 -1
  32. package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
  33. package/dist/modules/datasource/npm/get.js +1 -1
  34. package/dist/modules/datasource/npm/get.js.map +1 -1
  35. package/dist/modules/datasource/npm/npmrc.js +1 -1
  36. package/dist/modules/datasource/npm/npmrc.js.map +1 -1
  37. package/dist/modules/datasource/pypi/common.js +2 -2
  38. package/dist/modules/datasource/pypi/common.js.map +1 -1
  39. package/dist/modules/datasource/pypi/index.js +1 -1
  40. package/dist/modules/datasource/pypi/index.js.map +1 -1
  41. package/dist/modules/manager/ansible/extract.js +2 -2
  42. package/dist/modules/manager/ansible/extract.js.map +1 -1
  43. package/dist/modules/manager/ansible-galaxy/collections.js +2 -2
  44. package/dist/modules/manager/ansible-galaxy/collections.js.map +1 -1
  45. package/dist/modules/manager/ansible-galaxy/roles.js +2 -2
  46. package/dist/modules/manager/ansible-galaxy/roles.js.map +1 -1
  47. package/dist/modules/manager/ansible-galaxy/util.js +4 -4
  48. package/dist/modules/manager/ansible-galaxy/util.js.map +1 -1
  49. package/dist/modules/manager/ant/properties.js +9 -9
  50. package/dist/modules/manager/ant/properties.js.map +1 -1
  51. package/dist/modules/manager/asdf/extract.js +1 -1
  52. package/dist/modules/manager/asdf/extract.js.map +1 -1
  53. package/dist/modules/manager/asdf/upgradeable-tooling.js +1 -1
  54. package/dist/modules/manager/asdf/upgradeable-tooling.js.map +1 -1
  55. package/dist/modules/manager/batect-wrapper/extract.js +2 -2
  56. package/dist/modules/manager/batect-wrapper/extract.js.map +1 -1
  57. package/dist/modules/manager/bazel/rules/go.js +1 -1
  58. package/dist/modules/manager/bazel/rules/go.js.map +1 -1
  59. package/dist/modules/manager/buildkite/extract.js +1 -1
  60. package/dist/modules/manager/buildkite/extract.js.map +1 -1
  61. package/dist/modules/manager/buildpacks/extract.js +1 -1
  62. package/dist/modules/manager/buildpacks/extract.js.map +1 -1
  63. package/dist/modules/manager/bundler/common.js +7 -7
  64. package/dist/modules/manager/bundler/common.js.map +1 -1
  65. package/dist/modules/manager/bundler/extract.js +4 -4
  66. package/dist/modules/manager/bundler/extract.js.map +1 -1
  67. package/dist/modules/manager/deno/utils.js +1 -1
  68. package/dist/modules/manager/deno/utils.js.map +1 -1
  69. package/dist/modules/manager/dockerfile/extract.js +11 -4
  70. package/dist/modules/manager/dockerfile/extract.js.map +1 -1
  71. package/dist/modules/manager/fingerprint.generated.js +4 -4
  72. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  73. package/dist/modules/manager/flux/extract.js +2 -1
  74. package/dist/modules/manager/flux/extract.js.map +1 -1
  75. package/dist/modules/manager/git-submodules/extract.js +1 -1
  76. package/dist/modules/manager/git-submodules/extract.js.map +1 -1
  77. package/dist/modules/manager/github-actions/common.js +3 -3
  78. package/dist/modules/manager/github-actions/common.js.map +1 -1
  79. package/dist/modules/manager/github-actions/parse.js +1 -1
  80. package/dist/modules/manager/github-actions/parse.js.map +1 -1
  81. package/dist/modules/manager/gomod/artifacts.js +4 -4
  82. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  83. package/dist/modules/manager/gomod/line-parser.js +1 -1
  84. package/dist/modules/manager/gomod/line-parser.js.map +1 -1
  85. package/dist/modules/manager/gomod/update.js +1 -1
  86. package/dist/modules/manager/gomod/update.js.map +1 -1
  87. package/dist/modules/manager/gradle/parser/handlers.js +1 -1
  88. package/dist/modules/manager/gradle/parser/handlers.js.map +1 -1
  89. package/dist/modules/manager/helmv3/utils.js +1 -1
  90. package/dist/modules/manager/helmv3/utils.js.map +1 -1
  91. package/dist/modules/manager/html/extract.js +2 -2
  92. package/dist/modules/manager/html/extract.js.map +1 -1
  93. package/dist/modules/manager/kustomize/extract.js +3 -3
  94. package/dist/modules/manager/kustomize/extract.js.map +1 -1
  95. package/dist/modules/manager/leiningen/extract.js +1 -1
  96. package/dist/modules/manager/leiningen/extract.js.map +1 -1
  97. package/dist/modules/manager/maven-wrapper/artifacts.js +6 -6
  98. package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
  99. package/dist/modules/manager/meteor/extract.js +2 -2
  100. package/dist/modules/manager/meteor/extract.js.map +1 -1
  101. package/dist/modules/manager/mise/upgradeable-tooling.js +2 -2
  102. package/dist/modules/manager/mise/upgradeable-tooling.js.map +1 -1
  103. package/dist/modules/manager/mix/extract.js +3 -3
  104. package/dist/modules/manager/mix/extract.js.map +1 -1
  105. package/dist/modules/manager/npm/extract/common/dependency.js +4 -4
  106. package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
  107. package/dist/modules/manager/npm/extract/yarnrc.js +1 -1
  108. package/dist/modules/manager/npm/extract/yarnrc.js.map +1 -1
  109. package/dist/modules/manager/npm/npmrc.js +1 -1
  110. package/dist/modules/manager/npm/npmrc.js.map +1 -1
  111. package/dist/modules/manager/npm/post-update/yarn.js +1 -1
  112. package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
  113. package/dist/modules/manager/npm/update/locked-dependency/package-lock/dep-constraints.js +1 -1
  114. package/dist/modules/manager/npm/update/locked-dependency/package-lock/dep-constraints.js.map +1 -1
  115. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/replace.js +1 -1
  116. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/replace.js.map +1 -1
  117. package/dist/modules/manager/nuget/extract.js +1 -1
  118. package/dist/modules/manager/nuget/extract.js.map +1 -1
  119. package/dist/modules/manager/pep621/utils.js +1 -1
  120. package/dist/modules/manager/pep621/utils.js.map +1 -1
  121. package/dist/modules/manager/pep723/utils.js +1 -1
  122. package/dist/modules/manager/pep723/utils.js.map +1 -1
  123. package/dist/modules/manager/pip-compile/common.js +2 -2
  124. package/dist/modules/manager/pip-compile/common.js.map +1 -1
  125. package/dist/modules/manager/pip_requirements/common.js +1 -1
  126. package/dist/modules/manager/pip_requirements/common.js.map +1 -1
  127. package/dist/modules/manager/pip_requirements/extract.js +1 -1
  128. package/dist/modules/manager/pip_requirements/extract.js.map +1 -1
  129. package/dist/modules/manager/poetry/artifacts.js +4 -4
  130. package/dist/modules/manager/poetry/artifacts.js.map +1 -1
  131. package/dist/modules/manager/puppet/puppetfile-parser.js +5 -5
  132. package/dist/modules/manager/puppet/puppetfile-parser.js.map +1 -1
  133. package/dist/modules/manager/sbt/update.js +1 -1
  134. package/dist/modules/manager/sbt/update.js.map +1 -1
  135. package/dist/modules/manager/sbt/util.js +2 -2
  136. package/dist/modules/manager/sbt/util.js.map +1 -1
  137. package/dist/modules/manager/setup-cfg/extract.js +2 -2
  138. package/dist/modules/manager/setup-cfg/extract.js.map +1 -1
  139. package/dist/modules/manager/swift/artifacts.js +4 -4
  140. package/dist/modules/manager/swift/artifacts.js.map +1 -1
  141. package/dist/modules/manager/swift/extract.js +1 -1
  142. package/dist/modules/manager/swift/extract.js.map +1 -1
  143. package/dist/modules/manager/tekton/extract.js +1 -1
  144. package/dist/modules/manager/tekton/extract.js.map +1 -1
  145. package/dist/modules/manager/terraform/extractors/others/modules.js +5 -5
  146. package/dist/modules/manager/terraform/extractors/others/modules.js.map +1 -1
  147. package/dist/modules/manager/terraform/util.js +1 -1
  148. package/dist/modules/manager/terraform/util.js.map +1 -1
  149. package/dist/modules/manager/terragrunt/modules.js +3 -3
  150. package/dist/modules/manager/terragrunt/modules.js.map +1 -1
  151. package/dist/modules/platform/azure/azure-got-wrapper.js +15 -5
  152. package/dist/modules/platform/azure/azure-got-wrapper.js.map +1 -1
  153. package/dist/modules/platform/azure/index.js +28 -8
  154. package/dist/modules/platform/azure/index.js.map +1 -1
  155. package/dist/modules/platform/azure/types.js.map +1 -1
  156. package/dist/modules/platform/bitbucket/index.js +4 -4
  157. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  158. package/dist/modules/platform/bitbucket-server/index.js +1 -1
  159. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  160. package/dist/modules/platform/gerrit/index.js +1 -1
  161. package/dist/modules/platform/gerrit/index.js.map +1 -1
  162. package/dist/modules/platform/gerrit/utils.js +3 -3
  163. package/dist/modules/platform/gerrit/utils.js.map +1 -1
  164. package/dist/modules/versioning/apk/index.js +3 -3
  165. package/dist/modules/versioning/apk/index.js.map +1 -1
  166. package/dist/modules/versioning/composer/index.js +11 -11
  167. package/dist/modules/versioning/composer/index.js.map +1 -1
  168. package/dist/modules/versioning/conan/range.js +1 -1
  169. package/dist/modules/versioning/conan/range.js.map +1 -1
  170. package/dist/modules/versioning/conda/index.js +1 -1
  171. package/dist/modules/versioning/conda/index.js.map +1 -1
  172. package/dist/modules/versioning/devbox/index.js +2 -2
  173. package/dist/modules/versioning/devbox/index.js.map +1 -1
  174. package/dist/modules/versioning/distro.js +1 -1
  175. package/dist/modules/versioning/distro.js.map +1 -1
  176. package/dist/modules/versioning/github-actions/index.js +2 -2
  177. package/dist/modules/versioning/github-actions/index.js.map +1 -1
  178. package/dist/modules/versioning/go-mod-directive/index.js +1 -1
  179. package/dist/modules/versioning/go-mod-directive/index.js.map +1 -1
  180. package/dist/modules/versioning/hashicorp/convertor.js +5 -5
  181. package/dist/modules/versioning/hashicorp/convertor.js.map +1 -1
  182. package/dist/modules/versioning/hex/index.js +4 -4
  183. package/dist/modules/versioning/hex/index.js.map +1 -1
  184. package/dist/modules/versioning/lambda-node/schedule.js +2 -2
  185. package/dist/modules/versioning/lambda-node/schedule.js.map +1 -1
  186. package/dist/modules/versioning/loose/index.js +2 -2
  187. package/dist/modules/versioning/loose/index.js.map +1 -1
  188. package/dist/modules/versioning/pep440/range.js +1 -1
  189. package/dist/modules/versioning/pep440/range.js.map +1 -1
  190. package/dist/modules/versioning/perl/index.js +4 -4
  191. package/dist/modules/versioning/perl/index.js.map +1 -1
  192. package/dist/modules/versioning/poetry/patterns.js +1 -1
  193. package/dist/modules/versioning/poetry/patterns.js.map +1 -1
  194. package/dist/modules/versioning/poetry/transform.js +3 -3
  195. package/dist/modules/versioning/poetry/transform.js.map +1 -1
  196. package/dist/modules/versioning/redhat/index.js +1 -1
  197. package/dist/modules/versioning/redhat/index.js.map +1 -1
  198. package/dist/modules/versioning/rpm/index.js +1 -1
  199. package/dist/modules/versioning/rpm/index.js.map +1 -1
  200. package/dist/modules/versioning/ruby/index.js +2 -2
  201. package/dist/modules/versioning/ruby/index.js.map +1 -1
  202. package/dist/modules/versioning/semver/common.js +1 -1
  203. package/dist/modules/versioning/semver/common.js.map +1 -1
  204. package/dist/modules/versioning/swift/range.js +13 -13
  205. package/dist/modules/versioning/swift/range.js.map +1 -1
  206. package/dist/modules/versioning/ubuntu/index.js +1 -1
  207. package/dist/modules/versioning/ubuntu/index.js.map +1 -1
  208. package/dist/modules/versioning/unity3d-packages/index.js +2 -2
  209. package/dist/modules/versioning/unity3d-packages/index.js.map +1 -1
  210. package/dist/util/cache/package/impl/redis.js +1 -1
  211. package/dist/util/cache/package/impl/redis.js.map +1 -1
  212. package/dist/util/exec/common.js +3 -3
  213. package/dist/util/exec/common.js.map +1 -1
  214. package/dist/util/git/author.js +1 -1
  215. package/dist/util/git/author.js.map +1 -1
  216. package/dist/util/git/semantic.js +1 -1
  217. package/dist/util/git/semantic.js.map +1 -1
  218. package/dist/util/http/www-authenticate.js +4 -4
  219. package/dist/util/http/www-authenticate.js.map +1 -1
  220. package/dist/util/ignore.js +1 -1
  221. package/dist/util/ignore.js.map +1 -1
  222. package/dist/util/markdown.js +8 -8
  223. package/dist/util/markdown.js.map +1 -1
  224. package/dist/util/pretty-time.js +3 -3
  225. package/dist/util/pretty-time.js.map +1 -1
  226. package/dist/util/regex.js +1 -1
  227. package/dist/util/regex.js.map +1 -1
  228. package/dist/workers/global/config/parse/cli.js +1 -1
  229. package/dist/workers/global/config/parse/cli.js.map +1 -1
  230. package/dist/workers/repository/model/semantic-commit-message.js +1 -1
  231. package/dist/workers/repository/model/semantic-commit-message.js.map +1 -1
  232. package/dist/workers/repository/onboarding/pr/pr-list.js +2 -2
  233. package/dist/workers/repository/onboarding/pr/pr-list.js.map +1 -1
  234. package/dist/workers/repository/update/pr/changelog/release-notes.js +3 -3
  235. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  236. package/dist/workers/repository/updates/branch-name.js +1 -1
  237. package/dist/workers/repository/updates/branch-name.js.map +1 -1
  238. package/dist/workers/repository/updates/flatten.js +1 -1
  239. package/dist/workers/repository/updates/flatten.js.map +1 -1
  240. package/dist/workers/repository/updates/generate.js +1 -1
  241. package/dist/workers/repository/updates/generate.js.map +1 -1
  242. package/package.json +2 -2
  243. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","names":["modulePath","hostRules.hostType"],"sources":["../../../../lib/modules/datasource/go/base.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport {\n parseUrl,\n trimLeadingSlash,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport { BitbucketTagsDatasource } from '../bitbucket-tags/index.ts';\nimport { ForgejoTagsDatasource } from '../forgejo-tags/index.ts';\nimport { GitTagsDatasource } from '../git-tags/index.ts';\nimport { GiteaTagsDatasource } from '../gitea-tags/index.ts';\nimport { GithubTagsDatasource } from '../github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../gitlab-tags/index.ts';\nimport type { DataSource } from './types.ts';\n\n// TODO: figure out class hierarchy (#10532)\nexport class BaseGoDatasource {\n private static readonly gitlabHttpsRegExp = regEx(\n /^(?<httpsRegExpUrl>https:\\/\\/[^/]*gitlab\\.[^/]*)\\/(?<httpsRegExpName>.+?)(?:\\/v\\d+)?[/]?$/,\n );\n private static readonly gitlabRegExp = regEx(\n /^(?<regExpUrl>gitlab\\.[^/]*)\\/(?<regExpPath>.+?)(?:\\/v\\d+)?[/]?$/,\n );\n private static readonly gitVcsRegexp = regEx(\n /^(?:[^/]+)\\/(?<module>.*)\\.git(?:$|\\/)/,\n );\n\n private static readonly id = 'go';\n private static readonly http = new Http(BaseGoDatasource.id);\n\n static async getDatasource(goModule: string): Promise<DataSource | null> {\n if (goModule.startsWith('gopkg.in/')) {\n const [pkg] = goModule.replace('gopkg.in/', '').split('.');\n const packageName = pkg.includes('/') ? pkg : `go-${pkg}/${pkg}`;\n return {\n datasource: GithubTagsDatasource.id,\n packageName,\n registryUrl: 'https://github.com',\n };\n }\n\n if (goModule.startsWith('github.com/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: GithubTagsDatasource.id,\n packageName,\n registryUrl: 'https://github.com',\n };\n }\n\n if (goModule.startsWith('bitbucket.org/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: BitbucketTagsDatasource.id,\n packageName,\n registryUrl: 'https://bitbucket.org',\n };\n }\n\n if (goModule.startsWith('code.cloudfoundry.org/')) {\n const packageName = goModule.replace(\n 'code.cloudfoundry.org',\n 'cloudfoundry',\n );\n return {\n datasource: GithubTagsDatasource.id,\n packageName,\n registryUrl: 'https://github.com',\n };\n }\n\n if (goModule.startsWith('dev.azure.com/')) {\n const split = goModule.split('/');\n if ((split.length > 4 && split[3] === '_git') || split.length > 3) {\n const packageName = `https://dev.azure.com/${split[1]}/${split[2]}/_git/${(split[3] === '_git' ? split[4] : split[3]).replace(regEx(/\\.git$/), '')}`;\n return {\n datasource: GitTagsDatasource.id,\n packageName,\n };\n }\n }\n\n //#region known gitea compatible hosts\n if (goModule.startsWith('gitea.com/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: GiteaTagsDatasource.id,\n packageName,\n registryUrl: 'https://gitea.com',\n };\n }\n\n if (goModule.startsWith('code.forgejo.org/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: ForgejoTagsDatasource.id,\n packageName,\n registryUrl: 'https://code.forgejo.org',\n };\n }\n\n if (goModule.startsWith('codeberg.org/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: ForgejoTagsDatasource.id,\n packageName,\n registryUrl: 'https://codeberg.org',\n };\n }\n //#endregion\n\n return await BaseGoDatasource.goGetDatasource(goModule);\n }\n\n private static async goGetDatasource(\n goModule: string,\n ): Promise<DataSource | null> {\n const goModuleUrl = goModule.replace(regEx(/\\.git(\\/[a-z0-9/]*)?$/), '');\n const pkgUrl = `https://${goModuleUrl}?go-get=1`;\n const { body: html } = await BaseGoDatasource.http.getText(pkgUrl);\n\n const goSourceHeader = BaseGoDatasource.goSourceHeader(html, goModule);\n if (goSourceHeader) {\n return goSourceHeader;\n }\n\n // GitHub Enterprise only returns a go-import meta\n const goImport = BaseGoDatasource.goImportHeader(html, goModule);\n if (goImport) {\n return goImport;\n }\n\n logger.trace({ goModule }, 'No go-source or go-import header found');\n return null;\n }\n\n private static goSourceHeader(\n html: string,\n goModule: string,\n ): DataSource | null {\n const sourceMatchGroups = regEx(\n /<meta\\s+name=\"?go-source\"?\\s+content=\"(?<prefix>[^\"\\s]+)\\s+(?<goSourceUrl>[^\"\\s]+)/,\n ).exec(html)?.groups;\n if (!sourceMatchGroups) {\n return null;\n }\n const { prefix, goSourceUrl } = sourceMatchGroups;\n\n if (!goModule.startsWith(prefix)) {\n logger.trace({ goModule }, 'go-source header prefix not match');\n return null;\n }\n\n logger.debug(`Go lookup source url ${goSourceUrl} for module ${goModule}`);\n return this.detectDatasource(goSourceUrl, goModule);\n }\n\n private static detectDatasource(\n metadataUrl: string,\n goModule: string,\n ): DataSource | null {\n if (metadataUrl.startsWith('https://github.com/')) {\n return {\n datasource: GithubTagsDatasource.id,\n packageName: metadataUrl\n .replace('https://github.com/', '')\n .replace(regEx(/\\/$/), ''),\n registryUrl: 'https://github.com',\n };\n }\n\n const gitlabModuleName =\n BaseGoDatasource.gitlabRegExp.exec(goModule)?.groups?.regExpPath;\n const vcsIndicatedModule =\n BaseGoDatasource.gitVcsRegexp.exec(goModule)?.groups?.module;\n\n const metadataUrlMatchGroups =\n BaseGoDatasource.gitlabHttpsRegExp.exec(metadataUrl)?.groups;\n if (metadataUrlMatchGroups) {\n const { httpsRegExpUrl, httpsRegExpName } = metadataUrlMatchGroups;\n\n let packageName = vcsIndicatedModule ?? gitlabModuleName;\n\n // Detect submodules in monorepos by comparing metadata path and module path\n if (!vcsIndicatedModule && httpsRegExpName && gitlabModuleName) {\n const metadataPath = httpsRegExpName;\n const modulePath = gitlabModuleName;\n\n if (modulePath.startsWith(`${metadataPath}/`)) {\n packageName = metadataPath;\n }\n }\n\n // If we still don't have a package name, fall back to the metadata URL path\n packageName = packageName ?? httpsRegExpName;\n\n return {\n datasource: GitlabTagsDatasource.id,\n registryUrl: httpsRegExpUrl,\n packageName,\n };\n }\n\n if (hostRules.hostType({ url: metadataUrl }) === 'gitlab') {\n const parsedUrl = parseUrl(metadataUrl);\n if (!parsedUrl) {\n logger.trace({ goModule }, 'Could not parse go-source URL');\n return null;\n }\n\n const endpoint = GlobalConfig.get('endpoint');\n const endpointPrefix = regEx(\n /https:\\/\\/[^/]+\\/(?<prefix>.*?\\/)(?:api\\/v4\\/?)?/,\n ).exec(endpoint)?.groups?.prefix;\n\n let packageName =\n // a .git path indicates a concrete git repository, which can be different from metadata returned by gitlab\n vcsIndicatedModule ?? trimLeadingSlash(parsedUrl.pathname);\n if (endpointPrefix && endpointPrefix !== 'api/') {\n packageName = packageName.replace(endpointPrefix, '');\n }\n\n const registryUrl = endpointPrefix\n ? endpoint.replace(regEx(/\\/api\\/v4\\/?$/), '/')\n : `${parsedUrl.protocol}//${parsedUrl.host}`;\n\n return {\n datasource: GitlabTagsDatasource.id,\n registryUrl,\n packageName,\n };\n }\n /* istanbul ignore next */\n return null;\n }\n\n private static goImportHeader(\n html: string,\n goModule: string,\n ): DataSource | null {\n const importMatchGroups = regEx(\n /<meta\\s+name=\"?go-import\"?\\s+content=\"(?<prefix>[^\"\\s]+)\\s+(?<proto>[^\"\\s]+)\\s+(?<goImportURL>[^\"\\s]+)/,\n ).exec(html)?.groups;\n if (!importMatchGroups) {\n logger.trace({ goModule }, 'No go-source or go-import header found');\n return null;\n }\n const { prefix, proto, goImportURL } = importMatchGroups;\n\n if (!goModule.startsWith(prefix)) {\n logger.trace({ goModule }, 'go-import header prefix not match');\n return null;\n }\n\n if (proto !== 'git') {\n logger.trace({ goModule }, 'go-import header proto not git');\n return null;\n }\n\n // get server base url from import url\n const parsedUrl = parseUrl(goImportURL);\n if (!parsedUrl) {\n logger.trace({ goModule }, 'Could not parse go-import URL');\n return null;\n }\n\n logger.debug(`Go module: ${goModule} lookup import url ${goImportURL}`);\n\n const datasource = this.detectDatasource(\n goImportURL.replace(regEx(/\\.git$/), ''),\n goModule,\n );\n if (datasource !== null) {\n return datasource;\n }\n // fall back to old behavior if detection did not work\n\n switch (detectPlatform(goImportURL)) {\n case 'github': {\n // split the go module from the URL: host/go/module -> go/module\n // TODO: `parsedUrl.pathname` can be undefined\n const packageName = trimTrailingSlash(`${parsedUrl.pathname}`)\n .replace(regEx(/\\.git$/), '')\n .split('/')\n .slice(-2)\n .join('/');\n\n return {\n datasource: GithubTagsDatasource.id,\n registryUrl: `${parsedUrl.protocol}//${parsedUrl.host}`,\n packageName,\n };\n }\n case 'azure': {\n return {\n datasource: GitTagsDatasource.id,\n packageName: goImportURL.replace(regEx(/\\.git$/), ''),\n };\n }\n default: {\n return {\n datasource: GitTagsDatasource.id,\n packageName: goImportURL,\n };\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base.js","names":["modulePath","hostRules.hostType"],"sources":["../../../../lib/modules/datasource/go/base.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport {\n parseUrl,\n trimLeadingSlash,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport { BitbucketTagsDatasource } from '../bitbucket-tags/index.ts';\nimport { ForgejoTagsDatasource } from '../forgejo-tags/index.ts';\nimport { GitTagsDatasource } from '../git-tags/index.ts';\nimport { GiteaTagsDatasource } from '../gitea-tags/index.ts';\nimport { GithubTagsDatasource } from '../github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../gitlab-tags/index.ts';\nimport type { DataSource } from './types.ts';\n\n// TODO: figure out class hierarchy (#10532)\nexport class BaseGoDatasource {\n private static readonly gitlabHttpsRegExp = regEx(\n /^(?<httpsRegExpUrl>https:\\/\\/[^/]*gitlab\\.[^/]*)\\/(?<httpsRegExpName>.+?)(?:\\/v\\d+)?[/]?$/,\n );\n private static readonly gitlabRegExp = regEx(\n /^(?<regExpUrl>gitlab\\.[^/]*)\\/(?<regExpPath>.+?)(?:\\/v\\d+)?[/]?$/,\n );\n private static readonly gitVcsRegexp = regEx(\n /^(?:[^/]+)\\/(?<module>.*)\\.git(?:$|\\/)/,\n );\n\n private static readonly id = 'go';\n private static readonly http = new Http(BaseGoDatasource.id);\n\n static async getDatasource(goModule: string): Promise<DataSource | null> {\n if (goModule.startsWith('gopkg.in/')) {\n const [pkg] = goModule.replace('gopkg.in/', '').split('.');\n const packageName = pkg.includes('/') ? pkg : `go-${pkg}/${pkg}`;\n return {\n datasource: GithubTagsDatasource.id,\n packageName,\n registryUrl: 'https://github.com',\n };\n }\n\n if (goModule.startsWith('github.com/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: GithubTagsDatasource.id,\n packageName,\n registryUrl: 'https://github.com',\n };\n }\n\n if (goModule.startsWith('bitbucket.org/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: BitbucketTagsDatasource.id,\n packageName,\n registryUrl: 'https://bitbucket.org',\n };\n }\n\n if (goModule.startsWith('code.cloudfoundry.org/')) {\n const packageName = goModule.replace(\n 'code.cloudfoundry.org',\n 'cloudfoundry',\n );\n return {\n datasource: GithubTagsDatasource.id,\n packageName,\n registryUrl: 'https://github.com',\n };\n }\n\n if (goModule.startsWith('dev.azure.com/')) {\n const split = goModule.split('/');\n if ((split.length > 4 && split[3] === '_git') || split.length > 3) {\n const packageName = `https://dev.azure.com/${split[1]}/${split[2]}/_git/${(split[3] === '_git' ? split[4] : split[3]).replace(regEx(/\\.git$/), '')}`;\n return {\n datasource: GitTagsDatasource.id,\n packageName,\n };\n }\n }\n\n //#region known gitea compatible hosts\n if (goModule.startsWith('gitea.com/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: GiteaTagsDatasource.id,\n packageName,\n registryUrl: 'https://gitea.com',\n };\n }\n\n if (goModule.startsWith('code.forgejo.org/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: ForgejoTagsDatasource.id,\n packageName,\n registryUrl: 'https://code.forgejo.org',\n };\n }\n\n if (goModule.startsWith('codeberg.org/')) {\n const split = goModule.split('/');\n const packageName = `${split[1]}/${split[2]}`;\n return {\n datasource: ForgejoTagsDatasource.id,\n packageName,\n registryUrl: 'https://codeberg.org',\n };\n }\n //#endregion\n\n return await BaseGoDatasource.goGetDatasource(goModule);\n }\n\n private static async goGetDatasource(\n goModule: string,\n ): Promise<DataSource | null> {\n const goModuleUrl = goModule.replace(regEx(/\\.git(?:\\/[a-z0-9/]*)?$/), '');\n const pkgUrl = `https://${goModuleUrl}?go-get=1`;\n const { body: html } = await BaseGoDatasource.http.getText(pkgUrl);\n\n const goSourceHeader = BaseGoDatasource.goSourceHeader(html, goModule);\n if (goSourceHeader) {\n return goSourceHeader;\n }\n\n // GitHub Enterprise only returns a go-import meta\n const goImport = BaseGoDatasource.goImportHeader(html, goModule);\n if (goImport) {\n return goImport;\n }\n\n logger.trace({ goModule }, 'No go-source or go-import header found');\n return null;\n }\n\n private static goSourceHeader(\n html: string,\n goModule: string,\n ): DataSource | null {\n const sourceMatchGroups = regEx(\n /<meta\\s+name=\"?go-source\"?\\s+content=\"(?<prefix>[^\"\\s]+)\\s+(?<goSourceUrl>[^\"\\s]+)/,\n ).exec(html)?.groups;\n if (!sourceMatchGroups) {\n return null;\n }\n const { prefix, goSourceUrl } = sourceMatchGroups;\n\n if (!goModule.startsWith(prefix)) {\n logger.trace({ goModule }, 'go-source header prefix not match');\n return null;\n }\n\n logger.debug(`Go lookup source url ${goSourceUrl} for module ${goModule}`);\n return this.detectDatasource(goSourceUrl, goModule);\n }\n\n private static detectDatasource(\n metadataUrl: string,\n goModule: string,\n ): DataSource | null {\n if (metadataUrl.startsWith('https://github.com/')) {\n return {\n datasource: GithubTagsDatasource.id,\n packageName: metadataUrl\n .replace('https://github.com/', '')\n .replace(regEx(/\\/$/), ''),\n registryUrl: 'https://github.com',\n };\n }\n\n const gitlabModuleName =\n BaseGoDatasource.gitlabRegExp.exec(goModule)?.groups?.regExpPath;\n const vcsIndicatedModule =\n BaseGoDatasource.gitVcsRegexp.exec(goModule)?.groups?.module;\n\n const metadataUrlMatchGroups =\n BaseGoDatasource.gitlabHttpsRegExp.exec(metadataUrl)?.groups;\n if (metadataUrlMatchGroups) {\n const { httpsRegExpUrl, httpsRegExpName } = metadataUrlMatchGroups;\n\n let packageName = vcsIndicatedModule ?? gitlabModuleName;\n\n // Detect submodules in monorepos by comparing metadata path and module path\n if (!vcsIndicatedModule && httpsRegExpName && gitlabModuleName) {\n const metadataPath = httpsRegExpName;\n const modulePath = gitlabModuleName;\n\n if (modulePath.startsWith(`${metadataPath}/`)) {\n packageName = metadataPath;\n }\n }\n\n // If we still don't have a package name, fall back to the metadata URL path\n packageName = packageName ?? httpsRegExpName;\n\n return {\n datasource: GitlabTagsDatasource.id,\n registryUrl: httpsRegExpUrl,\n packageName,\n };\n }\n\n if (hostRules.hostType({ url: metadataUrl }) === 'gitlab') {\n const parsedUrl = parseUrl(metadataUrl);\n if (!parsedUrl) {\n logger.trace({ goModule }, 'Could not parse go-source URL');\n return null;\n }\n\n const endpoint = GlobalConfig.get('endpoint');\n const endpointPrefix = regEx(\n /https:\\/\\/[^/]+\\/(?<prefix>.*?\\/)(?:api\\/v4\\/?)?/,\n ).exec(endpoint)?.groups?.prefix;\n\n let packageName =\n // a .git path indicates a concrete git repository, which can be different from metadata returned by gitlab\n vcsIndicatedModule ?? trimLeadingSlash(parsedUrl.pathname);\n if (endpointPrefix && endpointPrefix !== 'api/') {\n packageName = packageName.replace(endpointPrefix, '');\n }\n\n const registryUrl = endpointPrefix\n ? endpoint.replace(regEx(/\\/api\\/v4\\/?$/), '/')\n : `${parsedUrl.protocol}//${parsedUrl.host}`;\n\n return {\n datasource: GitlabTagsDatasource.id,\n registryUrl,\n packageName,\n };\n }\n /* istanbul ignore next */\n return null;\n }\n\n private static goImportHeader(\n html: string,\n goModule: string,\n ): DataSource | null {\n const importMatchGroups = regEx(\n /<meta\\s+name=\"?go-import\"?\\s+content=\"(?<prefix>[^\"\\s]+)\\s+(?<proto>[^\"\\s]+)\\s+(?<goImportURL>[^\"\\s]+)/,\n ).exec(html)?.groups;\n if (!importMatchGroups) {\n logger.trace({ goModule }, 'No go-source or go-import header found');\n return null;\n }\n const { prefix, proto, goImportURL } = importMatchGroups;\n\n if (!goModule.startsWith(prefix)) {\n logger.trace({ goModule }, 'go-import header prefix not match');\n return null;\n }\n\n if (proto !== 'git') {\n logger.trace({ goModule }, 'go-import header proto not git');\n return null;\n }\n\n // get server base url from import url\n const parsedUrl = parseUrl(goImportURL);\n if (!parsedUrl) {\n logger.trace({ goModule }, 'Could not parse go-import URL');\n return null;\n }\n\n logger.debug(`Go module: ${goModule} lookup import url ${goImportURL}`);\n\n const datasource = this.detectDatasource(\n goImportURL.replace(regEx(/\\.git$/), ''),\n goModule,\n );\n if (datasource !== null) {\n return datasource;\n }\n // fall back to old behavior if detection did not work\n\n switch (detectPlatform(goImportURL)) {\n case 'github': {\n // split the go module from the URL: host/go/module -> go/module\n // TODO: `parsedUrl.pathname` can be undefined\n const packageName = trimTrailingSlash(`${parsedUrl.pathname}`)\n .replace(regEx(/\\.git$/), '')\n .split('/')\n .slice(-2)\n .join('/');\n\n return {\n datasource: GithubTagsDatasource.id,\n registryUrl: `${parsedUrl.protocol}//${parsedUrl.host}`,\n packageName,\n };\n }\n case 'azure': {\n return {\n datasource: GitTagsDatasource.id,\n packageName: goImportURL.replace(regEx(/\\.git$/), ''),\n };\n }\n default: {\n return {\n datasource: GitTagsDatasource.id,\n packageName: goImportURL,\n };\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,IAAa,mBAAb,MAAa,iBAAiB;CAC5B,OAAwB,oBAAoB,MAC1C,2FACF;CACA,OAAwB,eAAe,MACrC,kEACF;CACA,OAAwB,eAAe,MACrC,wCACF;CAEA,OAAwB,KAAK;CAC7B,OAAwB,OAAO,IAAI,KAAK,iBAAiB,EAAE;CAE3D,aAAa,cAAc,UAA8C;EACvE,IAAI,SAAS,WAAW,WAAW,GAAG;GACpC,MAAM,CAAC,OAAO,SAAS,QAAQ,aAAa,EAAE,CAAC,CAAC,MAAM,GAAG;GACzD,MAAM,cAAc,IAAI,SAAS,GAAG,IAAI,MAAM,MAAM,IAAI,GAAG;GAC3D,OAAO;IACL,YAAY,qBAAqB;IACjC;IACA,aAAa;GACf;EACF;EAEA,IAAI,SAAS,WAAW,aAAa,GAAG;GACtC,MAAM,QAAQ,SAAS,MAAM,GAAG;GAChC,MAAM,cAAc,GAAG,MAAM,GAAG,GAAG,MAAM;GACzC,OAAO;IACL,YAAY,qBAAqB;IACjC;IACA,aAAa;GACf;EACF;EAEA,IAAI,SAAS,WAAW,gBAAgB,GAAG;GACzC,MAAM,QAAQ,SAAS,MAAM,GAAG;GAChC,MAAM,cAAc,GAAG,MAAM,GAAG,GAAG,MAAM;GACzC,OAAO;IACL,YAAY,wBAAwB;IACpC;IACA,aAAa;GACf;EACF;EAEA,IAAI,SAAS,WAAW,wBAAwB,GAAG;GACjD,MAAM,cAAc,SAAS,QAC3B,yBACA,cACF;GACA,OAAO;IACL,YAAY,qBAAqB;IACjC;IACA,aAAa;GACf;EACF;EAEA,IAAI,SAAS,WAAW,gBAAgB,GAAG;GACzC,MAAM,QAAQ,SAAS,MAAM,GAAG;GAChC,IAAK,MAAM,SAAS,KAAK,MAAM,OAAO,UAAW,MAAM,SAAS,GAAG;IACjE,MAAM,cAAc,yBAAyB,MAAM,GAAG,GAAG,MAAM,GAAG,SAAS,MAAM,OAAO,SAAS,MAAM,KAAK,MAAM,GAAA,CAAI,QAAQ,MAAM,QAAQ,GAAG,EAAE;IACjJ,OAAO;KACL,YAAY,kBAAkB;KAC9B;IACF;GACF;EACF;EAGA,IAAI,SAAS,WAAW,YAAY,GAAG;GACrC,MAAM,QAAQ,SAAS,MAAM,GAAG;GAChC,MAAM,cAAc,GAAG,MAAM,GAAG,GAAG,MAAM;GACzC,OAAO;IACL,YAAY,oBAAoB;IAChC;IACA,aAAa;GACf;EACF;EAEA,IAAI,SAAS,WAAW,mBAAmB,GAAG;GAC5C,MAAM,QAAQ,SAAS,MAAM,GAAG;GAChC,MAAM,cAAc,GAAG,MAAM,GAAG,GAAG,MAAM;GACzC,OAAO;IACL,YAAY,sBAAsB;IAClC;IACA,aAAa;GACf;EACF;EAEA,IAAI,SAAS,WAAW,eAAe,GAAG;GACxC,MAAM,QAAQ,SAAS,MAAM,GAAG;GAChC,MAAM,cAAc,GAAG,MAAM,GAAG,GAAG,MAAM;GACzC,OAAO;IACL,YAAY,sBAAsB;IAClC;IACA,aAAa;GACf;EACF;EAGA,OAAO,MAAM,iBAAiB,gBAAgB,QAAQ;CACxD;CAEA,aAAqB,gBACnB,UAC4B;EAE5B,MAAM,SAAS,WADK,SAAS,QAAQ,MAAM,yBAAyB,GAAG,EACnC,EAAE;EACtC,MAAM,EAAE,MAAM,SAAS,MAAM,iBAAiB,KAAK,QAAQ,MAAM;EAEjE,MAAM,iBAAiB,iBAAiB,eAAe,MAAM,QAAQ;EACrE,IAAI,gBACF,OAAO;EAIT,MAAM,WAAW,iBAAiB,eAAe,MAAM,QAAQ;EAC/D,IAAI,UACF,OAAO;EAGT,OAAO,MAAM,EAAE,SAAS,GAAG,wCAAwC;EACnE,OAAO;CACT;CAEA,OAAe,eACb,MACA,UACmB;EACnB,MAAM,oBAAoB,MACxB,oFACF,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;EACd,IAAI,CAAC,mBACH,OAAO;EAET,MAAM,EAAE,QAAQ,gBAAgB;EAEhC,IAAI,CAAC,SAAS,WAAW,MAAM,GAAG;GAChC,OAAO,MAAM,EAAE,SAAS,GAAG,mCAAmC;GAC9D,OAAO;EACT;EAEA,OAAO,MAAM,wBAAwB,YAAY,cAAc,UAAU;EACzE,OAAO,KAAK,iBAAiB,aAAa,QAAQ;CACpD;CAEA,OAAe,iBACb,aACA,UACmB;EACnB,IAAI,YAAY,WAAW,qBAAqB,GAC9C,OAAO;GACL,YAAY,qBAAqB;GACjC,aAAa,YACV,QAAQ,uBAAuB,EAAE,CAAC,CAClC,QAAQ,MAAM,KAAK,GAAG,EAAE;GAC3B,aAAa;EACf;EAGF,MAAM,mBACJ,iBAAiB,aAAa,KAAK,QAAQ,CAAC,EAAE,QAAQ;EACxD,MAAM,qBACJ,iBAAiB,aAAa,KAAK,QAAQ,CAAC,EAAE,QAAQ;EAExD,MAAM,yBACJ,iBAAiB,kBAAkB,KAAK,WAAW,CAAC,EAAE;EACxD,IAAI,wBAAwB;GAC1B,MAAM,EAAE,gBAAgB,oBAAoB;GAE5C,IAAI,cAAc,sBAAsB;GAGxC,IAAI,CAAC,sBAAsB,mBAAmB,kBAAkB;IAC9D,MAAM,eAAe;IAGrB,IAAIA,iBAAW,WAAW,GAAG,aAAa,EAAE,GAC1C,cAAc;GAElB;GAGA,cAAc,eAAe;GAE7B,OAAO;IACL,YAAY,qBAAqB;IACjC,aAAa;IACb;GACF;EACF;EAEA,IAAIC,SAAmB,EAAE,KAAK,YAAY,CAAC,MAAM,UAAU;GACzD,MAAM,YAAY,SAAS,WAAW;GACtC,IAAI,CAAC,WAAW;IACd,OAAO,MAAM,EAAE,SAAS,GAAG,+BAA+B;IAC1D,OAAO;GACT;GAEA,MAAM,WAAW,aAAa,IAAI,UAAU;GAC5C,MAAM,iBAAiB,MACrB,kDACF,CAAC,CAAC,KAAK,QAAQ,CAAC,EAAE,QAAQ;GAE1B,IAAI,cAEF,sBAAsB,iBAAiB,UAAU,QAAQ;GAC3D,IAAI,kBAAkB,mBAAmB,QACvC,cAAc,YAAY,QAAQ,gBAAgB,EAAE;GAGtD,MAAM,cAAc,iBAChB,SAAS,QAAQ,MAAM,eAAe,GAAG,GAAG,IAC5C,GAAG,UAAU,SAAS,IAAI,UAAU;GAExC,OAAO;IACL,YAAY,qBAAqB;IACjC;IACA;GACF;EACF;;EAEA,OAAO;CACT;CAEA,OAAe,eACb,MACA,UACmB;EACnB,MAAM,oBAAoB,MACxB,wGACF,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;EACd,IAAI,CAAC,mBAAmB;GACtB,OAAO,MAAM,EAAE,SAAS,GAAG,wCAAwC;GACnE,OAAO;EACT;EACA,MAAM,EAAE,QAAQ,OAAO,gBAAgB;EAEvC,IAAI,CAAC,SAAS,WAAW,MAAM,GAAG;GAChC,OAAO,MAAM,EAAE,SAAS,GAAG,mCAAmC;GAC9D,OAAO;EACT;EAEA,IAAI,UAAU,OAAO;GACnB,OAAO,MAAM,EAAE,SAAS,GAAG,gCAAgC;GAC3D,OAAO;EACT;EAGA,MAAM,YAAY,SAAS,WAAW;EACtC,IAAI,CAAC,WAAW;GACd,OAAO,MAAM,EAAE,SAAS,GAAG,+BAA+B;GAC1D,OAAO;EACT;EAEA,OAAO,MAAM,cAAc,SAAS,qBAAqB,aAAa;EAEtE,MAAM,aAAa,KAAK,iBACtB,YAAY,QAAQ,MAAM,QAAQ,GAAG,EAAE,GACvC,QACF;EACA,IAAI,eAAe,MACjB,OAAO;EAIT,QAAQ,eAAe,WAAW,GAAlC;GACE,KAAK,UAAU;IAGb,MAAM,cAAc,kBAAkB,GAAG,UAAU,UAAU,CAAC,CAC3D,QAAQ,MAAM,QAAQ,GAAG,EAAE,CAAC,CAC5B,MAAM,GAAG,CAAC,CACV,MAAM,EAAE,CAAC,CACT,KAAK,GAAG;IAEX,OAAO;KACL,YAAY,qBAAqB;KACjC,aAAa,GAAG,UAAU,SAAS,IAAI,UAAU;KACjD;IACF;GACF;GACA,KAAK,SACH,OAAO;IACL,YAAY,kBAAkB;IAC9B,aAAa,YAAY,QAAQ,MAAM,QAAQ,GAAG,EAAE;GACtD;GAEF,SACE,OAAO;IACL,YAAY,kBAAkB;IAC9B,aAAa;GACf;EAEJ;CACF;AACF"}
@@ -22,7 +22,7 @@ function parseGoproxy(input = getEnv().GOPROXY) {
22
22
  const cacheKey = `goproxy::${input}`;
23
23
  const cachedResult = get(cacheKey);
24
24
  if (cachedResult) return cachedResult;
25
- const result = input.split(regEx(/([^,|]*(?:,|\|))/)).filter(isTruthy).map((s) => s.split(regEx(/(,|\|)/))).filter(([url]) => isTruthy(url)).map(([url, separator]) => ({
25
+ const result = input.split(regEx(/(?<segment>[^,|]*(?:,|\|))/)).filter(isTruthy).map((s) => s.split(regEx(/(?<separator>,|\|)/))).filter(([url]) => isTruthy(url)).map(([url, separator]) => ({
26
26
  url,
27
27
  fallback: separator === "," ? "," : "|"
28
28
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"goproxy-parser.js","names":["memCache.get"],"sources":["../../../../lib/modules/datasource/go/goproxy-parser.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport moo from 'moo';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { GoproxyItem } from './types.ts';\n\n/**\n * Parse `GOPROXY` to the sequence of url + fallback strategy tags.\n *\n * @example\n * parseGoproxy('foo.example.com|bar.example.com,baz.example.com')\n * // [\n * // { url: 'foo.example.com', fallback: '|' },\n * // { url: 'bar.example.com', fallback: ',' },\n * // { url: 'baz.example.com', fallback: '|' },\n * // ]\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\nexport function parseGoproxy(\n input: string | undefined = getEnv().GOPROXY,\n): GoproxyItem[] {\n if (!isString(input)) {\n return [];\n }\n\n const cacheKey = `goproxy::${input}`;\n const cachedResult = memCache.get<GoproxyItem[]>(cacheKey);\n if (cachedResult) {\n return cachedResult;\n }\n\n const result: GoproxyItem[] = input\n .split(regEx(/([^,|]*(?:,|\\|))/))\n .filter(isTruthy)\n .map((s) => s.split(regEx(/(,|\\|)/)))\n // Empty segments (`a||b`, `,a`) carry no url to query, and keeping them\n // would apply their separator as the fallback strategy for a bogus request\n .filter(([url]) => isTruthy(url))\n .map(([url, separator]) => ({\n url,\n fallback: separator === ',' ? ',' : '|',\n }));\n\n memCache.set(cacheKey, result);\n return result;\n}\n\n// https://golang.org/pkg/path/#Match\n/* oxlint-disable renovate/require-regex-util -- moo lexer patterns must be native RegExp: moo recompiles their source with the native engine and rejects RE2 instances (TODO #12870) */\nconst noproxyLexer = moo.states({\n main: {\n separator: {\n match: /\\s*?,\\s*?/, // TODO #12870\n value: (_: string) => '|',\n },\n asterisk: {\n match: '*',\n value: (_: string) => '[^/]*',\n },\n qmark: {\n match: '?',\n value: (_: string) => '[^/]',\n },\n characterRangeOpen: {\n match: '[',\n push: 'characterRange',\n value: (_: string) => '[',\n },\n trailingSlash: {\n match: /\\/$/,\n value: (_: string) => '',\n },\n char: {\n match: /[^*?\\\\[\\n]/,\n value: (s: string) => s.replace(regEx('\\\\.', 'g'), '\\\\.'),\n },\n escapedChar: {\n match: /\\\\./, // TODO #12870\n value: (s: string) => s.slice(1),\n },\n },\n characterRange: {\n char: /[^\\\\\\]\\n]/, // TODO #12870\n escapedChar: {\n match: /\\\\./, // TODO #12870\n value: (s: string) => s.slice(1),\n },\n characterRangeEnd: {\n match: ']',\n pop: 1,\n },\n },\n});\n/* oxlint-enable renovate/require-regex-util */\n\nexport function parseNoproxy(\n input: unknown = (() => {\n const env = getEnv();\n return env.GONOPROXY ?? env.GOPRIVATE;\n })(),\n): RegExp | null {\n if (!isString(input)) {\n return null;\n }\n\n const cacheKey = `noproxy::${input}`;\n const cachedResult = memCache.get<RegExp | null>(cacheKey);\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n const noproxyPattern = [...noproxyLexer.reset(input)]\n .map(({ value }) => value)\n .join('');\n\n const result = noproxyPattern\n ? regEx(`^(?:${noproxyPattern})(?:/.*)?$`)\n : null;\n\n memCache.set(cacheKey, result);\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,aACd,QAA4B,OAAO,CAAC,CAAC,SACtB;CACf,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO,CAAC;CAGV,MAAM,WAAW,YAAY;CAC7B,MAAM,eAAeA,IAA4B,QAAQ;CACzD,IAAI,cACF,OAAO;CAGT,MAAM,SAAwB,MAC3B,MAAM,MAAM,kBAAkB,CAAC,CAAC,CAChC,OAAO,QAAQ,CAAC,CAChB,KAAK,MAAM,EAAE,MAAM,MAAM,QAAQ,CAAC,CAAC,CAAC,CAGpC,QAAQ,CAAC,SAAS,SAAS,GAAG,CAAC,CAAC,CAChC,KAAK,CAAC,KAAK,gBAAgB;EAC1B;EACA,UAAU,cAAc,MAAM,MAAM;CACtC,EAAE;CAEJ,IAAa,UAAU,MAAM;CAC7B,OAAO;AACT;AAIA,MAAM,eAAe,IAAI,OAAO;CAC9B,MAAM;EACJ,WAAW;GACT,OAAO;GACP,QAAQ,MAAc;EACxB;EACA,UAAU;GACR,OAAO;GACP,QAAQ,MAAc;EACxB;EACA,OAAO;GACL,OAAO;GACP,QAAQ,MAAc;EACxB;EACA,oBAAoB;GAClB,OAAO;GACP,MAAM;GACN,QAAQ,MAAc;EACxB;EACA,eAAe;GACb,OAAO;GACP,QAAQ,MAAc;EACxB;EACA,MAAM;GACJ,OAAO;GACP,QAAQ,MAAc,EAAE,QAAQ,MAAM,OAAO,GAAG,GAAG,KAAK;EAC1D;EACA,aAAa;GACX,OAAO;GACP,QAAQ,MAAc,EAAE,MAAM,CAAC;EACjC;CACF;CACA,gBAAgB;EACd,MAAM;EACN,aAAa;GACX,OAAO;GACP,QAAQ,MAAc,EAAE,MAAM,CAAC;EACjC;EACA,mBAAmB;GACjB,OAAO;GACP,KAAK;EACP;CACF;AACF,CAAC;AAGD,SAAgB,aACd,eAAwB;CACtB,MAAM,MAAM,OAAO;CACnB,OAAO,IAAI,aAAa,IAAI;AAC9B,EAAA,CAAG,GACY;CACf,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO;CAGT,MAAM,WAAW,YAAY;CAC7B,MAAM,eAAeA,IAA4B,QAAQ;CACzD,IAAI,iBAAiB,KAAA,GACnB,OAAO;CAGT,MAAM,iBAAiB,CAAC,GAAG,aAAa,MAAM,KAAK,CAAC,CAAC,CAClD,KAAK,EAAE,YAAY,KAAK,CAAC,CACzB,KAAK,EAAE;CAEV,MAAM,SAAS,iBACX,MAAM,OAAO,eAAe,WAAW,IACvC;CAEJ,IAAa,UAAU,MAAM;CAC7B,OAAO;AACT"}
1
+ {"version":3,"file":"goproxy-parser.js","names":["memCache.get"],"sources":["../../../../lib/modules/datasource/go/goproxy-parser.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport moo from 'moo';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { GoproxyItem } from './types.ts';\n\n/**\n * Parse `GOPROXY` to the sequence of url + fallback strategy tags.\n *\n * @example\n * parseGoproxy('foo.example.com|bar.example.com,baz.example.com')\n * // [\n * // { url: 'foo.example.com', fallback: '|' },\n * // { url: 'bar.example.com', fallback: ',' },\n * // { url: 'baz.example.com', fallback: '|' },\n * // ]\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\nexport function parseGoproxy(\n input: string | undefined = getEnv().GOPROXY,\n): GoproxyItem[] {\n if (!isString(input)) {\n return [];\n }\n\n const cacheKey = `goproxy::${input}`;\n const cachedResult = memCache.get<GoproxyItem[]>(cacheKey);\n if (cachedResult) {\n return cachedResult;\n }\n\n const result: GoproxyItem[] = input\n .split(regEx(/(?<segment>[^,|]*(?:,|\\|))/))\n .filter(isTruthy)\n .map((s) => s.split(regEx(/(?<separator>,|\\|)/)))\n // Empty segments (`a||b`, `,a`) carry no url to query, and keeping them\n // would apply their separator as the fallback strategy for a bogus request\n .filter(([url]) => isTruthy(url))\n .map(([url, separator]) => ({\n url,\n fallback: separator === ',' ? ',' : '|',\n }));\n\n memCache.set(cacheKey, result);\n return result;\n}\n\n// https://golang.org/pkg/path/#Match\n/* oxlint-disable renovate/require-regex-util -- moo lexer patterns must be native RegExp: moo recompiles their source with the native engine and rejects RE2 instances (TODO #12870) */\nconst noproxyLexer = moo.states({\n main: {\n separator: {\n match: /\\s*?,\\s*?/, // TODO #12870\n value: (_: string) => '|',\n },\n asterisk: {\n match: '*',\n value: (_: string) => '[^/]*',\n },\n qmark: {\n match: '?',\n value: (_: string) => '[^/]',\n },\n characterRangeOpen: {\n match: '[',\n push: 'characterRange',\n value: (_: string) => '[',\n },\n trailingSlash: {\n match: /\\/$/,\n value: (_: string) => '',\n },\n char: {\n match: /[^*?\\\\[\\n]/,\n value: (s: string) => s.replace(regEx('\\\\.', 'g'), '\\\\.'),\n },\n escapedChar: {\n match: /\\\\./, // TODO #12870\n value: (s: string) => s.slice(1),\n },\n },\n characterRange: {\n char: /[^\\\\\\]\\n]/, // TODO #12870\n escapedChar: {\n match: /\\\\./, // TODO #12870\n value: (s: string) => s.slice(1),\n },\n characterRangeEnd: {\n match: ']',\n pop: 1,\n },\n },\n});\n/* oxlint-enable renovate/require-regex-util */\n\nexport function parseNoproxy(\n input: unknown = (() => {\n const env = getEnv();\n return env.GONOPROXY ?? env.GOPRIVATE;\n })(),\n): RegExp | null {\n if (!isString(input)) {\n return null;\n }\n\n const cacheKey = `noproxy::${input}`;\n const cachedResult = memCache.get<RegExp | null>(cacheKey);\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n const noproxyPattern = [...noproxyLexer.reset(input)]\n .map(({ value }) => value)\n .join('');\n\n const result = noproxyPattern\n ? regEx(`^(?:${noproxyPattern})(?:/.*)?$`)\n : null;\n\n memCache.set(cacheKey, result);\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,aACd,QAA4B,OAAO,CAAC,CAAC,SACtB;CACf,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO,CAAC;CAGV,MAAM,WAAW,YAAY;CAC7B,MAAM,eAAeA,IAA4B,QAAQ;CACzD,IAAI,cACF,OAAO;CAGT,MAAM,SAAwB,MAC3B,MAAM,MAAM,4BAA4B,CAAC,CAAC,CAC1C,OAAO,QAAQ,CAAC,CAChB,KAAK,MAAM,EAAE,MAAM,MAAM,oBAAoB,CAAC,CAAC,CAAC,CAGhD,QAAQ,CAAC,SAAS,SAAS,GAAG,CAAC,CAAC,CAChC,KAAK,CAAC,KAAK,gBAAgB;EAC1B;EACA,UAAU,cAAc,MAAM,MAAM;CACtC,EAAE;CAEJ,IAAa,UAAU,MAAM;CAC7B,OAAO;AACT;AAIA,MAAM,eAAe,IAAI,OAAO;CAC9B,MAAM;EACJ,WAAW;GACT,OAAO;GACP,QAAQ,MAAc;EACxB;EACA,UAAU;GACR,OAAO;GACP,QAAQ,MAAc;EACxB;EACA,OAAO;GACL,OAAO;GACP,QAAQ,MAAc;EACxB;EACA,oBAAoB;GAClB,OAAO;GACP,MAAM;GACN,QAAQ,MAAc;EACxB;EACA,eAAe;GACb,OAAO;GACP,QAAQ,MAAc;EACxB;EACA,MAAM;GACJ,OAAO;GACP,QAAQ,MAAc,EAAE,QAAQ,MAAM,OAAO,GAAG,GAAG,KAAK;EAC1D;EACA,aAAa;GACX,OAAO;GACP,QAAQ,MAAc,EAAE,MAAM,CAAC;EACjC;CACF;CACA,gBAAgB;EACd,MAAM;EACN,aAAa;GACX,OAAO;GACP,QAAQ,MAAc,EAAE,MAAM,CAAC;EACjC;EACA,mBAAmB;GACjB,OAAO;GACP,KAAK;EACP;CACF;AACF,CAAC;AAGD,SAAgB,aACd,eAAwB;CACtB,MAAM,MAAM,OAAO;CACnB,OAAO,IAAI,aAAa,IAAI;AAC9B,EAAA,CAAG,GACY;CACf,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO;CAGT,MAAM,WAAW,YAAY;CAC7B,MAAM,eAAeA,IAA4B,QAAQ;CACzD,IAAI,iBAAiB,KAAA,GACnB,OAAO;CAGT,MAAM,iBAAiB,CAAC,GAAG,aAAa,MAAM,KAAK,CAAC,CAAC,CAClD,KAAK,EAAE,YAAY,KAAK,CAAC,CACzB,KAAK,EAAE;CAEV,MAAM,SAAS,iBACX,MAAM,OAAO,eAAe,WAAW,IACvC;CAEJ,IAAa,UAAU,MAAM;CAC7B,OAAO;AACT"}
@@ -158,7 +158,7 @@ var GoProxyDatasource = class GoProxyDatasource extends Datasource {
158
158
  * @see https://golang.org/ref/mod#goproxy-protocol
159
159
  */
160
160
  encodeCase(input) {
161
- return input.replace(regEx(/([A-Z])/g), (x) => `!${x.toLowerCase()}`);
161
+ return input.replace(regEx(/(?:[A-Z])/g), (x) => `!${x.toLowerCase()}`);
162
162
  }
163
163
  async listVersions(baseUrl, packageName) {
164
164
  const url = joinUrlParts(baseUrl, this.encodeCase(packageName), "@v", "list");
@@ -1 +1 @@
1
- {"version":3,"file":"releases-goproxy.js","names":["p.map","HttpError","goVersioning"],"sources":["../../../../lib/modules/datasource/go/releases-goproxy.ts"],"sourcesContent":["import {\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isTruthy,\n} from '@sindresorhus/is';\nimport type { ConstraintsFilter } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { queryReleases } from '../../../util/github/graphql/index.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport {\n joinUrlParts,\n parseUrl,\n trimLeadingSlash,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport goVersioning from '../../versioning/go-mod-directive/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport { GithubReleasesDatasource } from '../github-releases/index.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BaseGoDatasource } from './base.ts';\nimport { getSourceUrl } from './common.ts';\nimport { parseGoproxy, parseNoproxy } from './goproxy-parser.ts';\nimport { GoDirectDatasource } from './releases-direct.ts';\nimport { VersionInfo } from './schema.ts';\n\n/** TODO #42566 */\nconst goVersionRegex = regEx(/^\\s*go\\s+(?<version>[^\\s]+)\\s*$/);\n\nconst modRegex = regEx(/^(?<baseMod>.*?)(?:[./]v(?<majorVersion>\\d+))?$/);\n\nconst versionTagRegex = regEx(/^v\\d/);\n\n/**\n * Modules with a major version of v2 or above which have no `go.mod` are reported by a Go proxy with a `+incompatible` suffix, which is absent from the tag they were published as.\n *\n * @see https://go.dev/ref/mod#non-module-compat\n */\nconst incompatibleSuffixRegex = regEx(/\\+incompatible$/);\n\n/**\n * @see https://go.dev/ref/mod#pseudo-versions\n */\nconst pseudoVersionRegex = regEx(\n /v\\d+\\.\\d+\\.\\d+-(?:\\w+\\.)?(?:0\\.)?(?<timestamp>\\d{14})-(?<digest>[a-f0-9]{12})/i,\n);\n\nexport function pseudoVersionToRelease(pseudoVersion: string): Release | null {\n const match = pseudoVersion.match(pseudoVersionRegex)?.groups;\n if (!match) {\n return null;\n }\n\n const { digest: newDigest, timestamp } = match;\n const releaseTimestamp = asTimestamp(timestamp);\n\n return {\n version: pseudoVersion,\n newDigest,\n releaseTimestamp,\n };\n}\n\n/**\n * A Go module which lives in a subdirectory of its repository is tagged with that subdirectory as a prefix, so `github.com/aws/aws-sdk-go-v2/service/s3` publishes `v1.2.3` as the tag `service/s3/v1.2.3`.\n *\n * @see https://go.dev/ref/mod#vcs-version\n *\n * Because we can't tell from the module path alone where the repository ends and the subdirectory begins, we try each candidate prefix - longest first - against the tags we actually found, in the same way as `filterByPrefix` does for direct lookups.\n */\nexport function getTagPrefix(goModule: string, tags: Iterable<string>): string {\n const nameParts = goModule\n .replace(regEx(/\\/v\\d+$/), '')\n .split('/')\n .slice(1);\n const tagNames = [...tags];\n\n while (nameParts.length) {\n const prefix = `${nameParts.join('/')}/`;\n\n const isUsed = tagNames.some(\n (tag) =>\n tag.startsWith(prefix) &&\n versionTagRegex.test(tag.slice(prefix.length)),\n );\n if (isUsed) {\n return prefix;\n }\n\n nameParts.shift();\n }\n\n return '';\n}\n\nexport class GoProxyDatasource extends Datasource {\n static readonly id = 'go-proxy';\n\n constructor() {\n super(GoProxyDatasource.id);\n }\n\n readonly direct = new GoDirectDatasource();\n\n private readonly githubHttp = new GithubHttp(GithubReleasesDatasource.id);\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName } = config;\n logger.trace(`goproxy.getReleases(${packageName})`);\n const goproxy = getEnv().GOPROXY ?? 'https://proxy.golang.org,direct';\n if (goproxy === 'direct') {\n return this.direct.getReleases(config);\n }\n const proxyList = parseGoproxy(goproxy);\n const noproxy = parseNoproxy();\n\n let result: ReleaseResult | null = null;\n let servedByProxy = false;\n\n if (noproxy?.test(packageName)) {\n logger.debug(`Fetching ${packageName} via GONOPROXY match`);\n result = await this.direct.getReleases(config);\n return result;\n }\n\n for (const { url, fallback } of proxyList) {\n try {\n if (url === 'off') {\n break;\n } else if (url === 'direct') {\n result = await this.direct.getReleases(config);\n break;\n }\n\n const res = await this.getVersionsWithInfo(\n url,\n packageName,\n config.constraintsFiltering,\n );\n if (res.releases.length) {\n result = res;\n servedByProxy = true;\n break;\n }\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const statusCode = potentialHttpError?.response?.statusCode;\n const canFallback =\n fallback === '|' ? true : statusCode === 404 || statusCode === 410;\n if (!canFallback) {\n logger.debug(\n { err },\n 'Goproxy error: not falling back to other URLs provided with GOPROXY, rethrowing',\n );\n this.handleGenericErrors(err);\n }\n logger.debug(\n { err },\n 'Goproxy error: trying next URL provided with GOPROXY',\n );\n }\n }\n\n if (result && !result.sourceUrl) {\n try {\n const datasource = await BaseGoDatasource.getDatasource(packageName);\n const sourceUrl = getSourceUrl(datasource);\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n } catch (err) {\n logger.trace({ err }, `Can't get datasource for ${packageName}`);\n }\n }\n\n if (result?.sourceUrl && servedByProxy) {\n await this.addGithubReleaseTimestamps(\n packageName,\n result.sourceUrl,\n result.releases,\n );\n }\n\n return result;\n }\n\n /**\n * A Go proxy reports the commit time of the tagged commit as a version's `Time`, which can be much earlier than the point at which that version was released.\n *\n * When the module is hosted on GitHub and the version has a GitHub Release, the Release's publication time is a better indicator of when the version became available.\n */\n async addGithubReleaseTimestamps(\n packageName: string,\n sourceUrl: string,\n releases: Release[],\n ): Promise<void> {\n if (detectPlatform(sourceUrl) !== 'github') {\n return;\n }\n\n const parsedUrl = parseUrl(sourceUrl);\n /* v8 ignore next -- detectPlatform only returns a platform for parseable URLs */\n if (!parsedUrl) {\n return;\n }\n\n const repository = trimTrailingSlash(\n trimLeadingSlash(parsedUrl.pathname),\n ).replace(regEx(/\\.git$/), '');\n\n try {\n const githubReleases = await queryReleases(\n {\n packageName: repository,\n registryUrl: parsedUrl.origin,\n },\n this.githubHttp,\n );\n\n const timestamps = new Map<string, Timestamp>();\n for (const { version, releaseTimestamp } of githubReleases) {\n timestamps.set(version, releaseTimestamp);\n }\n\n const tagPrefix = getTagPrefix(packageName, timestamps.keys());\n for (const release of releases) {\n const version = release.version.replace(incompatibleSuffixRegex, '');\n const releaseTimestamp = timestamps.get(`${tagPrefix}${version}`);\n if (\n releaseTimestamp &&\n (!release.releaseTimestamp ||\n releaseTimestamp > release.releaseTimestamp)\n ) {\n release.releaseTimestamp = releaseTimestamp;\n }\n }\n } catch (err) {\n logger.debug(\n { err, packageName },\n 'Error fetching GitHub Releases for Go module',\n );\n }\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Avoid ambiguity when serving from case-insensitive file systems.\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\n encodeCase(input: string): string {\n return input.replace(regEx(/([A-Z])/g), (x) => `!${x.toLowerCase()}`);\n }\n\n async listVersions(baseUrl: string, packageName: string): Promise<Release[]> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n 'list',\n );\n const { body } = await this.http.getText(url);\n return filterMap(body.split(newlineRegex), (str) => {\n if (!isNonEmptyStringAndNotWhitespace(str)) {\n return null;\n }\n\n const [version, timestamp] = str.trim().split(regEx(/\\s+/));\n const release: Release = pseudoVersionToRelease(version) ?? { version };\n\n const releaseTimestamp = asTimestamp(timestamp);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n return release;\n });\n }\n\n async versionInfo(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<Release> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.info`,\n );\n const res = await this.http.getJson(url, VersionInfo);\n\n const result: Release = {\n version: res.body.Version,\n };\n\n const releaseTimestamp = asTimestamp(res.body.Time);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n return result;\n }\n\n /**\n * Retrieve the `go` directive for a given Go Module.\n *\n * NOTE that this means the `go` directive, not the `toolchain` directive.\n */\n async retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getVersionedCacheKey(packageName, version),\n // a module's `go.mod` should /never/ change after it's published. If going via the Go Proxy and the Go Checksum Database, a change in this value will result in build failures.\n ttlMinutes: 100 * 24 * 60,\n },\n () => this._retrieveGoDirectiveForModule(baseUrl, packageName, version),\n );\n }\n\n async _retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.mod`,\n );\n const res = await this.http.getText(url);\n\n let goDirective: string | undefined = undefined;\n\n for (const line of res.body.split('\\n')) {\n const goVersionMatches = goVersionRegex.exec(line)?.groups;\n if (goVersionMatches) {\n goDirective = goVersionMatches.version;\n break;\n }\n }\n\n if (!goDirective) {\n return goDirective;\n }\n\n // always return it in full SemVer format, which can then be matched on using `semver` or `semver-coerced`\n const parts = goDirective.split('.');\n if (parts.length === 1) {\n return `${parts[0]}.0.0`;\n }\n if (parts.length === 2) {\n return `${parts[0]}.${parts[1]}.0`;\n }\n return `${parts[0]}.${parts[1]}.${parts[2]}`;\n }\n\n async getLatestVersion(\n baseUrl: string,\n packageName: string,\n ): Promise<{ version: string; sourceUrl?: string } | null> {\n try {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@latest',\n );\n const res = await this.http.getJson(url, VersionInfo);\n const { Version: version, Origin: origin } = res.body;\n // Extract sourceUrl from GOPROXY Origin when present, avoiding go-get to\n // vanity hosts (https://github.com/renovatebot/renovate/discussions/44898)\n const sourceUrl =\n origin?.VCS === 'git' && isNonEmptyString(origin.URL)\n ? origin.URL.replace(regEx(/\\.git$/), '')\n : undefined;\n return { version, sourceUrl };\n } catch (err) {\n logger.trace({ err }, 'Failed to get latest version');\n return null;\n }\n }\n\n async getVersionsWithInfo(\n baseUrl: string,\n packageName: string,\n constraintsFiltering: ConstraintsFilter | undefined,\n ): Promise<ReleaseResult> {\n const isGopkgin = packageName.startsWith('gopkg.in/');\n const majorSuffixSeparator = isGopkgin ? '.' : '/';\n const modParts = packageName.match(modRegex)?.groups;\n const baseMod =\n modParts?.baseMod ??\n /* v8 ignore next -- defensive: modRegex matches any non-empty package name, so baseMod is always set */ packageName;\n const packageMajor = parseInt(modParts?.majorVersion ?? '0', 10);\n\n const result: ReleaseResult = { releases: [] };\n for (let major = packageMajor; ; major += 1) {\n let pkg = `${baseMod}${majorSuffixSeparator}v${major}`;\n if (!isGopkgin && major < 2) {\n pkg = baseMod;\n major += 1; // v0 and v1 are the same module\n }\n\n let releases: Release[] = [];\n\n try {\n const res = await this.listVersions(baseUrl, pkg);\n\n // Artifactory returns all versions in any major (past and future),\n // so starting from v2, we filter them in order to avoid the infinite loop\n const filteredReleases = res.filter(({ version }) => {\n if (major < 2) {\n return true;\n }\n\n return (\n version.split(regEx(/[^\\d]+/)).find(isTruthy) === major.toString()\n );\n });\n\n releases = await p.map(filteredReleases, async (versionInfo) => {\n const { version, newDigest, releaseTimestamp } = versionInfo;\n\n if (releaseTimestamp) {\n return { version, newDigest, releaseTimestamp };\n }\n\n try {\n return await this.versionInfo(baseUrl, pkg, version);\n } catch (err) {\n logger.trace({ err }, `Can't obtain data from ${baseUrl}`);\n return { version };\n }\n });\n\n if (constraintsFiltering === 'strict') {\n releases = await p.map(releases, async (rel) => {\n try {\n const goDirective = await this.retrieveGoDirectiveForModule(\n baseUrl,\n pkg,\n rel.version,\n );\n if (goDirective) {\n rel.constraints ??= {};\n rel.constraints['%goMod'] ??= [];\n rel.constraints['%goMod'].push(goDirective);\n }\n } catch (err) {\n logger.trace(\n { err },\n `Can't obtain \\`go\\` directive from ${baseUrl}`,\n );\n }\n\n return rel;\n });\n }\n\n result.releases.push(...releases);\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const status = potentialHttpError.response?.statusCode;\n if (\n potentialHttpError instanceof HttpError &&\n (status === 404 || status === 403) &&\n major !== packageMajor\n ) {\n break;\n }\n\n throw err;\n }\n\n const latest = await this.getLatestVersion(baseUrl, pkg);\n if (latest) {\n const { version: latestVersion, sourceUrl } = latest;\n result.tags ??= {};\n result.tags.latest ??= latestVersion;\n if (goVersioning.isGreaterThan(latestVersion, result.tags.latest)) {\n result.tags.latest = latestVersion;\n }\n if (sourceUrl) {\n result.sourceUrl ??= sourceUrl;\n }\n if (!result.releases.length) {\n const releaseFromLatest = pseudoVersionToRelease(latestVersion);\n if (releaseFromLatest) {\n result.releases.push(releaseFromLatest);\n }\n }\n }\n\n if (!releases.length) {\n break;\n }\n }\n\n return result;\n }\n\n static getCacheKey({\n packageName,\n constraintsFiltering,\n }: GetReleasesConfig): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n const constraintsFilteringKey =\n constraintsFiltering && constraintsFiltering !== 'none'\n ? `@@${constraintsFiltering}`\n : '';\n // TODO: types (#22198)\n return `${packageName}@@${goproxy}@@${noproxy?.toString()}${constraintsFilteringKey}`;\n }\n\n static getVersionedCacheKey(packageName: string, version: string): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n // TODO: types (#22198)\n return `${packageName}@@${version}@@${goproxy}@@${noproxy?.toString()}`;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"releases-goproxy.js","names":["p.map","HttpError","goVersioning"],"sources":["../../../../lib/modules/datasource/go/releases-goproxy.ts"],"sourcesContent":["import {\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isTruthy,\n} from '@sindresorhus/is';\nimport type { ConstraintsFilter } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { queryReleases } from '../../../util/github/graphql/index.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport {\n joinUrlParts,\n parseUrl,\n trimLeadingSlash,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport goVersioning from '../../versioning/go-mod-directive/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport { GithubReleasesDatasource } from '../github-releases/index.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BaseGoDatasource } from './base.ts';\nimport { getSourceUrl } from './common.ts';\nimport { parseGoproxy, parseNoproxy } from './goproxy-parser.ts';\nimport { GoDirectDatasource } from './releases-direct.ts';\nimport { VersionInfo } from './schema.ts';\n\n/** TODO #42566 */\nconst goVersionRegex = regEx(/^\\s*go\\s+(?<version>[^\\s]+)\\s*$/);\n\nconst modRegex = regEx(/^(?<baseMod>.*?)(?:[./]v(?<majorVersion>\\d+))?$/);\n\nconst versionTagRegex = regEx(/^v\\d/);\n\n/**\n * Modules with a major version of v2 or above which have no `go.mod` are reported by a Go proxy with a `+incompatible` suffix, which is absent from the tag they were published as.\n *\n * @see https://go.dev/ref/mod#non-module-compat\n */\nconst incompatibleSuffixRegex = regEx(/\\+incompatible$/);\n\n/**\n * @see https://go.dev/ref/mod#pseudo-versions\n */\nconst pseudoVersionRegex = regEx(\n /v\\d+\\.\\d+\\.\\d+-(?:\\w+\\.)?(?:0\\.)?(?<timestamp>\\d{14})-(?<digest>[a-f0-9]{12})/i,\n);\n\nexport function pseudoVersionToRelease(pseudoVersion: string): Release | null {\n const match = pseudoVersion.match(pseudoVersionRegex)?.groups;\n if (!match) {\n return null;\n }\n\n const { digest: newDigest, timestamp } = match;\n const releaseTimestamp = asTimestamp(timestamp);\n\n return {\n version: pseudoVersion,\n newDigest,\n releaseTimestamp,\n };\n}\n\n/**\n * A Go module which lives in a subdirectory of its repository is tagged with that subdirectory as a prefix, so `github.com/aws/aws-sdk-go-v2/service/s3` publishes `v1.2.3` as the tag `service/s3/v1.2.3`.\n *\n * @see https://go.dev/ref/mod#vcs-version\n *\n * Because we can't tell from the module path alone where the repository ends and the subdirectory begins, we try each candidate prefix - longest first - against the tags we actually found, in the same way as `filterByPrefix` does for direct lookups.\n */\nexport function getTagPrefix(goModule: string, tags: Iterable<string>): string {\n const nameParts = goModule\n .replace(regEx(/\\/v\\d+$/), '')\n .split('/')\n .slice(1);\n const tagNames = [...tags];\n\n while (nameParts.length) {\n const prefix = `${nameParts.join('/')}/`;\n\n const isUsed = tagNames.some(\n (tag) =>\n tag.startsWith(prefix) &&\n versionTagRegex.test(tag.slice(prefix.length)),\n );\n if (isUsed) {\n return prefix;\n }\n\n nameParts.shift();\n }\n\n return '';\n}\n\nexport class GoProxyDatasource extends Datasource {\n static readonly id = 'go-proxy';\n\n constructor() {\n super(GoProxyDatasource.id);\n }\n\n readonly direct = new GoDirectDatasource();\n\n private readonly githubHttp = new GithubHttp(GithubReleasesDatasource.id);\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName } = config;\n logger.trace(`goproxy.getReleases(${packageName})`);\n const goproxy = getEnv().GOPROXY ?? 'https://proxy.golang.org,direct';\n if (goproxy === 'direct') {\n return this.direct.getReleases(config);\n }\n const proxyList = parseGoproxy(goproxy);\n const noproxy = parseNoproxy();\n\n let result: ReleaseResult | null = null;\n let servedByProxy = false;\n\n if (noproxy?.test(packageName)) {\n logger.debug(`Fetching ${packageName} via GONOPROXY match`);\n result = await this.direct.getReleases(config);\n return result;\n }\n\n for (const { url, fallback } of proxyList) {\n try {\n if (url === 'off') {\n break;\n } else if (url === 'direct') {\n result = await this.direct.getReleases(config);\n break;\n }\n\n const res = await this.getVersionsWithInfo(\n url,\n packageName,\n config.constraintsFiltering,\n );\n if (res.releases.length) {\n result = res;\n servedByProxy = true;\n break;\n }\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const statusCode = potentialHttpError?.response?.statusCode;\n const canFallback =\n fallback === '|' ? true : statusCode === 404 || statusCode === 410;\n if (!canFallback) {\n logger.debug(\n { err },\n 'Goproxy error: not falling back to other URLs provided with GOPROXY, rethrowing',\n );\n this.handleGenericErrors(err);\n }\n logger.debug(\n { err },\n 'Goproxy error: trying next URL provided with GOPROXY',\n );\n }\n }\n\n if (result && !result.sourceUrl) {\n try {\n const datasource = await BaseGoDatasource.getDatasource(packageName);\n const sourceUrl = getSourceUrl(datasource);\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n } catch (err) {\n logger.trace({ err }, `Can't get datasource for ${packageName}`);\n }\n }\n\n if (result?.sourceUrl && servedByProxy) {\n await this.addGithubReleaseTimestamps(\n packageName,\n result.sourceUrl,\n result.releases,\n );\n }\n\n return result;\n }\n\n /**\n * A Go proxy reports the commit time of the tagged commit as a version's `Time`, which can be much earlier than the point at which that version was released.\n *\n * When the module is hosted on GitHub and the version has a GitHub Release, the Release's publication time is a better indicator of when the version became available.\n */\n async addGithubReleaseTimestamps(\n packageName: string,\n sourceUrl: string,\n releases: Release[],\n ): Promise<void> {\n if (detectPlatform(sourceUrl) !== 'github') {\n return;\n }\n\n const parsedUrl = parseUrl(sourceUrl);\n /* v8 ignore next -- detectPlatform only returns a platform for parseable URLs */\n if (!parsedUrl) {\n return;\n }\n\n const repository = trimTrailingSlash(\n trimLeadingSlash(parsedUrl.pathname),\n ).replace(regEx(/\\.git$/), '');\n\n try {\n const githubReleases = await queryReleases(\n {\n packageName: repository,\n registryUrl: parsedUrl.origin,\n },\n this.githubHttp,\n );\n\n const timestamps = new Map<string, Timestamp>();\n for (const { version, releaseTimestamp } of githubReleases) {\n timestamps.set(version, releaseTimestamp);\n }\n\n const tagPrefix = getTagPrefix(packageName, timestamps.keys());\n for (const release of releases) {\n const version = release.version.replace(incompatibleSuffixRegex, '');\n const releaseTimestamp = timestamps.get(`${tagPrefix}${version}`);\n if (\n releaseTimestamp &&\n (!release.releaseTimestamp ||\n releaseTimestamp > release.releaseTimestamp)\n ) {\n release.releaseTimestamp = releaseTimestamp;\n }\n }\n } catch (err) {\n logger.debug(\n { err, packageName },\n 'Error fetching GitHub Releases for Go module',\n );\n }\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Avoid ambiguity when serving from case-insensitive file systems.\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\n encodeCase(input: string): string {\n return input.replace(regEx(/(?:[A-Z])/g), (x) => `!${x.toLowerCase()}`);\n }\n\n async listVersions(baseUrl: string, packageName: string): Promise<Release[]> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n 'list',\n );\n const { body } = await this.http.getText(url);\n return filterMap(body.split(newlineRegex), (str) => {\n if (!isNonEmptyStringAndNotWhitespace(str)) {\n return null;\n }\n\n const [version, timestamp] = str.trim().split(regEx(/\\s+/));\n const release: Release = pseudoVersionToRelease(version) ?? { version };\n\n const releaseTimestamp = asTimestamp(timestamp);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n return release;\n });\n }\n\n async versionInfo(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<Release> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.info`,\n );\n const res = await this.http.getJson(url, VersionInfo);\n\n const result: Release = {\n version: res.body.Version,\n };\n\n const releaseTimestamp = asTimestamp(res.body.Time);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n return result;\n }\n\n /**\n * Retrieve the `go` directive for a given Go Module.\n *\n * NOTE that this means the `go` directive, not the `toolchain` directive.\n */\n async retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getVersionedCacheKey(packageName, version),\n // a module's `go.mod` should /never/ change after it's published. If going via the Go Proxy and the Go Checksum Database, a change in this value will result in build failures.\n ttlMinutes: 100 * 24 * 60,\n },\n () => this._retrieveGoDirectiveForModule(baseUrl, packageName, version),\n );\n }\n\n async _retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.mod`,\n );\n const res = await this.http.getText(url);\n\n let goDirective: string | undefined = undefined;\n\n for (const line of res.body.split('\\n')) {\n const goVersionMatches = goVersionRegex.exec(line)?.groups;\n if (goVersionMatches) {\n goDirective = goVersionMatches.version;\n break;\n }\n }\n\n if (!goDirective) {\n return goDirective;\n }\n\n // always return it in full SemVer format, which can then be matched on using `semver` or `semver-coerced`\n const parts = goDirective.split('.');\n if (parts.length === 1) {\n return `${parts[0]}.0.0`;\n }\n if (parts.length === 2) {\n return `${parts[0]}.${parts[1]}.0`;\n }\n return `${parts[0]}.${parts[1]}.${parts[2]}`;\n }\n\n async getLatestVersion(\n baseUrl: string,\n packageName: string,\n ): Promise<{ version: string; sourceUrl?: string } | null> {\n try {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@latest',\n );\n const res = await this.http.getJson(url, VersionInfo);\n const { Version: version, Origin: origin } = res.body;\n // Extract sourceUrl from GOPROXY Origin when present, avoiding go-get to\n // vanity hosts (https://github.com/renovatebot/renovate/discussions/44898)\n const sourceUrl =\n origin?.VCS === 'git' && isNonEmptyString(origin.URL)\n ? origin.URL.replace(regEx(/\\.git$/), '')\n : undefined;\n return { version, sourceUrl };\n } catch (err) {\n logger.trace({ err }, 'Failed to get latest version');\n return null;\n }\n }\n\n async getVersionsWithInfo(\n baseUrl: string,\n packageName: string,\n constraintsFiltering: ConstraintsFilter | undefined,\n ): Promise<ReleaseResult> {\n const isGopkgin = packageName.startsWith('gopkg.in/');\n const majorSuffixSeparator = isGopkgin ? '.' : '/';\n const modParts = packageName.match(modRegex)?.groups;\n const baseMod =\n modParts?.baseMod ??\n /* v8 ignore next -- defensive: modRegex matches any non-empty package name, so baseMod is always set */ packageName;\n const packageMajor = parseInt(modParts?.majorVersion ?? '0', 10);\n\n const result: ReleaseResult = { releases: [] };\n for (let major = packageMajor; ; major += 1) {\n let pkg = `${baseMod}${majorSuffixSeparator}v${major}`;\n if (!isGopkgin && major < 2) {\n pkg = baseMod;\n major += 1; // v0 and v1 are the same module\n }\n\n let releases: Release[] = [];\n\n try {\n const res = await this.listVersions(baseUrl, pkg);\n\n // Artifactory returns all versions in any major (past and future),\n // so starting from v2, we filter them in order to avoid the infinite loop\n const filteredReleases = res.filter(({ version }) => {\n if (major < 2) {\n return true;\n }\n\n return (\n version.split(regEx(/[^\\d]+/)).find(isTruthy) === major.toString()\n );\n });\n\n releases = await p.map(filteredReleases, async (versionInfo) => {\n const { version, newDigest, releaseTimestamp } = versionInfo;\n\n if (releaseTimestamp) {\n return { version, newDigest, releaseTimestamp };\n }\n\n try {\n return await this.versionInfo(baseUrl, pkg, version);\n } catch (err) {\n logger.trace({ err }, `Can't obtain data from ${baseUrl}`);\n return { version };\n }\n });\n\n if (constraintsFiltering === 'strict') {\n releases = await p.map(releases, async (rel) => {\n try {\n const goDirective = await this.retrieveGoDirectiveForModule(\n baseUrl,\n pkg,\n rel.version,\n );\n if (goDirective) {\n rel.constraints ??= {};\n rel.constraints['%goMod'] ??= [];\n rel.constraints['%goMod'].push(goDirective);\n }\n } catch (err) {\n logger.trace(\n { err },\n `Can't obtain \\`go\\` directive from ${baseUrl}`,\n );\n }\n\n return rel;\n });\n }\n\n result.releases.push(...releases);\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const status = potentialHttpError.response?.statusCode;\n if (\n potentialHttpError instanceof HttpError &&\n (status === 404 || status === 403) &&\n major !== packageMajor\n ) {\n break;\n }\n\n throw err;\n }\n\n const latest = await this.getLatestVersion(baseUrl, pkg);\n if (latest) {\n const { version: latestVersion, sourceUrl } = latest;\n result.tags ??= {};\n result.tags.latest ??= latestVersion;\n if (goVersioning.isGreaterThan(latestVersion, result.tags.latest)) {\n result.tags.latest = latestVersion;\n }\n if (sourceUrl) {\n result.sourceUrl ??= sourceUrl;\n }\n if (!result.releases.length) {\n const releaseFromLatest = pseudoVersionToRelease(latestVersion);\n if (releaseFromLatest) {\n result.releases.push(releaseFromLatest);\n }\n }\n }\n\n if (!releases.length) {\n break;\n }\n }\n\n return result;\n }\n\n static getCacheKey({\n packageName,\n constraintsFiltering,\n }: GetReleasesConfig): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n const constraintsFilteringKey =\n constraintsFiltering && constraintsFiltering !== 'none'\n ? `@@${constraintsFiltering}`\n : '';\n // TODO: types (#22198)\n return `${packageName}@@${goproxy}@@${noproxy?.toString()}${constraintsFilteringKey}`;\n }\n\n static getVersionedCacheKey(packageName: string, version: string): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n // TODO: types (#22198)\n return `${packageName}@@${version}@@${goproxy}@@${noproxy?.toString()}`;\n }\n}\n"],"mappings":"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"}
@@ -58,7 +58,7 @@ var GradleVersionDatasource = class GradleVersionDatasource extends Datasource {
58
58
  * - `8.2-milestone-1` -> `v8.2.0-M1`
59
59
  */
60
60
  static getGitRef(version) {
61
- const [versionPart, typePart, unstablePart] = version.split(regEx(/-([a-z]+)-/));
61
+ const [versionPart, typePart, unstablePart] = version.split(regEx(/-(?<type>[a-z]+)-/));
62
62
  let suffix = "";
63
63
  if (typePart === "rc") suffix = `-RC${unstablePart}`;
64
64
  else if (typePart === "milestone") suffix = `-M${unstablePart}`;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["gradleVersioning.id"],"sources":["../../../../lib/modules/datasource/gradle-version/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as gradleVersioning from '../../versioning/gradle/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { GradleReleases } from './schema.ts';\n\nexport class GradleVersionDatasource extends Datasource {\n static readonly id = 'gradle-version';\n\n constructor() {\n super(GradleVersionDatasource.id);\n }\n\n override readonly defaultRegistryUrls = [\n 'https://services.gradle.org/versions/all',\n ];\n\n override readonly defaultVersioning = gradleVersioning.id;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildTime` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL: https://github.com/gradle/gradle.';\n\n private async _getReleases({\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n let releases: Release[];\n try {\n const response = await this.http.getJson(registryUrl, GradleReleases);\n releases = response.body\n .filter((release) => !release.snapshot && !release.nightly)\n .map((release) => {\n const { version, buildTime } = release;\n\n const gitRef = GradleVersionDatasource.getGitRef(release.version);\n\n const releaseTimestamp = asTimestamp(buildTime);\n\n const result: Release = { version, gitRef, releaseTimestamp };\n\n if (release.broken) {\n result.isDeprecated = true;\n }\n\n return result;\n });\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n const res: ReleaseResult = {\n releases,\n homepage: 'https://gradle.org',\n sourceUrl: 'https://github.com/gradle/gradle',\n };\n if (res.releases.length) {\n return res;\n }\n return null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GradleVersionDatasource.id}`,\n // TODO: types (#22198)\n key: `${config.registryUrl}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Calculate `gitTag` based on `version`:\n * - `8.1.2` -> `v8.1.2`\n * - `8.2` -> `v8.2.0`\n * - `8.2-rc-1` -> `v8.2.0-RC1`\n * - `8.2-milestone-1` -> `v8.2.0-M1`\n */\n private static getGitRef(version: string): string {\n const [versionPart, typePart, unstablePart] = version.split(\n regEx(/-([a-z]+)-/),\n );\n\n let suffix = '';\n if (typePart === 'rc') {\n suffix = `-RC${unstablePart}`;\n } else if (typePart === 'milestone') {\n suffix = `-M${unstablePart}`;\n }\n\n const [major, minor, patch = '0'] = versionPart.split('.');\n return `v${major}.${minor}.${patch}${suffix}`;\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,0BAAb,MAAa,gCAAgC,WAAW;CACtD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,wBAAwB,EAAE;CAClC;CAEA,sBAAwC,CACtC,0CACF;CAEA,oBAAsCA;CAEtC,mBAAqC;CAErC,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,IAAI;EACJ,IAAI;GAEF,YAAW,MADY,KAAK,KAAK,QAAQ,aAAa,cAAc,EAAA,CAChD,KACjB,QAAQ,YAAY,CAAC,QAAQ,YAAY,CAAC,QAAQ,OAAO,CAAC,CAC1D,KAAK,YAAY;IAChB,MAAM,EAAE,SAAS,cAAc;IAM/B,MAAM,SAAkB;KAAE;KAAS,QAJpB,wBAAwB,UAAU,QAAQ,OAIjB;KAAG,kBAFlB,YAAY,SAEqB;IAAE;IAE5D,IAAI,QAAQ,QACV,OAAO,eAAe;IAGxB,OAAO;GACT,CAAC;EACL,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;EAEA,MAAM,MAAqB;GACzB;GACA,UAAU;GACV,WAAW;EACb;EACA,IAAI,IAAI,SAAS,QACf,OAAO;EAET,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,wBAAwB;GAEjD,KAAK,GAAG,OAAO;GACf,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;;;;;;;;CASA,OAAe,UAAU,SAAyB;EAChD,MAAM,CAAC,aAAa,UAAU,gBAAgB,QAAQ,MACpD,MAAM,YAAY,CACpB;EAEA,IAAI,SAAS;EACb,IAAI,aAAa,MACf,SAAS,MAAM;OACV,IAAI,aAAa,aACtB,SAAS,KAAK;EAGhB,MAAM,CAAC,OAAO,OAAO,QAAQ,OAAO,YAAY,MAAM,GAAG;EACzD,OAAO,IAAI,MAAM,GAAG,MAAM,GAAG,QAAQ;CACvC;AACF"}
1
+ {"version":3,"file":"index.js","names":["gradleVersioning.id"],"sources":["../../../../lib/modules/datasource/gradle-version/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as gradleVersioning from '../../versioning/gradle/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { GradleReleases } from './schema.ts';\n\nexport class GradleVersionDatasource extends Datasource {\n static readonly id = 'gradle-version';\n\n constructor() {\n super(GradleVersionDatasource.id);\n }\n\n override readonly defaultRegistryUrls = [\n 'https://services.gradle.org/versions/all',\n ];\n\n override readonly defaultVersioning = gradleVersioning.id;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildTime` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL: https://github.com/gradle/gradle.';\n\n private async _getReleases({\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n let releases: Release[];\n try {\n const response = await this.http.getJson(registryUrl, GradleReleases);\n releases = response.body\n .filter((release) => !release.snapshot && !release.nightly)\n .map((release) => {\n const { version, buildTime } = release;\n\n const gitRef = GradleVersionDatasource.getGitRef(release.version);\n\n const releaseTimestamp = asTimestamp(buildTime);\n\n const result: Release = { version, gitRef, releaseTimestamp };\n\n if (release.broken) {\n result.isDeprecated = true;\n }\n\n return result;\n });\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n const res: ReleaseResult = {\n releases,\n homepage: 'https://gradle.org',\n sourceUrl: 'https://github.com/gradle/gradle',\n };\n if (res.releases.length) {\n return res;\n }\n return null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GradleVersionDatasource.id}`,\n // TODO: types (#22198)\n key: `${config.registryUrl}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Calculate `gitTag` based on `version`:\n * - `8.1.2` -> `v8.1.2`\n * - `8.2` -> `v8.2.0`\n * - `8.2-rc-1` -> `v8.2.0-RC1`\n * - `8.2-milestone-1` -> `v8.2.0-M1`\n */\n private static getGitRef(version: string): string {\n const [versionPart, typePart, unstablePart] = version.split(\n regEx(/-(?<type>[a-z]+)-/),\n );\n\n let suffix = '';\n if (typePart === 'rc') {\n suffix = `-RC${unstablePart}`;\n } else if (typePart === 'milestone') {\n suffix = `-M${unstablePart}`;\n }\n\n const [major, minor, patch = '0'] = versionPart.split('.');\n return `v${major}.${minor}.${patch}${suffix}`;\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,0BAAb,MAAa,gCAAgC,WAAW;CACtD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,wBAAwB,EAAE;CAClC;CAEA,sBAAwC,CACtC,0CACF;CAEA,oBAAsCA;CAEtC,mBAAqC;CAErC,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,IAAI;EACJ,IAAI;GAEF,YAAW,MADY,KAAK,KAAK,QAAQ,aAAa,cAAc,EAAA,CAChD,KACjB,QAAQ,YAAY,CAAC,QAAQ,YAAY,CAAC,QAAQ,OAAO,CAAC,CAC1D,KAAK,YAAY;IAChB,MAAM,EAAE,SAAS,cAAc;IAM/B,MAAM,SAAkB;KAAE;KAAS,QAJpB,wBAAwB,UAAU,QAAQ,OAIjB;KAAG,kBAFlB,YAAY,SAEqB;IAAE;IAE5D,IAAI,QAAQ,QACV,OAAO,eAAe;IAGxB,OAAO;GACT,CAAC;EACL,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;EAEA,MAAM,MAAqB;GACzB;GACA,UAAU;GACV,WAAW;EACb;EACA,IAAI,IAAI,SAAS,QACf,OAAO;EAET,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,wBAAwB;GAEjD,KAAK,GAAG,OAAO;GACf,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;;;;;;;;CASA,OAAe,UAAU,SAAyB;EAChD,MAAM,CAAC,aAAa,UAAU,gBAAgB,QAAQ,MACpD,MAAM,mBAAmB,CAC3B;EAEA,IAAI,SAAS;EACb,IAAI,aAAa,MACf,SAAS,MAAM;OACV,IAAI,aAAa,aACtB,SAAS,KAAK;EAGhB,MAAM,CAAC,OAAO,OAAO,QAAQ,OAAO,YAAY,MAAM,GAAG;EACzD,OAAO,IAAI,MAAM,GAAG,MAAM,GAAG,QAAQ;CACvC;AACF"}
@@ -19,11 +19,11 @@ function isPossibleChartRepo(url) {
19
19
  const parsed = parseGitUrl(url);
20
20
  return chartRepo.test(parsed.name);
21
21
  }
22
- const githubRelease = regEx(/^(https:\/\/github\.com\/[^/]+\/[^/]+)\/releases\//);
22
+ const githubRelease = regEx(/^(?<repoUrl>https:\/\/github\.com\/[^/]+\/[^/]+)\/releases\//);
23
23
  function getSourceUrl(release) {
24
24
  const [githubUrl] = release.urls;
25
25
  const releaseMatch = githubRelease.exec(githubUrl);
26
- if (releaseMatch) return releaseMatch[1];
26
+ if (releaseMatch) return releaseMatch.groups.repoUrl;
27
27
  if (release.home && isPossibleChartRepo(release.home)) return release.home;
28
28
  for (const url of release.sources) if (isPossibleChartRepo(url)) return url;
29
29
  return release.sources[0];
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/helm/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { LooseRecord } from '../../../util/schema-utils/index.ts';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\nimport type { Release } from '../types.ts';\n\nconst HelmRelease = z.object({\n version: z.string(),\n created: MaybeTimestamp,\n digest: z.string().optional().catch(undefined),\n home: z.string().optional().catch(undefined),\n sources: z.array(z.string()).catch([]),\n urls: z.array(z.string()).catch([]),\n});\ntype HelmRelease = z.infer<typeof HelmRelease>;\n\nconst chartRepo = regEx(/charts?|helm|helm-charts/i);\n\nfunction isPossibleChartRepo(url: string): boolean {\n if (detectPlatform(url) === null) {\n return false;\n }\n\n const parsed = parseGitUrl(url);\n return chartRepo.test(parsed.name);\n}\n\nconst githubRelease = regEx(\n /^(https:\\/\\/github\\.com\\/[^/]+\\/[^/]+)\\/releases\\//,\n);\n\nfunction getSourceUrl(release: HelmRelease): string | undefined {\n // it's a github release :)\n const [githubUrl] = release.urls;\n const releaseMatch = githubRelease.exec(githubUrl);\n if (releaseMatch) {\n return releaseMatch[1];\n }\n\n if (release.home && isPossibleChartRepo(release.home)) {\n return release.home;\n }\n\n for (const url of release.sources) {\n if (isPossibleChartRepo(url)) {\n return url;\n }\n }\n\n // fallback\n return release.sources[0];\n}\n\nexport const HelmRepository = z\n .object({\n entries: LooseRecord(\n z.string(),\n HelmRelease.array()\n .min(1)\n .transform((helmReleases) => {\n const latestRelease = helmReleases[0];\n const homepage = latestRelease.home;\n const sourceUrl = getSourceUrl(latestRelease);\n const releases = helmReleases.map(\n ({\n version,\n created: releaseTimestamp,\n digest: newDigest,\n }): Release => ({\n version,\n releaseTimestamp,\n newDigest,\n }),\n );\n return { homepage, sourceUrl, releases };\n }),\n ),\n })\n .transform(({ entries }) => entries);\n\nexport type HelmRepository = z.infer<typeof HelmRepository>;\n"],"mappings":";;;;;;;AAQA,MAAM,cAAc,EAAE,OAAO;CAC3B,SAAS,EAAE,OAAO;CAClB,SAAS;CACT,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;CAC7C,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;CAC3C,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;CACrC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAGD,MAAM,YAAY,MAAM,2BAA2B;AAEnD,SAAS,oBAAoB,KAAsB;CACjD,IAAI,eAAe,GAAG,MAAM,MAC1B,OAAO;CAGT,MAAM,SAAS,YAAY,GAAG;CAC9B,OAAO,UAAU,KAAK,OAAO,IAAI;AACnC;AAEA,MAAM,gBAAgB,MACpB,oDACF;AAEA,SAAS,aAAa,SAA0C;CAE9D,MAAM,CAAC,aAAa,QAAQ;CAC5B,MAAM,eAAe,cAAc,KAAK,SAAS;CACjD,IAAI,cACF,OAAO,aAAa;CAGtB,IAAI,QAAQ,QAAQ,oBAAoB,QAAQ,IAAI,GAClD,OAAO,QAAQ;CAGjB,KAAK,MAAM,OAAO,QAAQ,SACxB,IAAI,oBAAoB,GAAG,GACzB,OAAO;CAKX,OAAO,QAAQ,QAAQ;AACzB;AAEA,MAAa,iBAAiB,EAC3B,OAAO,EACN,SAAS,YACP,EAAE,OAAO,GACT,YAAY,MAAM,CAAC,CAChB,IAAI,CAAC,CAAC,CACN,WAAW,iBAAiB;CAC3B,MAAM,gBAAgB,aAAa;CAcnC,OAAO;EAAE,UAbQ,cAAc;EAaZ,WAZD,aAAa,aAYJ;EAAG,UAXb,aAAa,KAC3B,EACC,SACA,SAAS,kBACT,QAAQ,iBACM;GACd;GACA;GACA;EACF,EAEmC;CAAE;AACzC,CAAC,CACL,EACF,CAAC,CAAC,CACD,WAAW,EAAE,cAAc,OAAO"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/helm/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { LooseRecord } from '../../../util/schema-utils/index.ts';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\nimport type { Release } from '../types.ts';\n\nconst HelmRelease = z.object({\n version: z.string(),\n created: MaybeTimestamp,\n digest: z.string().optional().catch(undefined),\n home: z.string().optional().catch(undefined),\n sources: z.array(z.string()).catch([]),\n urls: z.array(z.string()).catch([]),\n});\ntype HelmRelease = z.infer<typeof HelmRelease>;\n\nconst chartRepo = regEx(/charts?|helm|helm-charts/i);\n\nfunction isPossibleChartRepo(url: string): boolean {\n if (detectPlatform(url) === null) {\n return false;\n }\n\n const parsed = parseGitUrl(url);\n return chartRepo.test(parsed.name);\n}\n\nconst githubRelease = regEx(\n /^(?<repoUrl>https:\\/\\/github\\.com\\/[^/]+\\/[^/]+)\\/releases\\//,\n);\n\nfunction getSourceUrl(release: HelmRelease): string | undefined {\n // it's a github release :)\n const [githubUrl] = release.urls;\n const releaseMatch = githubRelease.exec(githubUrl);\n if (releaseMatch) {\n return releaseMatch.groups!.repoUrl;\n }\n\n if (release.home && isPossibleChartRepo(release.home)) {\n return release.home;\n }\n\n for (const url of release.sources) {\n if (isPossibleChartRepo(url)) {\n return url;\n }\n }\n\n // fallback\n return release.sources[0];\n}\n\nexport const HelmRepository = z\n .object({\n entries: LooseRecord(\n z.string(),\n HelmRelease.array()\n .min(1)\n .transform((helmReleases) => {\n const latestRelease = helmReleases[0];\n const homepage = latestRelease.home;\n const sourceUrl = getSourceUrl(latestRelease);\n const releases = helmReleases.map(\n ({\n version,\n created: releaseTimestamp,\n digest: newDigest,\n }): Release => ({\n version,\n releaseTimestamp,\n newDigest,\n }),\n );\n return { homepage, sourceUrl, releases };\n }),\n ),\n })\n .transform(({ entries }) => entries);\n\nexport type HelmRepository = z.infer<typeof HelmRepository>;\n"],"mappings":";;;;;;;AAQA,MAAM,cAAc,EAAE,OAAO;CAC3B,SAAS,EAAE,OAAO;CAClB,SAAS;CACT,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;CAC7C,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;CAC3C,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;CACrC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAGD,MAAM,YAAY,MAAM,2BAA2B;AAEnD,SAAS,oBAAoB,KAAsB;CACjD,IAAI,eAAe,GAAG,MAAM,MAC1B,OAAO;CAGT,MAAM,SAAS,YAAY,GAAG;CAC9B,OAAO,UAAU,KAAK,OAAO,IAAI;AACnC;AAEA,MAAM,gBAAgB,MACpB,8DACF;AAEA,SAAS,aAAa,SAA0C;CAE9D,MAAM,CAAC,aAAa,QAAQ;CAC5B,MAAM,eAAe,cAAc,KAAK,SAAS;CACjD,IAAI,cACF,OAAO,aAAa,OAAQ;CAG9B,IAAI,QAAQ,QAAQ,oBAAoB,QAAQ,IAAI,GAClD,OAAO,QAAQ;CAGjB,KAAK,MAAM,OAAO,QAAQ,SACxB,IAAI,oBAAoB,GAAG,GACzB,OAAO;CAKX,OAAO,QAAQ,QAAQ;AACzB;AAEA,MAAa,iBAAiB,EAC3B,OAAO,EACN,SAAS,YACP,EAAE,OAAO,GACT,YAAY,MAAM,CAAC,CAChB,IAAI,CAAC,CAAC,CACN,WAAW,iBAAiB;CAC3B,MAAM,gBAAgB,aAAa;CAcnC,OAAO;EAAE,UAbQ,cAAc;EAaZ,WAZD,aAAa,aAYJ;EAAG,UAXb,aAAa,KAC3B,EACC,SACA,SAAS,kBACT,QAAQ,iBACM;GACd;GACA;GACA;EACF,EAEmC;CAAE;AACzC,CAAC,CACL,EACF,CAAC,CAAC,CACD,WAAW,EAAE,cAAc,OAAO"}
@@ -72,7 +72,7 @@ var HexpmBobDatasource = class HexpmBobDatasource extends Datasource {
72
72
  }
73
73
  static isStable(version, packageType) {
74
74
  switch (packageType) {
75
- case "elixir": return regEx(/^v\d+\.\d+\.\d+($|-otp)/).test(version);
75
+ case "elixir": return regEx(/^v\d+\.\d+\.\d+(?:$|-otp)/).test(version);
76
76
  case "erlang": return version.startsWith("OTP-");
77
77
  }
78
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semverId","HttpError"],"sources":["../../../../lib/modules/datasource/hexpm-bob/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { id as semverId } from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport type { PackageType } from './types.ts';\n\nexport class HexpmBobDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly caching = true;\n\n override readonly defaultVersioning = semverId;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildDate` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL https://github.com/elixir-lang/elixir.git for the `elixir` package and the https://github.com/erlang/otp.git URL for the `erlang` package.';\n\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const packageType = HexpmBobDatasource.getPackageType(packageName);\n\n if (!packageType) {\n return null;\n }\n\n logger.trace(\n { registryUrl, packageName },\n `fetching hex.pm bob ${packageName} release`,\n );\n\n const url = `${registryUrl!}/builds/${packageName}/builds.txt`;\n\n const result: ReleaseResult = {\n releases: [],\n ...HexpmBobDatasource.getPackageDetails(packageType),\n };\n try {\n const { body } = await this.http.getText(url);\n result.releases = body\n .split('\\n')\n .map((line) => line.trim())\n .filter(isNonEmptyString)\n .map((line) => {\n const [version, gitRef, buildDate] = line.split(' ');\n\n return {\n gitRef,\n isStable: HexpmBobDatasource.isStable(version, packageType),\n releaseTimestamp: asTimestamp(buildDate),\n version: HexpmBobDatasource.cleanVersion(version, packageType),\n };\n });\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length > 0 ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private static getPackageType(packageName: string): PackageType | null {\n if (packageName === 'elixir') {\n return 'elixir';\n }\n if (regEx(/^otp\\/\\w+-\\d+\\.\\d+$/).test(packageName)) {\n return 'erlang';\n }\n return null;\n }\n\n private static cleanVersion(\n version: string,\n packageType: PackageType,\n ): string {\n switch (packageType) {\n case 'elixir':\n return version.replace(regEx(/^v/), '');\n case 'erlang':\n return version.replace(regEx(/^OTP-/), '');\n }\n }\n\n private static isStable(version: string, packageType: PackageType): boolean {\n switch (packageType) {\n case 'elixir':\n return regEx(/^v\\d+\\.\\d+\\.\\d+($|-otp)/).test(version);\n case 'erlang':\n return version.startsWith('OTP-');\n }\n }\n\n private static getPackageDetails(\n packageType: PackageType,\n ): Omit<ReleaseResult, 'releases'> {\n switch (packageType) {\n case 'elixir':\n return {\n homepage: 'https://elixir-lang.org/',\n sourceUrl: 'https://github.com/elixir-lang/elixir.git',\n };\n case 'erlang':\n return {\n homepage: 'https://www.erlang.org/',\n sourceUrl: 'https://github.com/erlang/otp.git',\n };\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAa,qBAAb,MAAa,2BAA2B,WAAW;CACjD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,kBAAkB;CAE3D,UAA4B;CAE5B,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,cAAc,mBAAmB,eAAe,WAAW;EAEjE,IAAI,CAAC,aACH,OAAO;EAGT,OAAO,MACL;GAAE;GAAa;EAAY,GAC3B,uBAAuB,YAAY,SACrC;EAEA,MAAM,MAAM,GAAG,YAAa,UAAU,YAAY;EAElD,MAAM,SAAwB;GAC5B,UAAU,CAAC;GACX,GAAG,mBAAmB,kBAAkB,WAAW;EACrD;EACA,IAAI;GACF,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;GAC5C,OAAO,WAAW,KACf,MAAM,IAAI,CAAC,CACX,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,gBAAgB,CAAC,CACxB,KAAK,SAAS;IACb,MAAM,CAAC,SAAS,QAAQ,aAAa,KAAK,MAAM,GAAG;IAEnD,OAAO;KACL;KACA,UAAU,mBAAmB,SAAS,SAAS,WAAW;KAC1D,kBAAkB,YAAY,SAAS;KACvC,SAAS,mBAAmB,aAAa,SAAS,WAAW;IAC/D;GACF,CAAC;EACL,SAAS,KAAK;GACZ,IAAI,eAAeC,gBAAa,IAAI,UAAU,eAAe,KAC3D,MAAM,IAAI,kBAAkB,GAAG;GAEjC,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,IAAI,SAAS;CAC/C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc;GACzB,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,OAAe,eAAe,aAAyC;EACrE,IAAI,gBAAgB,UAClB,OAAO;EAET,IAAI,MAAM,qBAAqB,CAAC,CAAC,KAAK,WAAW,GAC/C,OAAO;EAET,OAAO;CACT;CAEA,OAAe,aACb,SACA,aACQ;EACR,QAAQ,aAAR;GACE,KAAK,UACH,OAAO,QAAQ,QAAQ,MAAM,IAAI,GAAG,EAAE;GACxC,KAAK,UACH,OAAO,QAAQ,QAAQ,MAAM,OAAO,GAAG,EAAE;EAC7C;CACF;CAEA,OAAe,SAAS,SAAiB,aAAmC;EAC1E,QAAQ,aAAR;GACE,KAAK,UACH,OAAO,MAAM,yBAAyB,CAAC,CAAC,KAAK,OAAO;GACtD,KAAK,UACH,OAAO,QAAQ,WAAW,MAAM;EACpC;CACF;CAEA,OAAe,kBACb,aACiC;EACjC,QAAQ,aAAR;GACE,KAAK,UACH,OAAO;IACL,UAAU;IACV,WAAW;GACb;GACF,KAAK,UACH,OAAO;IACL,UAAU;IACV,WAAW;GACb;EACJ;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["semverId","HttpError"],"sources":["../../../../lib/modules/datasource/hexpm-bob/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { id as semverId } from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport type { PackageType } from './types.ts';\n\nexport class HexpmBobDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly caching = true;\n\n override readonly defaultVersioning = semverId;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildDate` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL https://github.com/elixir-lang/elixir.git for the `elixir` package and the https://github.com/erlang/otp.git URL for the `erlang` package.';\n\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const packageType = HexpmBobDatasource.getPackageType(packageName);\n\n if (!packageType) {\n return null;\n }\n\n logger.trace(\n { registryUrl, packageName },\n `fetching hex.pm bob ${packageName} release`,\n );\n\n const url = `${registryUrl!}/builds/${packageName}/builds.txt`;\n\n const result: ReleaseResult = {\n releases: [],\n ...HexpmBobDatasource.getPackageDetails(packageType),\n };\n try {\n const { body } = await this.http.getText(url);\n result.releases = body\n .split('\\n')\n .map((line) => line.trim())\n .filter(isNonEmptyString)\n .map((line) => {\n const [version, gitRef, buildDate] = line.split(' ');\n\n return {\n gitRef,\n isStable: HexpmBobDatasource.isStable(version, packageType),\n releaseTimestamp: asTimestamp(buildDate),\n version: HexpmBobDatasource.cleanVersion(version, packageType),\n };\n });\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length > 0 ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private static getPackageType(packageName: string): PackageType | null {\n if (packageName === 'elixir') {\n return 'elixir';\n }\n if (regEx(/^otp\\/\\w+-\\d+\\.\\d+$/).test(packageName)) {\n return 'erlang';\n }\n return null;\n }\n\n private static cleanVersion(\n version: string,\n packageType: PackageType,\n ): string {\n switch (packageType) {\n case 'elixir':\n return version.replace(regEx(/^v/), '');\n case 'erlang':\n return version.replace(regEx(/^OTP-/), '');\n }\n }\n\n private static isStable(version: string, packageType: PackageType): boolean {\n switch (packageType) {\n case 'elixir':\n return regEx(/^v\\d+\\.\\d+\\.\\d+(?:$|-otp)/).test(version);\n case 'erlang':\n return version.startsWith('OTP-');\n }\n }\n\n private static getPackageDetails(\n packageType: PackageType,\n ): Omit<ReleaseResult, 'releases'> {\n switch (packageType) {\n case 'elixir':\n return {\n homepage: 'https://elixir-lang.org/',\n sourceUrl: 'https://github.com/elixir-lang/elixir.git',\n };\n case 'erlang':\n return {\n homepage: 'https://www.erlang.org/',\n sourceUrl: 'https://github.com/erlang/otp.git',\n };\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAa,qBAAb,MAAa,2BAA2B,WAAW;CACjD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,kBAAkB;CAE3D,UAA4B;CAE5B,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,cAAc,mBAAmB,eAAe,WAAW;EAEjE,IAAI,CAAC,aACH,OAAO;EAGT,OAAO,MACL;GAAE;GAAa;EAAY,GAC3B,uBAAuB,YAAY,SACrC;EAEA,MAAM,MAAM,GAAG,YAAa,UAAU,YAAY;EAElD,MAAM,SAAwB;GAC5B,UAAU,CAAC;GACX,GAAG,mBAAmB,kBAAkB,WAAW;EACrD;EACA,IAAI;GACF,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;GAC5C,OAAO,WAAW,KACf,MAAM,IAAI,CAAC,CACX,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,gBAAgB,CAAC,CACxB,KAAK,SAAS;IACb,MAAM,CAAC,SAAS,QAAQ,aAAa,KAAK,MAAM,GAAG;IAEnD,OAAO;KACL;KACA,UAAU,mBAAmB,SAAS,SAAS,WAAW;KAC1D,kBAAkB,YAAY,SAAS;KACvC,SAAS,mBAAmB,aAAa,SAAS,WAAW;IAC/D;GACF,CAAC;EACL,SAAS,KAAK;GACZ,IAAI,eAAeC,gBAAa,IAAI,UAAU,eAAe,KAC3D,MAAM,IAAI,kBAAkB,GAAG;GAEjC,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,IAAI,SAAS;CAC/C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc;GACzB,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,OAAe,eAAe,aAAyC;EACrE,IAAI,gBAAgB,UAClB,OAAO;EAET,IAAI,MAAM,qBAAqB,CAAC,CAAC,KAAK,WAAW,GAC/C,OAAO;EAET,OAAO;CACT;CAEA,OAAe,aACb,SACA,aACQ;EACR,QAAQ,aAAR;GACE,KAAK,UACH,OAAO,QAAQ,QAAQ,MAAM,IAAI,GAAG,EAAE;GACxC,KAAK,UACH,OAAO,QAAQ,QAAQ,MAAM,OAAO,GAAG,EAAE;EAC7C;CACF;CAEA,OAAe,SAAS,SAAiB,aAAmC;EAC1E,QAAQ,aAAR;GACE,KAAK,UACH,OAAO,MAAM,2BAA2B,CAAC,CAAC,KAAK,OAAO;GACxD,KAAK,UACH,OAAO,QAAQ,WAAW,MAAM;EACpC;CACF;CAEA,OAAe,kBACb,aACiC;EACjC,QAAQ,aAAR;GACE,KAAK,UACH,OAAO;IACL,UAAU;IACV,WAAW;GACb;GACF,KAAK,UACH,OAAO;IACL,UAAU;IACV,WAAW;GACb;EACJ;CACF;AACF"}
@@ -12,7 +12,7 @@ import { CachedPackument, NpmResponse } from "./schema.js";
12
12
  import { isNonEmptyString, isString } from "@sindresorhus/is";
13
13
  import { z } from "zod/v4";
14
14
  //#region lib/modules/datasource/npm/get.ts
15
- const SHORT_REPO_REGEX = regEx(/^((?<platform>bitbucket|github|gitlab):)?(?<shortRepo>[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)$/);
15
+ const SHORT_REPO_REGEX = regEx(/^(?:(?<platform>bitbucket|github|gitlab):)?(?<shortRepo>[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)$/);
16
16
  const platformMapping = {
17
17
  bitbucket: "https://bitbucket.org/",
18
18
  github: "https://github.com/",
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","names":["hostRules.find"],"sources":["../../../../lib/modules/datasource/npm/get.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { HOST_DISABLED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { PackageHttpCacheProvider } from '../../../util/http/cache/package-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { DeepNullish } from '../../../util/schema-utils/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport { CachedPackument, NpmResponse } from './schema.ts';\n\nconst SHORT_REPO_REGEX = regEx(\n /^((?<platform>bitbucket|github|gitlab):)?(?<shortRepo>[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+)$/,\n);\n\nconst platformMapping: Record<string, string> = {\n bitbucket: 'https://bitbucket.org/',\n github: 'https://github.com/',\n gitlab: 'https://gitlab.com/',\n};\n\ninterface PackageSource {\n sourceUrl: string | null;\n sourceDirectory: string | null;\n}\n\nconst PackageSource = z\n .union([\n z\n .string()\n .nonempty()\n .transform((repository): PackageSource => {\n let sourceUrl: string | null = null;\n const sourceDirectory = null;\n const shortMatch = repository.match(SHORT_REPO_REGEX);\n if (shortMatch?.groups) {\n const { platform = 'github', shortRepo } = shortMatch.groups;\n sourceUrl = platformMapping[platform] + shortRepo;\n } else {\n sourceUrl = repository;\n }\n return { sourceUrl, sourceDirectory };\n }),\n DeepNullish(\n z.object({\n url: z.string().nonempty().optional(),\n directory: z.string().nonempty().optional(),\n }),\n ).transform(({ url, directory }) => {\n const res: PackageSource = { sourceUrl: null, sourceDirectory: null };\n\n if (url) {\n res.sourceUrl = url;\n }\n\n if (directory) {\n res.sourceDirectory = directory;\n }\n\n return res;\n }),\n ])\n .catch({ sourceUrl: null, sourceDirectory: null });\n\nexport async function getDependency(\n http: Http,\n registryUrl: string,\n packageName: string,\n): Promise<ReleaseResult | null> {\n logger.trace(`npm.getDependency(${packageName})`);\n\n const packageUrl = joinUrlParts(registryUrl, packageName.replace('/', '%2F'));\n\n try {\n const cacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-npm:cache-provider',\n checkAuthorizationHeader: false, // We don't rely on whether user token is provided or not\n checkCacheControlHeader: true,\n writeSchema: CachedPackument,\n });\n const options: HttpOptions = { cacheProvider };\n\n // set abortOnError for registry.npmjs.org if no hostRule with explicit abortOnError exists\n if (\n registryUrl === defaultRegistryUrl &&\n hostRules.find({ url: defaultRegistryUrl })?.abortOnError === undefined\n ) {\n logger.trace(\n { packageName, registry: defaultRegistryUrl },\n 'setting abortOnError hostRule for well known host',\n );\n hostRules.add({\n matchHost: defaultRegistryUrl,\n abortOnError: true,\n });\n }\n\n const resp = await http.getJson(packageUrl, options, NpmResponse);\n const { body: res } = resp;\n if (!res.versions || !Object.keys(res.versions).length) {\n // Registry returned a 200 OK but with no versions\n logger.debug(`No versions returned for npm dependency ${packageName}`);\n return null;\n }\n\n const latestVersion = res.versions[res['dist-tags']?.latest ?? ''];\n res.repository ??= latestVersion?.repository;\n res.homepage ??= latestVersion?.homepage;\n\n const { sourceUrl, sourceDirectory } = PackageSource.parse(res.repository);\n\n // Simplify response before caching and returning\n const dep: ReleaseResult = {\n homepage: res.homepage,\n releases: [],\n tags: res['dist-tags'],\n registryUrl,\n };\n\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n\n if (sourceDirectory) {\n dep.sourceDirectory = sourceDirectory;\n }\n\n if (latestVersion?.deprecated) {\n dep.deprecationMessage = `On registry \\`${registryUrl}\\`, the \"latest\" version of dependency \\`${packageName}\\` has the following deprecation notice:\\n\\n\\`${latestVersion.deprecated}\\`\\n\\nMarking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.`;\n }\n dep.releases = Object.keys(res.versions).map((version) => {\n const release: Release = {\n version,\n gitRef: res.versions?.[version].gitHead,\n dependencies: res.versions?.[version].dependencies,\n devDependencies: res.versions?.[version].devDependencies,\n attestation: isString(res.versions?.[version].dist?.attestations?.url),\n };\n const releaseTimestamp = asTimestamp(res.time?.[version]);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (res.versions?.[version].deprecated) {\n release.isDeprecated = true;\n }\n const nodeConstraint = res.versions?.[version].engines?.node;\n if (isNonEmptyString(nodeConstraint)) {\n release.constraints = { node: [nodeConstraint] };\n }\n const source = PackageSource.parse(res.versions?.[version].repository);\n if (source.sourceUrl && source.sourceUrl !== dep.sourceUrl) {\n release.sourceUrl = source.sourceUrl;\n }\n if (\n source.sourceDirectory &&\n source.sourceDirectory !== dep.sourceDirectory\n ) {\n release.sourceDirectory = source.sourceDirectory;\n }\n if (dep.deprecationMessage) {\n release.isDeprecated = true;\n }\n return release;\n });\n\n const isPublic = resp.headers?.['cache-control']\n ?.toLocaleLowerCase()\n ?.split(regEx(/\\s*,\\s*/))\n ?.includes('public');\n if (!isPublic) {\n dep.isPrivate = true;\n }\n\n logger.trace({ dep }, 'dep');\n return dep;\n } catch (err) {\n const actualError = err instanceof ExternalHostError ? err.err : err;\n const ignoredStatusCodes = [401, 402, 403, 404];\n const ignoredResponseCodes = ['ENOTFOUND'];\n if (\n actualError.message === HOST_DISABLED ||\n ignoredStatusCodes.includes(actualError.statusCode) ||\n ignoredResponseCodes.includes(actualError.code)\n ) {\n return null;\n }\n\n if (err instanceof ExternalHostError) {\n if (actualError.name === 'ParseError' && actualError.body) {\n actualError.body = 'err.body deleted by Renovate';\n err.err = actualError;\n }\n throw err;\n }\n logger.debug({ err, packageName, registryUrl }, 'Unknown npm lookup error');\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"get.js","names":["hostRules.find"],"sources":["../../../../lib/modules/datasource/npm/get.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { HOST_DISABLED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { PackageHttpCacheProvider } from '../../../util/http/cache/package-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { DeepNullish } from '../../../util/schema-utils/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport { CachedPackument, NpmResponse } from './schema.ts';\n\nconst SHORT_REPO_REGEX = regEx(\n /^(?:(?<platform>bitbucket|github|gitlab):)?(?<shortRepo>[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+)$/,\n);\n\nconst platformMapping: Record<string, string> = {\n bitbucket: 'https://bitbucket.org/',\n github: 'https://github.com/',\n gitlab: 'https://gitlab.com/',\n};\n\ninterface PackageSource {\n sourceUrl: string | null;\n sourceDirectory: string | null;\n}\n\nconst PackageSource = z\n .union([\n z\n .string()\n .nonempty()\n .transform((repository): PackageSource => {\n let sourceUrl: string | null = null;\n const sourceDirectory = null;\n const shortMatch = repository.match(SHORT_REPO_REGEX);\n if (shortMatch?.groups) {\n const { platform = 'github', shortRepo } = shortMatch.groups;\n sourceUrl = platformMapping[platform] + shortRepo;\n } else {\n sourceUrl = repository;\n }\n return { sourceUrl, sourceDirectory };\n }),\n DeepNullish(\n z.object({\n url: z.string().nonempty().optional(),\n directory: z.string().nonempty().optional(),\n }),\n ).transform(({ url, directory }) => {\n const res: PackageSource = { sourceUrl: null, sourceDirectory: null };\n\n if (url) {\n res.sourceUrl = url;\n }\n\n if (directory) {\n res.sourceDirectory = directory;\n }\n\n return res;\n }),\n ])\n .catch({ sourceUrl: null, sourceDirectory: null });\n\nexport async function getDependency(\n http: Http,\n registryUrl: string,\n packageName: string,\n): Promise<ReleaseResult | null> {\n logger.trace(`npm.getDependency(${packageName})`);\n\n const packageUrl = joinUrlParts(registryUrl, packageName.replace('/', '%2F'));\n\n try {\n const cacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-npm:cache-provider',\n checkAuthorizationHeader: false, // We don't rely on whether user token is provided or not\n checkCacheControlHeader: true,\n writeSchema: CachedPackument,\n });\n const options: HttpOptions = { cacheProvider };\n\n // set abortOnError for registry.npmjs.org if no hostRule with explicit abortOnError exists\n if (\n registryUrl === defaultRegistryUrl &&\n hostRules.find({ url: defaultRegistryUrl })?.abortOnError === undefined\n ) {\n logger.trace(\n { packageName, registry: defaultRegistryUrl },\n 'setting abortOnError hostRule for well known host',\n );\n hostRules.add({\n matchHost: defaultRegistryUrl,\n abortOnError: true,\n });\n }\n\n const resp = await http.getJson(packageUrl, options, NpmResponse);\n const { body: res } = resp;\n if (!res.versions || !Object.keys(res.versions).length) {\n // Registry returned a 200 OK but with no versions\n logger.debug(`No versions returned for npm dependency ${packageName}`);\n return null;\n }\n\n const latestVersion = res.versions[res['dist-tags']?.latest ?? ''];\n res.repository ??= latestVersion?.repository;\n res.homepage ??= latestVersion?.homepage;\n\n const { sourceUrl, sourceDirectory } = PackageSource.parse(res.repository);\n\n // Simplify response before caching and returning\n const dep: ReleaseResult = {\n homepage: res.homepage,\n releases: [],\n tags: res['dist-tags'],\n registryUrl,\n };\n\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n\n if (sourceDirectory) {\n dep.sourceDirectory = sourceDirectory;\n }\n\n if (latestVersion?.deprecated) {\n dep.deprecationMessage = `On registry \\`${registryUrl}\\`, the \"latest\" version of dependency \\`${packageName}\\` has the following deprecation notice:\\n\\n\\`${latestVersion.deprecated}\\`\\n\\nMarking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.`;\n }\n dep.releases = Object.keys(res.versions).map((version) => {\n const release: Release = {\n version,\n gitRef: res.versions?.[version].gitHead,\n dependencies: res.versions?.[version].dependencies,\n devDependencies: res.versions?.[version].devDependencies,\n attestation: isString(res.versions?.[version].dist?.attestations?.url),\n };\n const releaseTimestamp = asTimestamp(res.time?.[version]);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (res.versions?.[version].deprecated) {\n release.isDeprecated = true;\n }\n const nodeConstraint = res.versions?.[version].engines?.node;\n if (isNonEmptyString(nodeConstraint)) {\n release.constraints = { node: [nodeConstraint] };\n }\n const source = PackageSource.parse(res.versions?.[version].repository);\n if (source.sourceUrl && source.sourceUrl !== dep.sourceUrl) {\n release.sourceUrl = source.sourceUrl;\n }\n if (\n source.sourceDirectory &&\n source.sourceDirectory !== dep.sourceDirectory\n ) {\n release.sourceDirectory = source.sourceDirectory;\n }\n if (dep.deprecationMessage) {\n release.isDeprecated = true;\n }\n return release;\n });\n\n const isPublic = resp.headers?.['cache-control']\n ?.toLocaleLowerCase()\n ?.split(regEx(/\\s*,\\s*/))\n ?.includes('public');\n if (!isPublic) {\n dep.isPrivate = true;\n }\n\n logger.trace({ dep }, 'dep');\n return dep;\n } catch (err) {\n const actualError = err instanceof ExternalHostError ? err.err : err;\n const ignoredStatusCodes = [401, 402, 403, 404];\n const ignoredResponseCodes = ['ENOTFOUND'];\n if (\n actualError.message === HOST_DISABLED ||\n ignoredStatusCodes.includes(actualError.statusCode) ||\n ignoredResponseCodes.includes(actualError.code)\n ) {\n return null;\n }\n\n if (err instanceof ExternalHostError) {\n if (actualError.name === 'ParseError' && actualError.body) {\n actualError.body = 'err.body deleted by Renovate';\n err.err = actualError;\n }\n throw err;\n }\n logger.debug({ err, packageName, registryUrl }, 'Unknown npm lookup error');\n return null;\n }\n}\n"],"mappings":"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"}
@@ -15,7 +15,7 @@ let packageRules = [];
15
15
  function envReplace(value, env = getEnv()) {
16
16
  /* v8 ignore next -- TODO: add test */
17
17
  if (!isString(value)) return value;
18
- const ENV_EXPR = regEx(/(\\*)\$\{([^}]+)\}/g);
18
+ const ENV_EXPR = regEx(/(?<esc>\\*)\$\{(?<envVarName>[^}]+)\}/g);
19
19
  return value.replace(ENV_EXPR, (match, _esc, envVarName) => {
20
20
  if (env[envVarName] === void 0) {
21
21
  logger.warn({ match }, "Failed to replace env in config");
@@ -1 +1 @@
1
- {"version":3,"file":"npmrc.js","names":["hostRules.add"],"sources":["../../../../lib/modules/datasource/npm/npmrc.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport ini from 'ini';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport type { PackageRule } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { HostRule } from '../../../types/index.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { ensureTrailingSlash, isHttpUrl } from '../../../util/url.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport type { NpmrcRules } from './types.ts';\n\nlet npmrc: Record<string, any> = {};\nlet npmrcRaw = '';\nlet packageRules: PackageRule[] = [];\n\nfunction envReplace(value: any, env = getEnv()): any {\n /* v8 ignore next -- TODO: add test */\n if (!isString(value)) {\n return value;\n }\n\n const ENV_EXPR = regEx(/(\\\\*)\\$\\{([^}]+)\\}/g);\n\n return value.replace(ENV_EXPR, (match, _esc, envVarName) => {\n if (env[envVarName] === undefined) {\n logger.warn({ match }, 'Failed to replace env in config');\n throw new Error('env-replace');\n }\n return env[envVarName];\n });\n}\n\nexport function getMatchHostFromNpmrcHost(input: string): string {\n if (input.startsWith('//')) {\n const matchHost = input.replace('//', '');\n if (matchHost.includes('/')) {\n return `https://${matchHost}`;\n }\n return matchHost;\n }\n return input;\n}\n\nexport function convertNpmrcToRules(npmrc: Record<string, any>): NpmrcRules {\n const rules: NpmrcRules = {\n hostRules: [],\n packageRules: [],\n };\n // Generate hostRules\n const hostType = 'npm';\n const hosts: Record<string, HostRule> = {};\n for (const [key, value] of Object.entries(npmrc)) {\n if (!isNonEmptyString(value)) {\n continue;\n }\n const keyParts = key.split(':');\n const keyType = keyParts.pop();\n let matchHost = '';\n if (keyParts.length) {\n matchHost = getMatchHostFromNpmrcHost(keyParts.join(':'));\n }\n const rule: HostRule = hosts[matchHost] || {};\n if (keyType === '_authToken' || keyType === '_auth') {\n rule.token = value;\n if (keyType === '_auth') {\n rule.authType = 'Basic';\n }\n } else if (keyType === 'username') {\n rule.username = value;\n } else if (keyType === '_password') {\n rule.password = fromBase64(value);\n } else {\n continue; // don't add the rule\n }\n hosts[matchHost] = rule;\n }\n for (const [matchHost, rule] of Object.entries(hosts)) {\n const hostRule = { ...rule, hostType };\n if (matchHost) {\n hostRule.matchHost = matchHost;\n }\n rules.hostRules?.push(hostRule);\n }\n // Generate packageRules\n const matchDatasources = ['npm'];\n const { registry } = npmrc;\n // packageRules order matters, so look for a default registry first\n if (isNonEmptyString(registry)) {\n if (isHttpUrl(registry)) {\n // Default registry\n rules.packageRules?.push({\n matchDatasources,\n registryUrls: [registry],\n });\n } else {\n logger.warn({ registry }, 'Invalid npmrc registry= URL');\n }\n }\n // Now look for scoped registries\n for (const [key, value] of Object.entries(npmrc)) {\n if (!isNonEmptyString(value)) {\n continue;\n }\n const keyParts = key.split(':');\n const keyType = keyParts.pop();\n if (keyType === 'registry' && keyParts.length && isNonEmptyString(value)) {\n const scope = keyParts.join(':');\n if (isHttpUrl(value)) {\n rules.packageRules?.push({\n matchDatasources,\n matchPackageNames: [`${scope}/**`],\n registryUrls: [value],\n });\n } else {\n logger.warn({ scope, registry: value }, 'Invalid npmrc registry= URL');\n }\n }\n }\n return rules;\n}\n\nexport function setNpmrc(input?: string): void {\n if (input) {\n if (input === npmrcRaw) {\n return;\n }\n const existingNpmrc = npmrc;\n npmrcRaw = input;\n logger.debug('Setting npmrc');\n npmrc = ini.parse(input.replace(regEx(/\\\\n/g), '\\n'));\n const exposeAllEnv = GlobalConfig.get('exposeAllEnv');\n for (const [key, val] of Object.entries(npmrc)) {\n if (\n !exposeAllEnv &&\n key.endsWith('registry') &&\n isString(val) &&\n val.includes('localhost')\n ) {\n logger.debug(\n { key, val },\n 'Detected localhost registry - rejecting npmrc file',\n );\n npmrc = existingNpmrc;\n return;\n }\n }\n if (exposeAllEnv) {\n for (const key of Object.keys(npmrc)) {\n npmrc[key] = envReplace(npmrc[key]);\n }\n }\n const npmrcRules = convertNpmrcToRules(npmrc);\n if (npmrcRules.hostRules?.length) {\n npmrcRules.hostRules.forEach((hostRule) => hostRules.add(hostRule));\n }\n packageRules = npmrcRules.packageRules;\n } else if (npmrc) {\n logger.debug('Resetting npmrc');\n npmrc = {};\n npmrcRaw = '';\n packageRules = [];\n }\n}\n\nexport function resolveRegistryUrl(packageName: string): string {\n let registryUrl = defaultRegistryUrl;\n for (const rule of packageRules) {\n const { matchPackageNames, registryUrls } = rule;\n if (\n !matchPackageNames ||\n packageName.startsWith(matchPackageNames[0].replace(regEx(/\\*\\*$/), ''))\n ) {\n // TODO: fix types #22198\n registryUrl = registryUrls![0];\n }\n }\n return registryUrl;\n}\n\nexport function resolvePackageUrl(\n registryUrl: string,\n packageName: string,\n): string {\n return new URL(\n encodeURIComponent(packageName).replace(regEx(/^%40/), '@'),\n ensureTrailingSlash(registryUrl),\n ).href;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"npmrc.js","names":["hostRules.add"],"sources":["../../../../lib/modules/datasource/npm/npmrc.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport ini from 'ini';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport type { PackageRule } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { HostRule } from '../../../types/index.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { ensureTrailingSlash, isHttpUrl } from '../../../util/url.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport type { NpmrcRules } from './types.ts';\n\nlet npmrc: Record<string, any> = {};\nlet npmrcRaw = '';\nlet packageRules: PackageRule[] = [];\n\nfunction envReplace(value: any, env = getEnv()): any {\n /* v8 ignore next -- TODO: add test */\n if (!isString(value)) {\n return value;\n }\n\n const ENV_EXPR = regEx(/(?<esc>\\\\*)\\$\\{(?<envVarName>[^}]+)\\}/g);\n\n return value.replace(ENV_EXPR, (match, _esc, envVarName) => {\n if (env[envVarName] === undefined) {\n logger.warn({ match }, 'Failed to replace env in config');\n throw new Error('env-replace');\n }\n return env[envVarName];\n });\n}\n\nexport function getMatchHostFromNpmrcHost(input: string): string {\n if (input.startsWith('//')) {\n const matchHost = input.replace('//', '');\n if (matchHost.includes('/')) {\n return `https://${matchHost}`;\n }\n return matchHost;\n }\n return input;\n}\n\nexport function convertNpmrcToRules(npmrc: Record<string, any>): NpmrcRules {\n const rules: NpmrcRules = {\n hostRules: [],\n packageRules: [],\n };\n // Generate hostRules\n const hostType = 'npm';\n const hosts: Record<string, HostRule> = {};\n for (const [key, value] of Object.entries(npmrc)) {\n if (!isNonEmptyString(value)) {\n continue;\n }\n const keyParts = key.split(':');\n const keyType = keyParts.pop();\n let matchHost = '';\n if (keyParts.length) {\n matchHost = getMatchHostFromNpmrcHost(keyParts.join(':'));\n }\n const rule: HostRule = hosts[matchHost] || {};\n if (keyType === '_authToken' || keyType === '_auth') {\n rule.token = value;\n if (keyType === '_auth') {\n rule.authType = 'Basic';\n }\n } else if (keyType === 'username') {\n rule.username = value;\n } else if (keyType === '_password') {\n rule.password = fromBase64(value);\n } else {\n continue; // don't add the rule\n }\n hosts[matchHost] = rule;\n }\n for (const [matchHost, rule] of Object.entries(hosts)) {\n const hostRule = { ...rule, hostType };\n if (matchHost) {\n hostRule.matchHost = matchHost;\n }\n rules.hostRules?.push(hostRule);\n }\n // Generate packageRules\n const matchDatasources = ['npm'];\n const { registry } = npmrc;\n // packageRules order matters, so look for a default registry first\n if (isNonEmptyString(registry)) {\n if (isHttpUrl(registry)) {\n // Default registry\n rules.packageRules?.push({\n matchDatasources,\n registryUrls: [registry],\n });\n } else {\n logger.warn({ registry }, 'Invalid npmrc registry= URL');\n }\n }\n // Now look for scoped registries\n for (const [key, value] of Object.entries(npmrc)) {\n if (!isNonEmptyString(value)) {\n continue;\n }\n const keyParts = key.split(':');\n const keyType = keyParts.pop();\n if (keyType === 'registry' && keyParts.length && isNonEmptyString(value)) {\n const scope = keyParts.join(':');\n if (isHttpUrl(value)) {\n rules.packageRules?.push({\n matchDatasources,\n matchPackageNames: [`${scope}/**`],\n registryUrls: [value],\n });\n } else {\n logger.warn({ scope, registry: value }, 'Invalid npmrc registry= URL');\n }\n }\n }\n return rules;\n}\n\nexport function setNpmrc(input?: string): void {\n if (input) {\n if (input === npmrcRaw) {\n return;\n }\n const existingNpmrc = npmrc;\n npmrcRaw = input;\n logger.debug('Setting npmrc');\n npmrc = ini.parse(input.replace(regEx(/\\\\n/g), '\\n'));\n const exposeAllEnv = GlobalConfig.get('exposeAllEnv');\n for (const [key, val] of Object.entries(npmrc)) {\n if (\n !exposeAllEnv &&\n key.endsWith('registry') &&\n isString(val) &&\n val.includes('localhost')\n ) {\n logger.debug(\n { key, val },\n 'Detected localhost registry - rejecting npmrc file',\n );\n npmrc = existingNpmrc;\n return;\n }\n }\n if (exposeAllEnv) {\n for (const key of Object.keys(npmrc)) {\n npmrc[key] = envReplace(npmrc[key]);\n }\n }\n const npmrcRules = convertNpmrcToRules(npmrc);\n if (npmrcRules.hostRules?.length) {\n npmrcRules.hostRules.forEach((hostRule) => hostRules.add(hostRule));\n }\n packageRules = npmrcRules.packageRules;\n } else if (npmrc) {\n logger.debug('Resetting npmrc');\n npmrc = {};\n npmrcRaw = '';\n packageRules = [];\n }\n}\n\nexport function resolveRegistryUrl(packageName: string): string {\n let registryUrl = defaultRegistryUrl;\n for (const rule of packageRules) {\n const { matchPackageNames, registryUrls } = rule;\n if (\n !matchPackageNames ||\n packageName.startsWith(matchPackageNames[0].replace(regEx(/\\*\\*$/), ''))\n ) {\n // TODO: fix types #22198\n registryUrl = registryUrls![0];\n }\n }\n return registryUrl;\n}\n\nexport function resolvePackageUrl(\n registryUrl: string,\n packageName: string,\n): string {\n return new URL(\n encodeURIComponent(packageName).replace(regEx(/^%40/), '@'),\n ensureTrailingSlash(registryUrl),\n ).href;\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { regEx } from "../../../util/regex.js";
2
2
  //#region lib/modules/datasource/pypi/common.ts
3
- const githubRepoPattern = regEx(/^https?:\/\/github\.com\/([^/]+)\/[^/]+$/);
3
+ const githubRepoPattern = regEx(/^https?:\/\/github\.com\/(?<owner>[^/]+)\/[^/]+$/);
4
4
  function isGitHubRepo(url) {
5
5
  const m = url.match(githubRepoPattern);
6
- return !!m && m[1] !== "sponsors";
6
+ return !!m && m.groups.owner !== "sponsors";
7
7
  }
8
8
  function normalizePythonDepName(name) {
9
9
  return name.replace(regEx(/[-_.]+/g), "-").toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":[],"sources":["../../../../lib/modules/datasource/pypi/common.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\n\nconst githubRepoPattern = regEx(/^https?:\\/\\/github\\.com\\/([^/]+)\\/[^/]+$/);\n\nexport function isGitHubRepo(url: string): boolean {\n const m = url.match(githubRepoPattern);\n return !!m && m[1] !== 'sponsors';\n}\n\n// https://packaging.python.org/en/latest/specifications/name-normalization/\nexport function normalizePythonDepName(name: string): string {\n return name.replace(regEx(/[-_.]+/g), '-').toLowerCase();\n}\n"],"mappings":";;AAEA,MAAM,oBAAoB,MAAM,0CAA0C;AAE1E,SAAgB,aAAa,KAAsB;CACjD,MAAM,IAAI,IAAI,MAAM,iBAAiB;CACrC,OAAO,CAAC,CAAC,KAAK,EAAE,OAAO;AACzB;AAGA,SAAgB,uBAAuB,MAAsB;CAC3D,OAAO,KAAK,QAAQ,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,YAAY;AACzD"}
1
+ {"version":3,"file":"common.js","names":[],"sources":["../../../../lib/modules/datasource/pypi/common.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\n\nconst githubRepoPattern = regEx(\n /^https?:\\/\\/github\\.com\\/(?<owner>[^/]+)\\/[^/]+$/,\n);\n\nexport function isGitHubRepo(url: string): boolean {\n const m = url.match(githubRepoPattern);\n return !!m && m.groups!.owner !== 'sponsors';\n}\n\n// https://packaging.python.org/en/latest/specifications/name-normalization/\nexport function normalizePythonDepName(name: string): string {\n return name.replace(regEx(/[-_.]+/g), '-').toLowerCase();\n}\n"],"mappings":";;AAEA,MAAM,oBAAoB,MACxB,kDACF;AAEA,SAAgB,aAAa,KAAsB;CACjD,MAAM,IAAI,IAAI,MAAM,iBAAiB;CACrC,OAAO,CAAC,CAAC,KAAK,EAAE,OAAQ,UAAU;AACpC;AAGA,SAAgB,uBAAuB,MAAsB;CAC3D,OAAO,KAAK,QAAQ,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,YAAY;AACzD"}
@@ -151,7 +151,7 @@ var PypiDatasource = class PypiDatasource extends Datasource {
151
151
  return null;
152
152
  }
153
153
  static cleanSimpleHtml(html) {
154
- return html.replace(regEx(/<\/?pre>/), "").replace(regEx(/data-requires-python="([^"]*?)>([^"]*?)"/g), "data-requires-python=\"$1&gt;$2\"").replace(regEx(/data-requires-python="([^"]*?)<([^"]*?)"/g), "data-requires-python=\"$1&lt;$2\"");
154
+ return html.replace(regEx(/<\/?pre>/), "").replace(regEx(/data-requires-python="(?<before>[^"]*?)>(?<after>[^"]*?)"/g), "data-requires-python=\"$<before>&gt;$<after>\"").replace(regEx(/data-requires-python="(?<before>[^"]*?)<(?<after>[^"]*?)"/g), "data-requires-python=\"$<before>&lt;$<after>\"");
155
155
  }
156
156
  static getSimpleReleasesFromHtml(html, packageName) {
157
157
  const links = parse(PypiDatasource.cleanSimpleHtml(html)).querySelectorAll("a");