renovate 43.263.1 → 43.263.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 (253) hide show
  1. package/dist/config/app-strings.js +1 -1
  2. package/dist/config/app-strings.js.map +1 -1
  3. package/dist/config/decrypt/bcpgp.js +7 -4
  4. package/dist/config/decrypt/bcpgp.js.map +1 -1
  5. package/dist/config/migration.js +4 -6
  6. package/dist/config/migration.js.map +1 -1
  7. package/dist/config/options/index.js +1 -1
  8. package/dist/config/options/index.js.map +1 -1
  9. package/dist/config/validation-helpers/match-base-branches.js +4 -6
  10. package/dist/config/validation-helpers/match-base-branches.js.map +1 -1
  11. package/dist/config/validation-helpers/regex-glob-matchers.js +4 -6
  12. package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
  13. package/dist/config/validation-helpers/utils.js +2 -4
  14. package/dist/config/validation-helpers/utils.js.map +1 -1
  15. package/dist/config/validation.js +4 -6
  16. package/dist/config/validation.js.map +1 -1
  17. package/dist/config-validator.js +1 -3
  18. package/dist/config-validator.js.map +1 -1
  19. package/dist/global-config-option-defaults.generated.js +1 -1
  20. package/dist/global-config-option-defaults.generated.js.map +1 -1
  21. package/dist/modules/datasource/artifactory/index.js +6 -8
  22. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  23. package/dist/modules/datasource/aws-machine-image/index.js +1 -2
  24. package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
  25. package/dist/modules/datasource/azure-pipelines-tasks/index.js +2 -3
  26. package/dist/modules/datasource/azure-pipelines-tasks/index.js.map +1 -1
  27. package/dist/modules/datasource/conda/index.js +1 -3
  28. package/dist/modules/datasource/conda/index.js.map +1 -1
  29. package/dist/modules/datasource/dart-version/index.js +1 -2
  30. package/dist/modules/datasource/dart-version/index.js.map +1 -1
  31. package/dist/modules/datasource/datasource.js +1 -3
  32. package/dist/modules/datasource/datasource.js.map +1 -1
  33. package/dist/modules/datasource/devbox/index.js +1 -3
  34. package/dist/modules/datasource/devbox/index.js.map +1 -1
  35. package/dist/modules/datasource/docker/ecr.js +2 -1
  36. package/dist/modules/datasource/docker/ecr.js.map +1 -1
  37. package/dist/modules/datasource/docker/index.js +1 -1
  38. package/dist/modules/datasource/docker/index.js.map +1 -1
  39. package/dist/modules/datasource/galaxy-collection/index.js +1 -1
  40. package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
  41. package/dist/modules/datasource/go/releases-goproxy.js +2 -2
  42. package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
  43. package/dist/modules/datasource/java-version/index.js +1 -3
  44. package/dist/modules/datasource/java-version/index.js.map +1 -1
  45. package/dist/modules/datasource/maven/util.js +2 -1
  46. package/dist/modules/datasource/maven/util.js.map +1 -1
  47. package/dist/modules/datasource/nuget/common.js +6 -4
  48. package/dist/modules/datasource/nuget/common.js.map +1 -1
  49. package/dist/modules/datasource/util.js +3 -2
  50. package/dist/modules/datasource/util.js.map +1 -1
  51. package/dist/modules/manager/azure-pipelines/extract.js +1 -1
  52. package/dist/modules/manager/azure-pipelines/extract.js.map +1 -1
  53. package/dist/modules/manager/bazel/extract.js +1 -3
  54. package/dist/modules/manager/bazel/extract.js.map +1 -1
  55. package/dist/modules/manager/bazel/parser.js +1 -1
  56. package/dist/modules/manager/bazel/parser.js.map +1 -1
  57. package/dist/modules/manager/buildpacks/extract.js +1 -1
  58. package/dist/modules/manager/buildpacks/extract.js.map +1 -1
  59. package/dist/modules/manager/bundler/common.js +23 -25
  60. package/dist/modules/manager/bundler/common.js.map +1 -1
  61. package/dist/modules/manager/bundler/extract.js +2 -6
  62. package/dist/modules/manager/bundler/extract.js.map +1 -1
  63. package/dist/modules/manager/cargo/extract.js +4 -6
  64. package/dist/modules/manager/cargo/extract.js.map +1 -1
  65. package/dist/modules/manager/dockerfile/extract.js +3 -3
  66. package/dist/modules/manager/dockerfile/extract.js.map +1 -1
  67. package/dist/modules/manager/fingerprint.generated.js +11 -11
  68. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  69. package/dist/modules/manager/flux/extract.js +2 -1
  70. package/dist/modules/manager/flux/extract.js.map +1 -1
  71. package/dist/modules/manager/github-actions/parse.js +1 -1
  72. package/dist/modules/manager/github-actions/parse.js.map +1 -1
  73. package/dist/modules/manager/gradle/extract/catalog.js +4 -3
  74. package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
  75. package/dist/modules/manager/gradle/extract.js +2 -2
  76. package/dist/modules/manager/gradle/extract.js.map +1 -1
  77. package/dist/modules/manager/gradle/parser/common.js +1 -1
  78. package/dist/modules/manager/gradle/parser/common.js.map +1 -1
  79. package/dist/modules/manager/gradle/parser/handlers.js +1 -1
  80. package/dist/modules/manager/gradle/parser/handlers.js.map +1 -1
  81. package/dist/modules/manager/helm-values/extract.js.map +1 -1
  82. package/dist/modules/manager/helmfile/extract.js +1 -1
  83. package/dist/modules/manager/helmfile/extract.js.map +1 -1
  84. package/dist/modules/manager/maven/extract.js.map +1 -1
  85. package/dist/modules/manager/maven/update.js +2 -1
  86. package/dist/modules/manager/maven/update.js.map +1 -1
  87. package/dist/modules/manager/mise/utils.js +5 -7
  88. package/dist/modules/manager/mise/utils.js.map +1 -1
  89. package/dist/modules/manager/npm/extract/common/overrides.js +1 -1
  90. package/dist/modules/manager/npm/extract/common/overrides.js.map +1 -1
  91. package/dist/modules/manager/npm/extract/yarn.js +1 -1
  92. package/dist/modules/manager/npm/extract/yarn.js.map +1 -1
  93. package/dist/modules/manager/npm/npmrc.js +1 -3
  94. package/dist/modules/manager/npm/npmrc.js.map +1 -1
  95. package/dist/modules/manager/npm/update/dependency/common.js +2 -3
  96. package/dist/modules/manager/npm/update/dependency/common.js.map +1 -1
  97. package/dist/modules/manager/npm/update/dependency/index.js +1 -1
  98. package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
  99. package/dist/modules/manager/npm/update/dependency/pnpm.js +1 -1
  100. package/dist/modules/manager/npm/update/dependency/pnpm.js.map +1 -1
  101. package/dist/modules/manager/npm/update/dependency/yarn.js +1 -1
  102. package/dist/modules/manager/npm/update/dependency/yarn.js.map +1 -1
  103. package/dist/modules/manager/osgi/extract.js +1 -1
  104. package/dist/modules/manager/osgi/extract.js.map +1 -1
  105. package/dist/modules/manager/pep621/processors/uv.js +1 -1
  106. package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
  107. package/dist/modules/manager/pep621/schema.js.map +1 -1
  108. package/dist/modules/manager/pip_setup/extract.js +1 -1
  109. package/dist/modules/manager/pip_setup/extract.js.map +1 -1
  110. package/dist/modules/manager/pipenv/artifacts.js.map +1 -1
  111. package/dist/modules/manager/poetry/schema.js +2 -2
  112. package/dist/modules/manager/poetry/schema.js.map +1 -1
  113. package/dist/modules/manager/pub/artifacts.js +4 -6
  114. package/dist/modules/manager/pub/artifacts.js.map +1 -1
  115. package/dist/modules/manager/pub/utils.js +2 -2
  116. package/dist/modules/manager/pub/utils.js.map +1 -1
  117. package/dist/modules/manager/puppet/common.js +4 -6
  118. package/dist/modules/manager/puppet/common.js.map +1 -1
  119. package/dist/modules/manager/sbt/extract.js +1 -1
  120. package/dist/modules/manager/sbt/extract.js.map +1 -1
  121. package/dist/modules/manager/sbt/util.js +4 -2
  122. package/dist/modules/manager/sbt/util.js.map +1 -1
  123. package/dist/modules/manager/terraform/lockfile/util.js +1 -1
  124. package/dist/modules/manager/terraform/lockfile/util.js.map +1 -1
  125. package/dist/modules/platform/azure/index.js +15 -19
  126. package/dist/modules/platform/azure/index.js.map +1 -1
  127. package/dist/modules/platform/azure/issue.js +4 -2
  128. package/dist/modules/platform/azure/issue.js.map +1 -1
  129. package/dist/modules/platform/bitbucket/index.js +1 -3
  130. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  131. package/dist/modules/platform/forgejo/index.js +5 -3
  132. package/dist/modules/platform/forgejo/index.js.map +1 -1
  133. package/dist/modules/platform/gerrit/scm.js +5 -7
  134. package/dist/modules/platform/gerrit/scm.js.map +1 -1
  135. package/dist/modules/platform/gitea/index.js +5 -3
  136. package/dist/modules/platform/gitea/index.js.map +1 -1
  137. package/dist/modules/platform/github/index.js +5 -7
  138. package/dist/modules/platform/github/index.js.map +1 -1
  139. package/dist/modules/platform/github/pr.js +1 -1
  140. package/dist/modules/platform/github/pr.js.map +1 -1
  141. package/dist/modules/platform/github/schema.d.ts +4 -4
  142. package/dist/modules/platform/gitlab/index.js +2 -1
  143. package/dist/modules/platform/gitlab/index.js.map +1 -1
  144. package/dist/modules/platform/utils/pr-body.js +2 -1
  145. package/dist/modules/platform/utils/pr-body.js.map +1 -1
  146. package/dist/modules/versioning/apk/index.js +3 -3
  147. package/dist/modules/versioning/apk/index.js.map +1 -1
  148. package/dist/modules/versioning/composer/index.js +4 -7
  149. package/dist/modules/versioning/composer/index.js.map +1 -1
  150. package/dist/modules/versioning/conan/common.js +4 -6
  151. package/dist/modules/versioning/conan/common.js.map +1 -1
  152. package/dist/modules/versioning/conan/index.js +1 -3
  153. package/dist/modules/versioning/conan/index.js.map +1 -1
  154. package/dist/modules/versioning/conan/range.js +4 -5
  155. package/dist/modules/versioning/conan/range.js.map +1 -1
  156. package/dist/modules/versioning/conda/index.js +1 -1
  157. package/dist/modules/versioning/conda/index.js.map +1 -1
  158. package/dist/modules/versioning/gradle/index.js +7 -3
  159. package/dist/modules/versioning/gradle/index.js.map +1 -1
  160. package/dist/modules/versioning/hermit/index.js +2 -2
  161. package/dist/modules/versioning/hermit/index.js.map +1 -1
  162. package/dist/modules/versioning/ivy/index.js +1 -1
  163. package/dist/modules/versioning/ivy/index.js.map +1 -1
  164. package/dist/modules/versioning/maven/compare.js +4 -6
  165. package/dist/modules/versioning/maven/compare.js.map +1 -1
  166. package/dist/modules/versioning/npm/range.js +5 -7
  167. package/dist/modules/versioning/npm/range.js.map +1 -1
  168. package/dist/modules/versioning/nuget/version.js +6 -6
  169. package/dist/modules/versioning/nuget/version.js.map +1 -1
  170. package/dist/modules/versioning/pep440/index.js +1 -1
  171. package/dist/modules/versioning/pep440/index.js.map +1 -1
  172. package/dist/modules/versioning/pep440/range.js +2 -6
  173. package/dist/modules/versioning/pep440/range.js.map +1 -1
  174. package/dist/modules/versioning/poetry/index.js +1 -1
  175. package/dist/modules/versioning/poetry/index.js.map +1 -1
  176. package/dist/modules/versioning/pvp/index.js +2 -2
  177. package/dist/modules/versioning/pvp/index.js.map +1 -1
  178. package/dist/modules/versioning/rpm/index.js +4 -3
  179. package/dist/modules/versioning/rpm/index.js.map +1 -1
  180. package/dist/modules/versioning/ruby/range.js +2 -2
  181. package/dist/modules/versioning/ruby/range.js.map +1 -1
  182. package/dist/modules/versioning/ruby/strategies/bump.js +1 -1
  183. package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
  184. package/dist/modules/versioning/ruby/strategies/replace.js +13 -12
  185. package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
  186. package/dist/modules/versioning/ruby/version.js +1 -1
  187. package/dist/modules/versioning/ruby/version.js.map +1 -1
  188. package/dist/modules/versioning/rust-release-channel/index.js +1 -1
  189. package/dist/modules/versioning/rust-release-channel/index.js.map +1 -1
  190. package/dist/modules/versioning/rust-release-channel/util.js +4 -4
  191. package/dist/modules/versioning/rust-release-channel/util.js.map +1 -1
  192. package/dist/util/common.js +1 -3
  193. package/dist/util/common.js.map +1 -1
  194. package/dist/util/exec/common.js +4 -6
  195. package/dist/util/exec/common.js.map +1 -1
  196. package/dist/util/exec/containerbase.js +1 -3
  197. package/dist/util/exec/containerbase.js.map +1 -1
  198. package/dist/util/git/instrument.js +3 -3
  199. package/dist/util/git/instrument.js.map +1 -1
  200. package/dist/util/github/graphql/datasource-fetcher.js +5 -4
  201. package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
  202. package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
  203. package/dist/util/http/github.js +3 -2
  204. package/dist/util/http/github.js.map +1 -1
  205. package/dist/util/http/http.d.ts +1 -1
  206. package/dist/util/http/http.js.map +1 -1
  207. package/dist/util/result.d.ts +8 -8
  208. package/dist/util/result.js +1 -1
  209. package/dist/util/result.js.map +1 -1
  210. package/dist/util/url.js +2 -2
  211. package/dist/util/url.js.map +1 -1
  212. package/dist/workers/global/config/parse/cli.js +18 -20
  213. package/dist/workers/global/config/parse/cli.js.map +1 -1
  214. package/dist/workers/global/config/parse/env.js +3 -5
  215. package/dist/workers/global/config/parse/env.js.map +1 -1
  216. package/dist/workers/repository/config-migration/branch/index.js +3 -5
  217. package/dist/workers/repository/config-migration/branch/index.js.map +1 -1
  218. package/dist/workers/repository/init/merge.js +2 -3
  219. package/dist/workers/repository/init/merge.js.map +1 -1
  220. package/dist/workers/repository/onboarding/branch/check.js +7 -9
  221. package/dist/workers/repository/onboarding/branch/check.js.map +1 -1
  222. package/dist/workers/repository/onboarding/branch/index.js +4 -8
  223. package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
  224. package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js +2 -2
  225. package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js.map +1 -1
  226. package/dist/workers/repository/process/extract-update.js.map +1 -1
  227. package/dist/workers/repository/process/fetch.js.map +1 -1
  228. package/dist/workers/repository/process/libyear.js +1 -3
  229. package/dist/workers/repository/process/libyear.js.map +1 -1
  230. package/dist/workers/repository/process/lookup/filter-checks.js +9 -11
  231. package/dist/workers/repository/process/lookup/filter-checks.js.map +1 -1
  232. package/dist/workers/repository/process/lookup/index.js +5 -8
  233. package/dist/workers/repository/process/lookup/index.js.map +1 -1
  234. package/dist/workers/repository/process/vulnerabilities.js +3 -3
  235. package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
  236. package/dist/workers/repository/reconfigure/index.js +3 -5
  237. package/dist/workers/repository/reconfigure/index.js.map +1 -1
  238. package/dist/workers/repository/update/branch/bump-versions.js +1 -1
  239. package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
  240. package/dist/workers/repository/update/branch/get-updated.js +3 -5
  241. package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
  242. package/dist/workers/repository/update/pr/body/updates-table.js +1 -3
  243. package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
  244. package/dist/workers/repository/update/pr/changelog/common.js +1 -1
  245. package/dist/workers/repository/update/pr/changelog/common.js.map +1 -1
  246. package/dist/workers/repository/update/pr/index.js +6 -7
  247. package/dist/workers/repository/update/pr/index.js.map +1 -1
  248. package/dist/workers/repository/updates/flatten.js +1 -1
  249. package/dist/workers/repository/updates/flatten.js.map +1 -1
  250. package/dist/workers/repository/updates/generate.js +1 -1
  251. package/dist/workers/repository/updates/generate.js.map +1 -1
  252. package/package.json +2 -2
  253. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","names":["packageCache.get","HttpError","packageCache.set","packageCache.getCacheType"],"sources":["../../../../lib/modules/datasource/maven/util.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { GetObjectCommand } from '@aws-sdk/client-s3';\nimport { XmlDocument } from 'xmldoc';\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 packageCache from '../../../util/cache/package/index.ts';\nimport { PackageHttpCacheProvider } from '../../../util/http/cache/package-http-cache-provider.ts';\nimport { type Http, HttpError } from '../../../util/http/index.ts';\nimport type { HttpOptions, HttpResponse } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { getS3Client, parseS3Url } from '../../../util/s3.ts';\nimport { streamToString } from '../../../util/streams.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash, isHttpUrl } from '../../../util/url.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { isMavenCentral } from './common.ts';\nimport { CachedMavenXml } from './schema.ts';\nimport type {\n DependencyInfo,\n MavenDependency,\n MavenFetchResult,\n MavenFetchSuccess,\n} from './types.ts';\n\nfunction isTemporaryError(err: HttpError): boolean {\n if (err.code === 'ECONNRESET') {\n return true;\n }\n\n if (err.response) {\n const status = err.response.statusCode;\n return status === 429 || (status >= 500 && status < 600);\n }\n\n return false;\n}\n\nfunction isHostError(err: HttpError): boolean {\n return err.code === 'ETIMEDOUT';\n}\n\nfunction isNotFoundError(err: HttpError): boolean {\n return err.code === 'ENOTFOUND' || err.response?.statusCode === 404;\n}\n\nfunction isPermissionsIssue(err: HttpError): boolean {\n const status = err.response?.statusCode;\n return status === 401 || status === 403;\n}\n\nfunction isConnectionError(err: HttpError): boolean {\n return (\n err.code === 'EAI_AGAIN' ||\n err.code === 'ERR_TLS_CERT_ALTNAME_INVALID' ||\n err.code === 'ECONNREFUSED'\n );\n}\n\nfunction isUnsupportedHostError(err: HttpError): boolean {\n return err.name === 'UnsupportedProtocolError';\n}\n\nconst cacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-maven:cache-provider',\n softTtlMinutes: 15,\n checkAuthorizationHeader: true,\n checkCacheControlHeader: false, // Maven doesn't respond with `cache-control` headers\n writeSchema: CachedMavenXml,\n});\n\n// Release POMs and timestamped snapshot POMs are immutable once published, so we can cache them much longer than mutable metadata files.\nconst pomCacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-maven:pom-cache-provider',\n softTtlMinutes: 60 * 24 * 28, // 28 days before we'll give it another check, just in case it's updated\n checkAuthorizationHeader: true,\n checkCacheControlHeader: false,\n writeSchema: CachedMavenXml,\n});\n\nfunction selectCacheProvider(url: string): PackageHttpCacheProvider {\n // Non-timestamped -SNAPSHOT.pom files are mutable; everything else ending in .pom (release POMs and timestamped snapshot POMs) is immutable.\n if (url.endsWith('.pom') && !url.endsWith('-SNAPSHOT.pom')) {\n return pomCacheProvider;\n }\n return cacheProvider;\n}\n\nconst METADATA_NOT_FOUND_NAMESPACE =\n 'datasource-maven:metadata-not-found' as const;\nconst METADATA_NOT_FOUND_TTL_MINUTES = 60 * 12; // 12 hours\n\n/** introduces jitter to make sure that a given repo's cache expiring doesn't lead to many requests leading to high traffic and/or rate limits */\nfunction getMetadataNotFoundTtl(): number {\n const jitter = Math.floor(Math.random() * 60 * 2); // 0–120 minutes\n return METADATA_NOT_FOUND_TTL_MINUTES + jitter;\n}\n\nfunction isMetadataUrl(url: string): boolean {\n return url.endsWith('/maven-metadata.xml');\n}\n\nexport async function downloadHttpProtocol(\n http: Http,\n pkgUrl: URL | string,\n opts: HttpOptions = {},\n): Promise<MavenFetchResult> {\n const url = pkgUrl.toString();\n\n if (isMetadataUrl(url)) {\n const cacheHasNotFoundResponse = await packageCache.get<true>(\n METADATA_NOT_FOUND_NAMESPACE,\n url,\n );\n if (cacheHasNotFoundResponse) {\n logger.trace(\n { url },\n 'Returning cached 404 response for the metadata-metadata URL request',\n );\n return Result.err({ type: 'not-found' });\n }\n }\n\n const fetchResult = await Result.wrap<HttpResponse, Error>(\n http.getText(url, { ...opts, cacheProvider: selectCacheProvider(url) }),\n )\n .transform((res): MavenFetchSuccess => {\n const result: MavenFetchSuccess = { data: res.body };\n\n if (!res.authorization) {\n result.isCacheable = true;\n }\n\n const lastModified = asTimestamp(res?.headers?.['last-modified']);\n if (lastModified) {\n result.lastModified = lastModified;\n }\n\n return result;\n })\n .catch(async (err): Promise<MavenFetchResult> => {\n /* v8 ignore next: never happens, needs for type narrowing */\n if (!(err instanceof HttpError)) {\n return Result.err({ type: 'unknown', err });\n }\n\n const failedUrl = url;\n if (err.message === HOST_DISABLED) {\n logger.trace({ failedUrl }, 'Host disabled');\n return Result.err({ type: 'host-disabled' });\n }\n\n if (isNotFoundError(err)) {\n logger.trace({ failedUrl }, `Url not found`);\n if (isMetadataUrl(failedUrl)) {\n await packageCache.set(\n METADATA_NOT_FOUND_NAMESPACE,\n failedUrl,\n true,\n getMetadataNotFoundTtl(),\n );\n }\n return Result.err({ type: 'not-found' });\n }\n\n if (isHostError(err)) {\n logger.debug(`Cannot connect to host ${failedUrl}`);\n return Result.err({ type: 'host-error' });\n }\n\n if (isPermissionsIssue(err)) {\n logger.debug(\n `Dependency lookup unauthorized. Please add authentication with a hostRule for ${failedUrl}`,\n );\n return Result.err({ type: 'permission-issue' });\n }\n\n if (isTemporaryError(err)) {\n logger.debug({ failedUrl, err }, 'Temporary error');\n\n if (isMavenCentral(url)) {\n const statusCode = err?.response?.statusCode;\n if (statusCode === 429) {\n if (packageCache.getCacheType() === 'redis') {\n logger.once.warn(\n { failedUrl },\n 'Maven Central rate limiting detected despite Redis caching.',\n );\n } else {\n logger.once.warn(\n { failedUrl },\n 'Maven Central rate limiting detected. Persistent caching required.',\n );\n }\n }\n return Result.err({ type: 'maven-central-temporary-error', err });\n } else {\n return Result.err({ type: 'temporary-error' });\n }\n }\n\n if (isConnectionError(err)) {\n logger.debug(`Connection refused to maven registry ${failedUrl}`);\n return Result.err({ type: 'connection-error' });\n }\n\n if (isUnsupportedHostError(err)) {\n logger.debug(`Unsupported host ${failedUrl}`);\n return Result.err({ type: 'unsupported-host' });\n }\n\n logger.info({ failedUrl, err }, 'Unknown HTTP download error');\n return Result.err({ type: 'unknown', err });\n });\n\n const { err } = fetchResult.unwrap();\n if (err?.type === 'maven-central-temporary-error') {\n throw new ExternalHostError(err.err);\n }\n\n return fetchResult;\n}\n\nexport async function downloadHttpContent(\n http: Http,\n pkgUrl: URL | string,\n opts: HttpOptions = {},\n): Promise<string | null> {\n const fetchResult = await downloadHttpProtocol(http, pkgUrl, opts);\n return fetchResult.transform(({ data }) => data).unwrapOrNull();\n}\n\nfunction isS3NotFound(err: Error): boolean {\n return err.message === 'NotFound' || err.message === 'NoSuchKey';\n}\n\nexport async function downloadS3Protocol(\n pkgUrl: URL,\n): Promise<MavenFetchResult> {\n logger.trace({ url: pkgUrl.toString() }, `Attempting to load S3 dependency`);\n\n const s3Url = parseS3Url(pkgUrl);\n if (!s3Url) {\n return Result.err({ type: 'invalid-url' });\n }\n\n return await Result.wrap(() => {\n const command = new GetObjectCommand(s3Url);\n const client = getS3Client();\n return client.send(command);\n })\n .transform(\n async ({\n Body,\n LastModified,\n DeleteMarker,\n }): Promise<MavenFetchResult> => {\n if (DeleteMarker) {\n logger.trace(\n { failedUrl: pkgUrl.toString() },\n 'Maven S3 lookup error: DeleteMarker encountered',\n );\n return Result.err({ type: 'not-found' });\n }\n\n if (!(Body instanceof Readable)) {\n logger.debug(\n { failedUrl: pkgUrl.toString() },\n 'Maven S3 lookup error: unsupported Body type',\n );\n return Result.err({ type: 'unsupported-format' });\n }\n\n const data = await streamToString(Body);\n const result: MavenFetchSuccess = { data };\n\n const lastModified = asTimestamp(LastModified);\n if (lastModified) {\n result.lastModified = lastModified;\n }\n\n return Result.ok(result);\n },\n )\n .catch((err): MavenFetchResult => {\n if (!(err instanceof Error)) {\n return Result.err(err);\n }\n\n const failedUrl = pkgUrl.toString();\n\n if (err.name === 'CredentialsProviderError') {\n logger.debug(\n { failedUrl },\n 'Maven S3 lookup error: credentials provider error, check \"AWS_ACCESS_KEY_ID\" and \"AWS_SECRET_ACCESS_KEY\" variables',\n );\n return Result.err({ type: 'credentials-error' });\n }\n\n if (err.message === 'Region is missing') {\n logger.debug(\n { failedUrl },\n 'Maven S3 lookup error: missing region, check \"AWS_REGION\" variable',\n );\n return Result.err({ type: 'missing-aws-region' });\n }\n\n if (isS3NotFound(err)) {\n logger.trace({ failedUrl }, 'Maven S3 lookup error: object not found');\n return Result.err({ type: 'not-found' });\n }\n\n logger.debug({ failedUrl, err }, 'Maven S3 lookup error: unknown error');\n return Result.err({ type: 'unknown', err });\n });\n}\n\nexport async function downloadArtifactRegistryProtocol(\n http: Http,\n pkgUrl: URL,\n): Promise<MavenFetchResult> {\n const opts: HttpOptions = {};\n const host = pkgUrl.host;\n const path = pkgUrl.pathname;\n\n logger.trace({ host, path }, `Using google auth for Maven repository`);\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { host, path },\n 'Could not get Google access token, using no auth',\n );\n }\n\n const url = pkgUrl.toString().replace('artifactregistry:', 'https:');\n\n return downloadHttpProtocol(http, url, opts);\n}\n\nfunction containsPlaceholder(str: string): boolean {\n return regEx(/\\${.*?}/g).test(str);\n}\n\nfunction removeKnownPlaceholders(str: string): string {\n return str.replace(regEx(/\\/tree\\/\\${[^}]+}/), '');\n}\n\nexport function getMavenUrl(\n dependency: MavenDependency,\n repoUrl: string,\n path: string,\n): URL {\n return new URL(\n `${dependency.dependencyUrl}/${path}`,\n ensureTrailingSlash(repoUrl),\n );\n}\n\nexport async function downloadMaven(\n http: Http,\n url: URL,\n): Promise<MavenFetchResult> {\n const protocol = url.protocol;\n\n let result: MavenFetchResult = Result.err({ type: 'unsupported-protocol' });\n\n if (isHttpUrl(url)) {\n result = await downloadHttpProtocol(http, url);\n }\n\n if (protocol === 'artifactregistry:') {\n result = await downloadArtifactRegistryProtocol(http, url);\n }\n\n if (protocol === 's3:') {\n result = await downloadS3Protocol(url);\n }\n\n return result.onError((err) => {\n if (err.type === 'unsupported-protocol') {\n logger.debug(\n { url: url.toString() },\n `Maven lookup error: unsupported protocol (${protocol})`,\n );\n }\n });\n}\n\nexport async function downloadMavenXml(\n http: Http,\n url: URL,\n): Promise<MavenFetchResult<XmlDocument>> {\n const rawResult = await downloadMaven(http, url);\n return rawResult.transform((result): MavenFetchResult<XmlDocument> => {\n try {\n return Result.ok({\n ...result,\n data: new XmlDocument(result.data),\n });\n } catch (err) {\n return Result.err({ type: 'xml-parse-error', err });\n }\n });\n}\n\nexport function getDependencyParts(packageName: string): MavenDependency {\n const [group, name] = packageName.split(':');\n const dependencyUrl = `${group.replace(regEx(/\\./g), '/')}/${name}`;\n return {\n display: packageName,\n group,\n name,\n dependencyUrl,\n };\n}\n\nfunction extractSnapshotVersion(metadata: XmlDocument): string | null {\n // Parse the maven-metadata.xml for the snapshot version and determine\n // the fixed version of the latest deployed snapshot.\n // The metadata descriptor can be found at\n // https://maven.apache.org/ref/3.3.3/maven-repository-metadata/repository-metadata.html\n //\n // Basically, we need to replace -SNAPSHOT with the artifact timestanp & build number,\n // so for example 1.0.0-SNAPSHOT will become 1.0.0-<timestamp>-<buildNumber>\n const version = metadata\n .descendantWithPath('version')\n ?.val?.replace('-SNAPSHOT', '');\n\n const snapshot = metadata.descendantWithPath('versioning.snapshot');\n const timestamp = snapshot?.childNamed('timestamp')?.val;\n const build = snapshot?.childNamed('buildNumber')?.val;\n\n // If we weren't able to parse out the required 3 version elements,\n // return null because we can't determine the fixed version of the latest snapshot.\n if (!version || !timestamp || !build) {\n return null;\n }\n return `${version}-${timestamp}-${build}`;\n}\n\nasync function getSnapshotFullVersion(\n http: Http,\n version: string,\n dependency: MavenDependency,\n repoUrl: string,\n): Promise<string | null> {\n // To determine what actual files are available for the snapshot, first we have to fetch and parse\n // the metadata located at http://<repo>/<group>/<artifact>/<version-SNAPSHOT>/maven-metadata.xml\n const metadataUrl = getMavenUrl(\n dependency,\n repoUrl,\n `${version}/maven-metadata.xml`,\n );\n\n const metadataXmlResult = await downloadMavenXml(http, metadataUrl);\n\n return metadataXmlResult\n .transform(({ data }) =>\n Result.wrapNullable(extractSnapshotVersion(data), {\n type: 'snapshot-extract-error',\n }),\n )\n .unwrapOrNull();\n}\n\nfunction isSnapshotVersion(version: string): boolean {\n if (version.endsWith('-SNAPSHOT')) {\n return true;\n }\n return false;\n}\n\nexport async function createUrlForDependencyPom(\n http: Http,\n version: string,\n dependency: MavenDependency,\n repoUrl: string,\n): Promise<string> {\n if (isSnapshotVersion(version)) {\n // By default, Maven snapshots are deployed to the repository with fixed file names.\n // Resolve the full, actual pom file name for the version.\n const fullVersion = await getSnapshotFullVersion(\n http,\n version,\n dependency,\n repoUrl,\n );\n\n // If we were able to resolve the version, use that, otherwise fall back to using -SNAPSHOT\n if (fullVersion !== null) {\n // TODO: types (#22198)\n return `${version}/${dependency.name}-${fullVersion}.pom`;\n }\n }\n\n // TODO: types (#22198)\n return `${version}/${dependency.name}-${version}.pom`;\n}\n\nexport async function getDependencyInfo(\n http: Http,\n dependency: MavenDependency,\n repoUrl: string,\n version: string,\n recursionLimit = 5,\n): Promise<DependencyInfo> {\n const path = await createUrlForDependencyPom(\n http,\n version,\n dependency,\n repoUrl,\n );\n\n const pomUrl = getMavenUrl(dependency, repoUrl, path);\n const pomXmlResult = await downloadMavenXml(http, pomUrl);\n const dependencyInfoResult = await pomXmlResult.transform(\n async ({ data: pomContent }) => {\n const result: DependencyInfo = {};\n\n const homepage = pomContent.valueWithPath('url');\n if (homepage && !containsPlaceholder(homepage)) {\n result.homepage = homepage;\n }\n\n const sourceUrl = pomContent.valueWithPath('scm.url');\n if (\n sourceUrl &&\n !containsPlaceholder(removeKnownPlaceholders(sourceUrl))\n ) {\n result.sourceUrl = sourceUrl\n .replace(regEx(/^scm:/), '')\n .replace(regEx(/^git:/), '')\n .replace(regEx(/^git@github.com:/), 'https://github.com/')\n .replace(regEx(/^git@github.com\\//), 'https://github.com/');\n\n if (result.sourceUrl.startsWith('//')) {\n // most likely the result of us stripping scm:, git: etc\n // going with prepending https: here which should result in potential information retrival\n result.sourceUrl = `https:${result.sourceUrl}`;\n }\n }\n\n const relocation = pomContent.descendantWithPath(\n 'distributionManagement.relocation',\n );\n if (relocation) {\n const relocationGroup =\n relocation.valueWithPath('groupId') ?? dependency.group;\n const relocationName =\n relocation.valueWithPath('artifactId') ?? dependency.name;\n result.replacementName = `${relocationGroup}:${relocationName}`;\n const relocationVersion = relocation.valueWithPath('version');\n result.replacementVersion = relocationVersion ?? version;\n const relocationMessage = relocation.valueWithPath('message');\n if (relocationMessage) {\n result.deprecationMessage = relocationMessage;\n }\n }\n\n const groupId = pomContent.valueWithPath('groupId');\n if (groupId) {\n result.packageScope = groupId;\n }\n\n const parent = pomContent.childNamed('parent');\n if (\n recursionLimit > 0 &&\n parent &&\n (!result.sourceUrl || !result.homepage)\n ) {\n // if we found a parent and are missing some information\n // trying to get the scm/homepage information from it\n const [parentGroupId, parentArtifactId, parentVersion] = [\n 'groupId',\n 'artifactId',\n 'version',\n ].map((k) => parent.valueWithPath(k)?.replace(/\\s+/g, ''));\n if (parentGroupId && parentArtifactId && parentVersion) {\n const parentDisplayId = `${parentGroupId}:${parentArtifactId}`;\n const parentDependency = getDependencyParts(parentDisplayId);\n const parentInformation = await getDependencyInfo(\n http,\n parentDependency,\n repoUrl,\n parentVersion,\n recursionLimit - 1,\n );\n if (!result.sourceUrl && parentInformation.sourceUrl) {\n result.sourceUrl = parentInformation.sourceUrl;\n }\n if (!result.homepage && parentInformation.homepage) {\n result.homepage = parentInformation.homepage;\n }\n }\n }\n\n return result;\n },\n );\n\n return dependencyInfoResult.unwrapOr({});\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"util.js","names":["packageCache.get","HttpError","packageCache.set","packageCache.getCacheType"],"sources":["../../../../lib/modules/datasource/maven/util.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { GetObjectCommand } from '@aws-sdk/client-s3';\nimport { XmlDocument } from 'xmldoc';\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 packageCache from '../../../util/cache/package/index.ts';\nimport { PackageHttpCacheProvider } from '../../../util/http/cache/package-http-cache-provider.ts';\nimport { type Http, HttpError } from '../../../util/http/index.ts';\nimport type { HttpOptions, HttpResponse } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { getS3Client, parseS3Url } from '../../../util/s3.ts';\nimport { streamToString } from '../../../util/streams.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash, isHttpUrl } from '../../../util/url.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { isMavenCentral } from './common.ts';\nimport { CachedMavenXml } from './schema.ts';\nimport type {\n DependencyInfo,\n MavenDependency,\n MavenFetchResult,\n MavenFetchSuccess,\n} from './types.ts';\n\nfunction isTemporaryError(err: HttpError): boolean {\n if (err.code === 'ECONNRESET') {\n return true;\n }\n\n if (err.response) {\n const status = err.response.statusCode;\n return status === 429 || (status >= 500 && status < 600);\n }\n\n return false;\n}\n\nfunction isHostError(err: HttpError): boolean {\n return err.code === 'ETIMEDOUT';\n}\n\nfunction isNotFoundError(err: HttpError): boolean {\n return err.code === 'ENOTFOUND' || err.response?.statusCode === 404;\n}\n\nfunction isPermissionsIssue(err: HttpError): boolean {\n const status = err.response?.statusCode;\n return status === 401 || status === 403;\n}\n\nfunction isConnectionError(err: HttpError): boolean {\n return (\n err.code === 'EAI_AGAIN' ||\n err.code === 'ERR_TLS_CERT_ALTNAME_INVALID' ||\n err.code === 'ECONNREFUSED'\n );\n}\n\nfunction isUnsupportedHostError(err: HttpError): boolean {\n return err.name === 'UnsupportedProtocolError';\n}\n\nconst cacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-maven:cache-provider',\n softTtlMinutes: 15,\n checkAuthorizationHeader: true,\n checkCacheControlHeader: false, // Maven doesn't respond with `cache-control` headers\n writeSchema: CachedMavenXml,\n});\n\n// Release POMs and timestamped snapshot POMs are immutable once published, so we can cache them much longer than mutable metadata files.\nconst pomCacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-maven:pom-cache-provider',\n softTtlMinutes: 60 * 24 * 28, // 28 days before we'll give it another check, just in case it's updated\n checkAuthorizationHeader: true,\n checkCacheControlHeader: false,\n writeSchema: CachedMavenXml,\n});\n\nfunction selectCacheProvider(url: string): PackageHttpCacheProvider {\n // Non-timestamped -SNAPSHOT.pom files are mutable; everything else ending in .pom (release POMs and timestamped snapshot POMs) is immutable.\n if (url.endsWith('.pom') && !url.endsWith('-SNAPSHOT.pom')) {\n return pomCacheProvider;\n }\n return cacheProvider;\n}\n\nconst METADATA_NOT_FOUND_NAMESPACE =\n 'datasource-maven:metadata-not-found' as const;\nconst METADATA_NOT_FOUND_TTL_MINUTES = 60 * 12; // 12 hours\n\n/** introduces jitter to make sure that a given repo's cache expiring doesn't lead to many requests leading to high traffic and/or rate limits */\nfunction getMetadataNotFoundTtl(): number {\n const jitter = Math.floor(Math.random() * 60 * 2); // 0–120 minutes\n return METADATA_NOT_FOUND_TTL_MINUTES + jitter;\n}\n\nfunction isMetadataUrl(url: string): boolean {\n return url.endsWith('/maven-metadata.xml');\n}\n\nexport async function downloadHttpProtocol(\n http: Http,\n pkgUrl: URL | string,\n opts: HttpOptions = {},\n): Promise<MavenFetchResult> {\n const url = pkgUrl.toString();\n\n if (isMetadataUrl(url)) {\n const cacheHasNotFoundResponse = await packageCache.get<true>(\n METADATA_NOT_FOUND_NAMESPACE,\n url,\n );\n if (cacheHasNotFoundResponse) {\n logger.trace(\n { url },\n 'Returning cached 404 response for the metadata-metadata URL request',\n );\n return Result.err({ type: 'not-found' });\n }\n }\n\n const fetchResult = await Result.wrap<HttpResponse>(\n http.getText(url, { ...opts, cacheProvider: selectCacheProvider(url) }),\n )\n .transform((res): MavenFetchSuccess => {\n const result: MavenFetchSuccess = { data: res.body };\n\n if (!res.authorization) {\n result.isCacheable = true;\n }\n\n const lastModified = asTimestamp(res?.headers?.['last-modified']);\n if (lastModified) {\n result.lastModified = lastModified;\n }\n\n return result;\n })\n .catch(async (err): Promise<MavenFetchResult> => {\n /* v8 ignore next: never happens, needs for type narrowing */\n if (!(err instanceof HttpError)) {\n return Result.err({ type: 'unknown', err });\n }\n\n const failedUrl = url;\n if (err.message === HOST_DISABLED) {\n logger.trace({ failedUrl }, 'Host disabled');\n return Result.err({ type: 'host-disabled' });\n }\n\n if (isNotFoundError(err)) {\n logger.trace({ failedUrl }, `Url not found`);\n if (isMetadataUrl(failedUrl)) {\n await packageCache.set(\n METADATA_NOT_FOUND_NAMESPACE,\n failedUrl,\n true,\n getMetadataNotFoundTtl(),\n );\n }\n return Result.err({ type: 'not-found' });\n }\n\n if (isHostError(err)) {\n logger.debug(`Cannot connect to host ${failedUrl}`);\n return Result.err({ type: 'host-error' });\n }\n\n if (isPermissionsIssue(err)) {\n logger.debug(\n `Dependency lookup unauthorized. Please add authentication with a hostRule for ${failedUrl}`,\n );\n return Result.err({ type: 'permission-issue' });\n }\n\n if (isTemporaryError(err)) {\n logger.debug({ failedUrl, err }, 'Temporary error');\n\n if (isMavenCentral(url)) {\n const statusCode = err?.response?.statusCode;\n if (statusCode === 429) {\n if (packageCache.getCacheType() === 'redis') {\n logger.once.warn(\n { failedUrl },\n 'Maven Central rate limiting detected despite Redis caching.',\n );\n } else {\n logger.once.warn(\n { failedUrl },\n 'Maven Central rate limiting detected. Persistent caching required.',\n );\n }\n }\n return Result.err({ type: 'maven-central-temporary-error', err });\n }\n return Result.err({ type: 'temporary-error' });\n }\n\n if (isConnectionError(err)) {\n logger.debug(`Connection refused to maven registry ${failedUrl}`);\n return Result.err({ type: 'connection-error' });\n }\n\n if (isUnsupportedHostError(err)) {\n logger.debug(`Unsupported host ${failedUrl}`);\n return Result.err({ type: 'unsupported-host' });\n }\n\n logger.info({ failedUrl, err }, 'Unknown HTTP download error');\n return Result.err({ type: 'unknown', err });\n });\n\n const { err } = fetchResult.unwrap();\n if (err?.type === 'maven-central-temporary-error') {\n throw new ExternalHostError(err.err);\n }\n\n return fetchResult;\n}\n\nexport async function downloadHttpContent(\n http: Http,\n pkgUrl: URL | string,\n opts: HttpOptions = {},\n): Promise<string | null> {\n const fetchResult = await downloadHttpProtocol(http, pkgUrl, opts);\n return fetchResult.transform(({ data }) => data).unwrapOrNull();\n}\n\nfunction isS3NotFound(err: Error): boolean {\n return err.message === 'NotFound' || err.message === 'NoSuchKey';\n}\n\nexport async function downloadS3Protocol(\n pkgUrl: URL,\n): Promise<MavenFetchResult> {\n logger.trace({ url: pkgUrl.toString() }, `Attempting to load S3 dependency`);\n\n const s3Url = parseS3Url(pkgUrl);\n if (!s3Url) {\n return Result.err({ type: 'invalid-url' });\n }\n\n return await Result.wrap(() => {\n const command = new GetObjectCommand(s3Url);\n const client = getS3Client();\n return client.send(command);\n })\n .transform(\n async ({\n Body,\n LastModified,\n DeleteMarker,\n }): Promise<MavenFetchResult> => {\n if (DeleteMarker) {\n logger.trace(\n { failedUrl: pkgUrl.toString() },\n 'Maven S3 lookup error: DeleteMarker encountered',\n );\n return Result.err({ type: 'not-found' });\n }\n\n if (!(Body instanceof Readable)) {\n logger.debug(\n { failedUrl: pkgUrl.toString() },\n 'Maven S3 lookup error: unsupported Body type',\n );\n return Result.err({ type: 'unsupported-format' });\n }\n\n const data = await streamToString(Body);\n const result: MavenFetchSuccess = { data };\n\n const lastModified = asTimestamp(LastModified);\n if (lastModified) {\n result.lastModified = lastModified;\n }\n\n return Result.ok(result);\n },\n )\n .catch((err): MavenFetchResult => {\n if (!(err instanceof Error)) {\n return Result.err(err);\n }\n\n const failedUrl = pkgUrl.toString();\n\n if (err.name === 'CredentialsProviderError') {\n logger.debug(\n { failedUrl },\n 'Maven S3 lookup error: credentials provider error, check \"AWS_ACCESS_KEY_ID\" and \"AWS_SECRET_ACCESS_KEY\" variables',\n );\n return Result.err({ type: 'credentials-error' });\n }\n\n if (err.message === 'Region is missing') {\n logger.debug(\n { failedUrl },\n 'Maven S3 lookup error: missing region, check \"AWS_REGION\" variable',\n );\n return Result.err({ type: 'missing-aws-region' });\n }\n\n if (isS3NotFound(err)) {\n logger.trace({ failedUrl }, 'Maven S3 lookup error: object not found');\n return Result.err({ type: 'not-found' });\n }\n\n logger.debug({ failedUrl, err }, 'Maven S3 lookup error: unknown error');\n return Result.err({ type: 'unknown', err });\n });\n}\n\nexport async function downloadArtifactRegistryProtocol(\n http: Http,\n pkgUrl: URL,\n): Promise<MavenFetchResult> {\n const opts: HttpOptions = {};\n const host = pkgUrl.host;\n const path = pkgUrl.pathname;\n\n logger.trace({ host, path }, `Using google auth for Maven repository`);\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { host, path },\n 'Could not get Google access token, using no auth',\n );\n }\n\n const url = pkgUrl.toString().replace('artifactregistry:', 'https:');\n\n return downloadHttpProtocol(http, url, opts);\n}\n\nfunction containsPlaceholder(str: string): boolean {\n return regEx(/\\${.*?}/g).test(str);\n}\n\nfunction removeKnownPlaceholders(str: string): string {\n return str.replace(regEx(/\\/tree\\/\\${[^}]+}/), '');\n}\n\nexport function getMavenUrl(\n dependency: MavenDependency,\n repoUrl: string,\n path: string,\n): URL {\n return new URL(\n `${dependency.dependencyUrl}/${path}`,\n ensureTrailingSlash(repoUrl),\n );\n}\n\nexport async function downloadMaven(\n http: Http,\n url: URL,\n): Promise<MavenFetchResult> {\n const protocol = url.protocol;\n\n let result: MavenFetchResult = Result.err({ type: 'unsupported-protocol' });\n\n if (isHttpUrl(url)) {\n result = await downloadHttpProtocol(http, url);\n }\n\n if (protocol === 'artifactregistry:') {\n result = await downloadArtifactRegistryProtocol(http, url);\n }\n\n if (protocol === 's3:') {\n result = await downloadS3Protocol(url);\n }\n\n return result.onError((err) => {\n if (err.type === 'unsupported-protocol') {\n logger.debug(\n { url: url.toString() },\n `Maven lookup error: unsupported protocol (${protocol})`,\n );\n }\n });\n}\n\nexport async function downloadMavenXml(\n http: Http,\n url: URL,\n): Promise<MavenFetchResult<XmlDocument>> {\n const rawResult = await downloadMaven(http, url);\n return rawResult.transform((result): MavenFetchResult<XmlDocument> => {\n try {\n return Result.ok({\n ...result,\n data: new XmlDocument(result.data),\n });\n } catch (err) {\n return Result.err({ type: 'xml-parse-error', err });\n }\n });\n}\n\nexport function getDependencyParts(packageName: string): MavenDependency {\n const [group, name] = packageName.split(':');\n const dependencyUrl = `${group.replace(regEx(/\\./g), '/')}/${name}`;\n return {\n display: packageName,\n group,\n name,\n dependencyUrl,\n };\n}\n\nfunction extractSnapshotVersion(metadata: XmlDocument): string | null {\n // Parse the maven-metadata.xml for the snapshot version and determine\n // the fixed version of the latest deployed snapshot.\n // The metadata descriptor can be found at\n // https://maven.apache.org/ref/3.3.3/maven-repository-metadata/repository-metadata.html\n //\n // Basically, we need to replace -SNAPSHOT with the artifact timestanp & build number,\n // so for example 1.0.0-SNAPSHOT will become 1.0.0-<timestamp>-<buildNumber>\n const version = metadata\n .descendantWithPath('version')\n ?.val?.replace('-SNAPSHOT', '');\n\n const snapshot = metadata.descendantWithPath('versioning.snapshot');\n const timestamp = snapshot?.childNamed('timestamp')?.val;\n const build = snapshot?.childNamed('buildNumber')?.val;\n\n // If we weren't able to parse out the required 3 version elements,\n // return null because we can't determine the fixed version of the latest snapshot.\n if (!version || !timestamp || !build) {\n return null;\n }\n return `${version}-${timestamp}-${build}`;\n}\n\nasync function getSnapshotFullVersion(\n http: Http,\n version: string,\n dependency: MavenDependency,\n repoUrl: string,\n): Promise<string | null> {\n // To determine what actual files are available for the snapshot, first we have to fetch and parse\n // the metadata located at http://<repo>/<group>/<artifact>/<version-SNAPSHOT>/maven-metadata.xml\n const metadataUrl = getMavenUrl(\n dependency,\n repoUrl,\n `${version}/maven-metadata.xml`,\n );\n\n const metadataXmlResult = await downloadMavenXml(http, metadataUrl);\n\n return metadataXmlResult\n .transform(({ data }) =>\n Result.wrapNullable(extractSnapshotVersion(data), {\n type: 'snapshot-extract-error',\n }),\n )\n .unwrapOrNull();\n}\n\nfunction isSnapshotVersion(version: string): boolean {\n if (version.endsWith('-SNAPSHOT')) {\n return true;\n }\n return false;\n}\n\nexport async function createUrlForDependencyPom(\n http: Http,\n version: string,\n dependency: MavenDependency,\n repoUrl: string,\n): Promise<string> {\n if (isSnapshotVersion(version)) {\n // By default, Maven snapshots are deployed to the repository with fixed file names.\n // Resolve the full, actual pom file name for the version.\n const fullVersion = await getSnapshotFullVersion(\n http,\n version,\n dependency,\n repoUrl,\n );\n\n // If we were able to resolve the version, use that, otherwise fall back to using -SNAPSHOT\n if (fullVersion !== null) {\n // TODO: types (#22198)\n return `${version}/${dependency.name}-${fullVersion}.pom`;\n }\n }\n\n // TODO: types (#22198)\n return `${version}/${dependency.name}-${version}.pom`;\n}\n\nexport async function getDependencyInfo(\n http: Http,\n dependency: MavenDependency,\n repoUrl: string,\n version: string,\n recursionLimit = 5,\n): Promise<DependencyInfo> {\n const path = await createUrlForDependencyPom(\n http,\n version,\n dependency,\n repoUrl,\n );\n\n const pomUrl = getMavenUrl(dependency, repoUrl, path);\n const pomXmlResult = await downloadMavenXml(http, pomUrl);\n const dependencyInfoResult = await pomXmlResult.transform(\n async ({ data: pomContent }) => {\n const result: DependencyInfo = {};\n\n const homepage = pomContent.valueWithPath('url');\n if (homepage && !containsPlaceholder(homepage)) {\n result.homepage = homepage;\n }\n\n const sourceUrl = pomContent.valueWithPath('scm.url');\n if (\n sourceUrl &&\n !containsPlaceholder(removeKnownPlaceholders(sourceUrl))\n ) {\n result.sourceUrl = sourceUrl\n .replace(regEx(/^scm:/), '')\n .replace(regEx(/^git:/), '')\n .replace(regEx(/^git@github.com:/), 'https://github.com/')\n .replace(regEx(/^git@github.com\\//), 'https://github.com/');\n\n if (result.sourceUrl.startsWith('//')) {\n // most likely the result of us stripping scm:, git: etc\n // going with prepending https: here which should result in potential information retrival\n result.sourceUrl = `https:${result.sourceUrl}`;\n }\n }\n\n const relocation = pomContent.descendantWithPath(\n 'distributionManagement.relocation',\n );\n if (relocation) {\n const relocationGroup =\n relocation.valueWithPath('groupId') ?? dependency.group;\n const relocationName =\n relocation.valueWithPath('artifactId') ?? dependency.name;\n result.replacementName = `${relocationGroup}:${relocationName}`;\n const relocationVersion = relocation.valueWithPath('version');\n result.replacementVersion = relocationVersion ?? version;\n const relocationMessage = relocation.valueWithPath('message');\n if (relocationMessage) {\n result.deprecationMessage = relocationMessage;\n }\n }\n\n const groupId = pomContent.valueWithPath('groupId');\n if (groupId) {\n result.packageScope = groupId;\n }\n\n const parent = pomContent.childNamed('parent');\n if (\n recursionLimit > 0 &&\n parent &&\n (!result.sourceUrl || !result.homepage)\n ) {\n // if we found a parent and are missing some information\n // trying to get the scm/homepage information from it\n const [parentGroupId, parentArtifactId, parentVersion] = [\n 'groupId',\n 'artifactId',\n 'version',\n ].map((k) => parent.valueWithPath(k)?.replace(/\\s+/g, ''));\n if (parentGroupId && parentArtifactId && parentVersion) {\n const parentDisplayId = `${parentGroupId}:${parentArtifactId}`;\n const parentDependency = getDependencyParts(parentDisplayId);\n const parentInformation = await getDependencyInfo(\n http,\n parentDependency,\n repoUrl,\n parentVersion,\n recursionLimit - 1,\n );\n if (!result.sourceUrl && parentInformation.sourceUrl) {\n result.sourceUrl = parentInformation.sourceUrl;\n }\n if (!result.homepage && parentInformation.homepage) {\n result.homepage = parentInformation.homepage;\n }\n }\n }\n\n return result;\n },\n );\n\n return dependencyInfoResult.unwrapOr({});\n}\n"],"mappings":"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"}
@@ -43,10 +43,12 @@ function parseRegistryUrl(registryUrl) {
43
43
  * - `0` if `a == b` or both `a` and `b` are invalid
44
44
  */
45
45
  function sortNugetVersions(a, b) {
46
- if (api.isValid(a)) if (api.isValid(b)) return api.sortVersions(a, b);
47
- else return 1;
48
- else if (api.isValid(b)) return -1;
49
- else return 0;
46
+ if (api.isValid(a)) {
47
+ if (api.isValid(b)) return api.sortVersions(a, b);
48
+ return 1;
49
+ }
50
+ if (api.isValid(b)) return -1;
51
+ return 0;
50
52
  }
51
53
  //#endregion
52
54
  export { massageUrl, parseRegistryUrl, removeBuildMeta, sortNugetVersions };
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/nuget/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { ParsedRegistryUrl } from './types.ts';\n\nconst buildMetaRe = regEx(/\\+.+$/g);\n\nexport function removeBuildMeta(version: string): string {\n return version.replace(buildMetaRe, '');\n}\n\nconst urlWhitespaceRe = regEx(/\\s/g);\n\nexport function massageUrl(url: string | null | undefined): string | null {\n if (url === null || url === undefined) {\n return null;\n }\n\n let resultUrl = url;\n\n // During `dotnet pack` certain URLs are being URL decoded which may introduce whitespace\n // and causes Markdown link generation problems.\n resultUrl = resultUrl.replace(urlWhitespaceRe, '%20');\n\n return resultUrl;\n}\n\nconst protocolVersionRegExp = regEx(/#protocolVersion=(?<protocol>2|3)/);\n\nexport function parseRegistryUrl(registryUrl: string): ParsedRegistryUrl {\n const parsedUrl = parseUrl(registryUrl);\n if (!parsedUrl) {\n logger.debug(\n { urL: registryUrl },\n `nuget registry failure: can't parse ${registryUrl}`,\n );\n return { feedUrl: registryUrl, protocolVersion: null };\n }\n let protocolVersion = 2;\n const protocolVersionMatch = protocolVersionRegExp.exec(\n parsedUrl.hash,\n )?.groups;\n if (protocolVersionMatch) {\n const { protocol } = protocolVersionMatch;\n parsedUrl.hash = '';\n protocolVersion = Number.parseInt(protocol, 10);\n } else if (parsedUrl.pathname.endsWith('.json')) {\n protocolVersion = 3;\n }\n\n const feedUrl = parsedUrl.href;\n return { feedUrl, protocolVersion };\n}\n\n/**\n * Compare two versions. Return:\n * - `1` if `a > b` or `b` is invalid\n * - `-1` if `a < b` or `a` is invalid\n * - `0` if `a == b` or both `a` and `b` are invalid\n */\nexport function sortNugetVersions(a: string, b: string): number {\n if (versioning.isValid(a)) {\n if (versioning.isValid(b)) {\n return versioning.sortVersions(a, b);\n } else {\n return 1;\n }\n } else if (versioning.isValid(b)) {\n return -1;\n } else {\n return 0;\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,cAAc,MAAM,QAAQ;AAElC,SAAgB,gBAAgB,SAAyB;CACvD,OAAO,QAAQ,QAAQ,aAAa,EAAE;AACxC;AAEA,MAAM,kBAAkB,MAAM,KAAK;AAEnC,SAAgB,WAAW,KAA+C;CACxE,IAAI,QAAQ,QAAQ,QAAQ,KAAA,GAC1B,OAAO;CAGT,IAAI,YAAY;CAIhB,YAAY,UAAU,QAAQ,iBAAiB,KAAK;CAEpD,OAAO;AACT;AAEA,MAAM,wBAAwB,MAAM,mCAAmC;AAEvE,SAAgB,iBAAiB,aAAwC;CACvE,MAAM,YAAY,SAAS,WAAW;CACtC,IAAI,CAAC,WAAW;EACd,OAAO,MACL,EAAE,KAAK,YAAY,GACnB,uCAAuC,aACzC;EACA,OAAO;GAAE,SAAS;GAAa,iBAAiB;EAAK;CACvD;CACA,IAAI,kBAAkB;CACtB,MAAM,uBAAuB,sBAAsB,KACjD,UAAU,IACZ,CAAC,EAAE;CACH,IAAI,sBAAsB;EACxB,MAAM,EAAE,aAAa;EACrB,UAAU,OAAO;EACjB,kBAAkB,OAAO,SAAS,UAAU,EAAE;CAChD,OAAO,IAAI,UAAU,SAAS,SAAS,OAAO,GAC5C,kBAAkB;CAIpB,OAAO;EAAE,SADO,UAAU;EACR;CAAgB;AACpC;;;;;;;AAQA,SAAgB,kBAAkB,GAAW,GAAmB;CAC9D,IAAIA,IAAW,QAAQ,CAAC,GACtB,IAAIA,IAAW,QAAQ,CAAC,GACtB,OAAOA,IAAW,aAAa,GAAG,CAAC;MAEnC,OAAO;MAEJ,IAAIA,IAAW,QAAQ,CAAC,GAC7B,OAAO;MAEP,OAAO;AAEX"}
1
+ {"version":3,"file":"common.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/nuget/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { ParsedRegistryUrl } from './types.ts';\n\nconst buildMetaRe = regEx(/\\+.+$/g);\n\nexport function removeBuildMeta(version: string): string {\n return version.replace(buildMetaRe, '');\n}\n\nconst urlWhitespaceRe = regEx(/\\s/g);\n\nexport function massageUrl(url: string | null | undefined): string | null {\n if (url === null || url === undefined) {\n return null;\n }\n\n let resultUrl = url;\n\n // During `dotnet pack` certain URLs are being URL decoded which may introduce whitespace\n // and causes Markdown link generation problems.\n resultUrl = resultUrl.replace(urlWhitespaceRe, '%20');\n\n return resultUrl;\n}\n\nconst protocolVersionRegExp = regEx(/#protocolVersion=(?<protocol>2|3)/);\n\nexport function parseRegistryUrl(registryUrl: string): ParsedRegistryUrl {\n const parsedUrl = parseUrl(registryUrl);\n if (!parsedUrl) {\n logger.debug(\n { urL: registryUrl },\n `nuget registry failure: can't parse ${registryUrl}`,\n );\n return { feedUrl: registryUrl, protocolVersion: null };\n }\n let protocolVersion = 2;\n const protocolVersionMatch = protocolVersionRegExp.exec(\n parsedUrl.hash,\n )?.groups;\n if (protocolVersionMatch) {\n const { protocol } = protocolVersionMatch;\n parsedUrl.hash = '';\n protocolVersion = Number.parseInt(protocol, 10);\n } else if (parsedUrl.pathname.endsWith('.json')) {\n protocolVersion = 3;\n }\n\n const feedUrl = parsedUrl.href;\n return { feedUrl, protocolVersion };\n}\n\n/**\n * Compare two versions. Return:\n * - `1` if `a > b` or `b` is invalid\n * - `-1` if `a < b` or `a` is invalid\n * - `0` if `a == b` or both `a` and `b` are invalid\n */\nexport function sortNugetVersions(a: string, b: string): number {\n if (versioning.isValid(a)) {\n if (versioning.isValid(b)) {\n return versioning.sortVersions(a, b);\n }\n return 1;\n }\n if (versioning.isValid(b)) {\n return -1;\n }\n return 0;\n}\n"],"mappings":";;;;;AAMA,MAAM,cAAc,MAAM,QAAQ;AAElC,SAAgB,gBAAgB,SAAyB;CACvD,OAAO,QAAQ,QAAQ,aAAa,EAAE;AACxC;AAEA,MAAM,kBAAkB,MAAM,KAAK;AAEnC,SAAgB,WAAW,KAA+C;CACxE,IAAI,QAAQ,QAAQ,QAAQ,KAAA,GAC1B,OAAO;CAGT,IAAI,YAAY;CAIhB,YAAY,UAAU,QAAQ,iBAAiB,KAAK;CAEpD,OAAO;AACT;AAEA,MAAM,wBAAwB,MAAM,mCAAmC;AAEvE,SAAgB,iBAAiB,aAAwC;CACvE,MAAM,YAAY,SAAS,WAAW;CACtC,IAAI,CAAC,WAAW;EACd,OAAO,MACL,EAAE,KAAK,YAAY,GACnB,uCAAuC,aACzC;EACA,OAAO;GAAE,SAAS;GAAa,iBAAiB;EAAK;CACvD;CACA,IAAI,kBAAkB;CACtB,MAAM,uBAAuB,sBAAsB,KACjD,UAAU,IACZ,CAAC,EAAE;CACH,IAAI,sBAAsB;EACxB,MAAM,EAAE,aAAa;EACrB,UAAU,OAAO;EACjB,kBAAkB,OAAO,SAAS,UAAU,EAAE;CAChD,OAAO,IAAI,UAAU,SAAS,SAAS,OAAO,GAC5C,kBAAkB;CAIpB,OAAO;EAAE,SADO,UAAU;EACR;CAAgB;AACpC;;;;;;;AAQA,SAAgB,kBAAkB,GAAW,GAAmB;CAC9D,IAAIA,IAAW,QAAQ,CAAC,GAAG;EACzB,IAAIA,IAAW,QAAQ,CAAC,GACtB,OAAOA,IAAW,aAAa,GAAG,CAAC;EAErC,OAAO;CACT;CACA,IAAIA,IAAW,QAAQ,CAAC,GACtB,OAAO;CAET,OAAO;AACT"}
@@ -16,10 +16,11 @@ async function getGoogleAuthHostRule() {
16
16
  username: "oauth2accesstoken",
17
17
  password: accessToken
18
18
  };
19
- } else logger.warn("Could not retrieve access token using google-auth-library getAccessToken");
19
+ }
20
+ logger.warn("Could not retrieve access token using google-auth-library getAccessToken");
20
21
  } catch (err) {
21
22
  if (err.message?.includes("Could not load the default credentials")) return null;
22
- else throw err;
23
+ throw err;
23
24
  }
24
25
  return null;
25
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","names":[],"sources":["../../../lib/modules/datasource/util.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { GoogleAuth } from 'google-auth-library';\nimport { logger } from '../../logger/index.ts';\nimport type { HostRule } from '../../types/index.ts';\nimport type { HttpResponse } from '../../util/http/types.ts';\nimport { addSecretForSanitizing } from '../../util/sanitize.ts';\n\nconst JFROG_ARTIFACTORY_RES_HEADER = 'x-jfrog-version';\n\nexport function isArtifactoryServer<T = unknown>(\n res: HttpResponse<T> | undefined,\n): boolean {\n return isString(res?.headers[JFROG_ARTIFACTORY_RES_HEADER]);\n}\n\nexport async function getGoogleAuthHostRule(): Promise<HostRule | null> {\n try {\n const googleAuth: GoogleAuth = new GoogleAuth({\n scopes: 'https://www.googleapis.com/auth/cloud-platform',\n });\n const accessToken = await googleAuth.getAccessToken();\n if (accessToken) {\n // sanitize token\n addSecretForSanitizing(accessToken);\n return {\n username: 'oauth2accesstoken',\n password: accessToken,\n };\n } else {\n logger.warn(\n 'Could not retrieve access token using google-auth-library getAccessToken',\n );\n }\n } catch (err) {\n if (err.message?.includes('Could not load the default credentials')) {\n return null;\n } else {\n throw err;\n }\n }\n return null;\n}\n\nexport async function getGoogleAuthToken(): Promise<string | null> {\n const rule = await getGoogleAuthHostRule();\n if (rule) {\n const token = Buffer.from(`${rule.username}:${rule.password}`).toString(\n 'base64',\n );\n addSecretForSanitizing(token);\n return token;\n }\n return null;\n}\n"],"mappings":";;;;;AAOA,MAAM,+BAA+B;AAErC,SAAgB,oBACd,KACS;CACT,OAAO,SAAS,KAAK,QAAQ,6BAA6B;AAC5D;AAEA,eAAsB,wBAAkD;CACtE,IAAI;EAIF,MAAM,cAAc,MAAM,IAHS,WAAW,EAC5C,QAAQ,iDACV,CACmC,CAAC,CAAC,eAAe;EACpD,IAAI,aAAa;GAEf,uBAAuB,WAAW;GAClC,OAAO;IACL,UAAU;IACV,UAAU;GACZ;EACF,OACE,OAAO,KACL,0EACF;CAEJ,SAAS,KAAK;EACZ,IAAI,IAAI,SAAS,SAAS,wCAAwC,GAChE,OAAO;OAEP,MAAM;CAEV;CACA,OAAO;AACT;AAEA,eAAsB,qBAA6C;CACjE,MAAM,OAAO,MAAM,sBAAsB;CACzC,IAAI,MAAM;EACR,MAAM,QAAQ,OAAO,KAAK,GAAG,KAAK,SAAS,GAAG,KAAK,UAAU,CAAC,CAAC,SAC7D,QACF;EACA,uBAAuB,KAAK;EAC5B,OAAO;CACT;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"util.js","names":[],"sources":["../../../lib/modules/datasource/util.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { GoogleAuth } from 'google-auth-library';\nimport { logger } from '../../logger/index.ts';\nimport type { HostRule } from '../../types/index.ts';\nimport type { HttpResponse } from '../../util/http/types.ts';\nimport { addSecretForSanitizing } from '../../util/sanitize.ts';\n\nconst JFROG_ARTIFACTORY_RES_HEADER = 'x-jfrog-version';\n\nexport function isArtifactoryServer<T = unknown>(\n res: HttpResponse<T> | undefined,\n): boolean {\n return isString(res?.headers[JFROG_ARTIFACTORY_RES_HEADER]);\n}\n\nexport async function getGoogleAuthHostRule(): Promise<HostRule | null> {\n try {\n const googleAuth: GoogleAuth = new GoogleAuth({\n scopes: 'https://www.googleapis.com/auth/cloud-platform',\n });\n const accessToken = await googleAuth.getAccessToken();\n if (accessToken) {\n // sanitize token\n addSecretForSanitizing(accessToken);\n return {\n username: 'oauth2accesstoken',\n password: accessToken,\n };\n }\n logger.warn(\n 'Could not retrieve access token using google-auth-library getAccessToken',\n );\n } catch (err) {\n if (err.message?.includes('Could not load the default credentials')) {\n return null;\n }\n throw err;\n }\n return null;\n}\n\nexport async function getGoogleAuthToken(): Promise<string | null> {\n const rule = await getGoogleAuthHostRule();\n if (rule) {\n const token = Buffer.from(`${rule.username}:${rule.password}`).toString(\n 'base64',\n );\n addSecretForSanitizing(token);\n return token;\n }\n return null;\n}\n"],"mappings":";;;;;AAOA,MAAM,+BAA+B;AAErC,SAAgB,oBACd,KACS;CACT,OAAO,SAAS,KAAK,QAAQ,6BAA6B;AAC5D;AAEA,eAAsB,wBAAkD;CACtE,IAAI;EAIF,MAAM,cAAc,MAAM,IAHS,WAAW,EAC5C,QAAQ,iDACV,CACmC,CAAC,CAAC,eAAe;EACpD,IAAI,aAAa;GAEf,uBAAuB,WAAW;GAClC,OAAO;IACL,UAAU;IACV,UAAU;GACZ;EACF;EACA,OAAO,KACL,0EACF;CACF,SAAS,KAAK;EACZ,IAAI,IAAI,SAAS,SAAS,wCAAwC,GAChE,OAAO;EAET,MAAM;CACR;CACA,OAAO;AACT;AAEA,eAAsB,qBAA6C;CACjE,MAAM,OAAO,MAAM,sBAAsB;CACzC,IAAI,MAAM;EACR,MAAM,QAAQ,OAAO,KAAK,GAAG,KAAK,SAAS,GAAG,KAAK,UAAU,CAAC,CAAC,SAC7D,QACF;EACA,uBAAuB,KAAK;EAC5B,OAAO;CACT;CACA,OAAO;AACT"}
@@ -59,7 +59,7 @@ function extractAzurePipelinesTasks(task) {
59
59
  function parseAzurePipelines(content, packageFile) {
60
60
  const res = AzurePipelinesYaml.safeParse(content);
61
61
  if (res.success) return res.data;
62
- else logger.debug({
62
+ logger.debug({
63
63
  err: res.error,
64
64
  packageFile
65
65
  }, "Error parsing pubspec lockfile.");
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/azure-pipelines/extract.ts"],"sourcesContent":["import { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport type {\n AzurePipelines,\n Container,\n Deploy,\n Deployment,\n Job,\n Jobs,\n Repository,\n Step,\n} from './schema.ts';\nimport { AzurePipelinesYaml } from './schema.ts';\n\nconst AzurePipelinesTaskRegex = regEx(/^(?<name>[^@]+)@(?<version>.*)$/);\n\nexport function extractRepository(\n repository: Repository,\n currentRepository?: string,\n): PackageDependency | null {\n let repositoryUrl = null;\n\n let depName = repository.name;\n\n if (repository.type === 'github') {\n repositoryUrl = `https://github.com/${repository.name}.git`;\n } else if (repository.type === 'git') {\n const platform = GlobalConfig.get('platform');\n const endpoint = GlobalConfig.get('endpoint');\n\n if (platform === 'azure' && endpoint) {\n // extract the project name if the repository from which the pipline is referencing templates contains the Azure DevOps project name\n if (repository.name.includes('/')) {\n const [projectName, repoName] = repository.name.split('/');\n repositoryUrl = joinUrlParts(\n endpoint,\n encodeURIComponent(projectName),\n '_git',\n encodeURIComponent(repoName),\n );\n\n // if the repository from which the pipline is referencing templates does not contain the Azure DevOps project name, get the project name from the repository containing the pipeline file being process\n } else if (currentRepository?.includes('/')) {\n const projectName = currentRepository.split('/')[0];\n depName = `${projectName}/${repository.name}`;\n repositoryUrl = joinUrlParts(\n endpoint,\n encodeURIComponent(projectName),\n '_git',\n encodeURIComponent(repository.name),\n );\n } else {\n logger.debug(\n 'Renovate cannot update Azure pipelines in git repositories when neither the current repository nor the target repository contains the Azure DevOps project name.',\n );\n }\n }\n }\n\n if (repositoryUrl === null) {\n return null;\n }\n\n if (!repository.ref?.startsWith('refs/tags/')) {\n return null;\n }\n\n return {\n autoReplaceStringTemplate: 'refs/tags/{{newValue}}',\n currentValue: repository.ref.replace('refs/tags/', ''),\n datasource: GitTagsDatasource.id,\n depName,\n depType: 'gitTags',\n packageName: repositoryUrl,\n replaceString: repository.ref,\n };\n}\n\nexport function extractContainer(\n container: Container,\n): PackageDependency | null {\n const dep = getDep(container.image);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Azure pipelines docker image',\n );\n dep.depType = 'docker';\n\n return dep;\n}\n\nexport function extractAzurePipelinesTasks(\n task: string,\n): PackageDependency | null {\n const match = AzurePipelinesTaskRegex.exec(task);\n if (match?.groups) {\n return {\n depName: match.groups.name,\n currentValue: match.groups.version,\n datasource: AzurePipelinesTasksDatasource.id,\n };\n }\n return null;\n}\n\nexport function parseAzurePipelines(\n content: string,\n packageFile: string,\n): AzurePipelines | null {\n const res = AzurePipelinesYaml.safeParse(content);\n if (res.success) {\n return res.data;\n } else {\n logger.debug(\n { err: res.error, packageFile },\n 'Error parsing pubspec lockfile.',\n );\n }\n return null;\n}\n\nfunction extractSteps(\n steps: Step[] | undefined,\n): PackageDependency<Record<string, any>>[] {\n const deps = [];\n for (const step of coerceArray(steps)) {\n const task = extractAzurePipelinesTasks(step.task);\n if (task) {\n deps.push(task);\n }\n }\n return deps;\n}\n\nfunction extractJob(job: Job | undefined): PackageDependency[] {\n return extractSteps(job?.steps);\n}\n\nfunction extractDeploy(deploy: Deploy | undefined): PackageDependency[] {\n const deps = extractJob(deploy?.deploy);\n deps.push(...extractJob(deploy?.postRouteTraffic));\n deps.push(...extractJob(deploy?.preDeploy));\n deps.push(...extractJob(deploy?.routeTraffic));\n deps.push(...extractJob(deploy?.on?.failure));\n deps.push(...extractJob(deploy?.on?.success));\n return deps;\n}\n\nfunction extractJobs(jobs: Jobs | undefined): PackageDependency[] {\n const deps: PackageDependency[] = [];\n for (const jobOrDeployment of coerceArray(jobs)) {\n const deployment = jobOrDeployment as Deployment;\n if (deployment.strategy) {\n deps.push(...extractDeploy(deployment.strategy.canary));\n deps.push(...extractDeploy(deployment.strategy.rolling));\n deps.push(...extractDeploy(deployment.strategy.runOnce));\n continue;\n }\n\n const job = jobOrDeployment as Job;\n deps.push(...extractJob(job));\n }\n return deps;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace(`azurePipelines.extractPackageFile(${packageFile})`);\n const deps: PackageDependency[] = [];\n\n const pkg = parseAzurePipelines(content, packageFile);\n if (!pkg) {\n return null;\n }\n\n for (const repository of coerceArray(pkg.resources?.repositories)) {\n const dep = extractRepository(repository, config.repository);\n if (dep) {\n deps.push(dep);\n }\n }\n\n for (const container of coerceArray(pkg.resources?.containers)) {\n const dep = extractContainer(container);\n if (dep) {\n deps.push(dep);\n }\n }\n\n for (const { jobs } of coerceArray(pkg.stages)) {\n deps.push(...extractJobs(jobs));\n }\n\n deps.push(...extractJobs(pkg.jobs));\n deps.push(...extractSteps(pkg.steps));\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/azure-pipelines/extract.ts"],"sourcesContent":["import { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport type {\n AzurePipelines,\n Container,\n Deploy,\n Deployment,\n Job,\n Jobs,\n Repository,\n Step,\n} from './schema.ts';\nimport { AzurePipelinesYaml } from './schema.ts';\n\nconst AzurePipelinesTaskRegex = regEx(/^(?<name>[^@]+)@(?<version>.*)$/);\n\nexport function extractRepository(\n repository: Repository,\n currentRepository?: string,\n): PackageDependency | null {\n let repositoryUrl = null;\n\n let depName = repository.name;\n\n if (repository.type === 'github') {\n repositoryUrl = `https://github.com/${repository.name}.git`;\n } else if (repository.type === 'git') {\n const platform = GlobalConfig.get('platform');\n const endpoint = GlobalConfig.get('endpoint');\n\n if (platform === 'azure' && endpoint) {\n // extract the project name if the repository from which the pipline is referencing templates contains the Azure DevOps project name\n if (repository.name.includes('/')) {\n const [projectName, repoName] = repository.name.split('/');\n repositoryUrl = joinUrlParts(\n endpoint,\n encodeURIComponent(projectName),\n '_git',\n encodeURIComponent(repoName),\n );\n\n // if the repository from which the pipline is referencing templates does not contain the Azure DevOps project name, get the project name from the repository containing the pipeline file being process\n } else if (currentRepository?.includes('/')) {\n const projectName = currentRepository.split('/')[0];\n depName = `${projectName}/${repository.name}`;\n repositoryUrl = joinUrlParts(\n endpoint,\n encodeURIComponent(projectName),\n '_git',\n encodeURIComponent(repository.name),\n );\n } else {\n logger.debug(\n 'Renovate cannot update Azure pipelines in git repositories when neither the current repository nor the target repository contains the Azure DevOps project name.',\n );\n }\n }\n }\n\n if (repositoryUrl === null) {\n return null;\n }\n\n if (!repository.ref?.startsWith('refs/tags/')) {\n return null;\n }\n\n return {\n autoReplaceStringTemplate: 'refs/tags/{{newValue}}',\n currentValue: repository.ref.replace('refs/tags/', ''),\n datasource: GitTagsDatasource.id,\n depName,\n depType: 'gitTags',\n packageName: repositoryUrl,\n replaceString: repository.ref,\n };\n}\n\nexport function extractContainer(\n container: Container,\n): PackageDependency | null {\n const dep = getDep(container.image);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Azure pipelines docker image',\n );\n dep.depType = 'docker';\n\n return dep;\n}\n\nexport function extractAzurePipelinesTasks(\n task: string,\n): PackageDependency | null {\n const match = AzurePipelinesTaskRegex.exec(task);\n if (match?.groups) {\n return {\n depName: match.groups.name,\n currentValue: match.groups.version,\n datasource: AzurePipelinesTasksDatasource.id,\n };\n }\n return null;\n}\n\nexport function parseAzurePipelines(\n content: string,\n packageFile: string,\n): AzurePipelines | null {\n const res = AzurePipelinesYaml.safeParse(content);\n if (res.success) {\n return res.data;\n }\n logger.debug(\n { err: res.error, packageFile },\n 'Error parsing pubspec lockfile.',\n );\n\n return null;\n}\n\nfunction extractSteps(steps: Step[] | undefined): PackageDependency[] {\n const deps = [];\n for (const step of coerceArray(steps)) {\n const task = extractAzurePipelinesTasks(step.task);\n if (task) {\n deps.push(task);\n }\n }\n return deps;\n}\n\nfunction extractJob(job: Job | undefined): PackageDependency[] {\n return extractSteps(job?.steps);\n}\n\nfunction extractDeploy(deploy: Deploy | undefined): PackageDependency[] {\n const deps = extractJob(deploy?.deploy);\n deps.push(...extractJob(deploy?.postRouteTraffic));\n deps.push(...extractJob(deploy?.preDeploy));\n deps.push(...extractJob(deploy?.routeTraffic));\n deps.push(...extractJob(deploy?.on?.failure));\n deps.push(...extractJob(deploy?.on?.success));\n return deps;\n}\n\nfunction extractJobs(jobs: Jobs | undefined): PackageDependency[] {\n const deps: PackageDependency[] = [];\n for (const jobOrDeployment of coerceArray(jobs)) {\n const deployment = jobOrDeployment as Deployment;\n if (deployment.strategy) {\n deps.push(...extractDeploy(deployment.strategy.canary));\n deps.push(...extractDeploy(deployment.strategy.rolling));\n deps.push(...extractDeploy(deployment.strategy.runOnce));\n continue;\n }\n\n const job = jobOrDeployment as Job;\n deps.push(...extractJob(job));\n }\n return deps;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace(`azurePipelines.extractPackageFile(${packageFile})`);\n const deps: PackageDependency[] = [];\n\n const pkg = parseAzurePipelines(content, packageFile);\n if (!pkg) {\n return null;\n }\n\n for (const repository of coerceArray(pkg.resources?.repositories)) {\n const dep = extractRepository(repository, config.repository);\n if (dep) {\n deps.push(dep);\n }\n }\n\n for (const container of coerceArray(pkg.resources?.containers)) {\n const dep = extractContainer(container);\n if (dep) {\n deps.push(dep);\n }\n }\n\n for (const { jobs } of coerceArray(pkg.stages)) {\n deps.push(...extractJobs(jobs));\n }\n\n deps.push(...extractJobs(pkg.jobs));\n deps.push(...extractSteps(pkg.steps));\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n"],"mappings":"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"}
@@ -20,9 +20,7 @@ function extractPackageFile(content, packageFile) {
20
20
  ...goRules
21
21
  ];
22
22
  const replaceString = fragment.value;
23
- if (rules.some((rule) => replaceString.startsWith(rule))) {
24
- if (dep.currentValue && dep.currentDigest) dep.replaceString = replaceString;
25
- }
23
+ if (rules.some((rule) => replaceString.startsWith(rule)) && dep.currentValue && dep.currentDigest) dep.replaceString = replaceString;
26
24
  deps.push(dep);
27
25
  }
28
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/bazel/extract.ts"],"sourcesContent":["import type { PackageDependency, PackageFileContent } from '../types.ts';\nimport { parse } from './parser.ts';\nimport { dockerRules } from './rules/docker.ts';\nimport { gitRules } from './rules/git.ts';\nimport { goRules } from './rules/go.ts';\nimport { extractDepsFromFragment } from './rules/index.ts';\nimport { ociRules } from './rules/oci.ts';\nimport type { RecordFragment } from './types.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n const deps: PackageDependency[] = [];\n\n const fragments: RecordFragment[] | null = parse(content, packageFile);\n if (!fragments) {\n return null;\n }\n\n for (let idx = 0; idx < fragments.length; idx += 1) {\n const fragment = fragments[idx];\n for (const dep of extractDepsFromFragment(fragment)) {\n dep.managerData = { idx };\n\n // Selectively provide `replaceString` in order to make auto-replace\n // functionality work correctly.\n const rules = [...dockerRules, ...ociRules, ...gitRules, ...goRules];\n const replaceString = fragment.value;\n if (rules.some((rule) => replaceString.startsWith(rule))) {\n if (dep.currentValue && dep.currentDigest) {\n dep.replaceString = replaceString;\n }\n }\n\n deps.push(dep);\n }\n }\n\n return deps.length ? { deps } : null;\n}\n"],"mappings":";;;;;;;AASA,SAAgB,mBACd,SACA,aAC2B;CAC3B,MAAM,OAA4B,CAAC;CAEnC,MAAM,YAAqC,MAAM,SAAS,WAAW;CACrE,IAAI,CAAC,WACH,OAAO;CAGT,KAAK,IAAI,MAAM,GAAG,MAAM,UAAU,QAAQ,OAAO,GAAG;EAClD,MAAM,WAAW,UAAU;EAC3B,KAAK,MAAM,OAAO,wBAAwB,QAAQ,GAAG;GACnD,IAAI,cAAc,EAAE,IAAI;GAIxB,MAAM,QAAQ;IAAC,GAAG;IAAa,GAAG;IAAU,GAAG;IAAU,GAAG;GAAO;GACnE,MAAM,gBAAgB,SAAS;GAC/B,IAAI,MAAM,MAAM,SAAS,cAAc,WAAW,IAAI,CAAC;QACjD,IAAI,gBAAgB,IAAI,eAC1B,IAAI,gBAAgB;GAAA;GAIxB,KAAK,KAAK,GAAG;EACf;CACF;CAEA,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/bazel/extract.ts"],"sourcesContent":["import type { PackageDependency, PackageFileContent } from '../types.ts';\nimport { parse } from './parser.ts';\nimport { dockerRules } from './rules/docker.ts';\nimport { gitRules } from './rules/git.ts';\nimport { goRules } from './rules/go.ts';\nimport { extractDepsFromFragment } from './rules/index.ts';\nimport { ociRules } from './rules/oci.ts';\nimport type { RecordFragment } from './types.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n const deps: PackageDependency[] = [];\n\n const fragments: RecordFragment[] | null = parse(content, packageFile);\n if (!fragments) {\n return null;\n }\n\n for (let idx = 0; idx < fragments.length; idx += 1) {\n const fragment = fragments[idx];\n for (const dep of extractDepsFromFragment(fragment)) {\n dep.managerData = { idx };\n\n // Selectively provide `replaceString` in order to make auto-replace\n // functionality work correctly.\n const rules = [...dockerRules, ...ociRules, ...gitRules, ...goRules];\n const replaceString = fragment.value;\n if (\n rules.some((rule) => replaceString.startsWith(rule)) &&\n dep.currentValue &&\n dep.currentDigest\n ) {\n dep.replaceString = replaceString;\n }\n\n deps.push(dep);\n }\n }\n\n return deps.length ? { deps } : null;\n}\n"],"mappings":";;;;;;;AASA,SAAgB,mBACd,SACA,aAC2B;CAC3B,MAAM,OAA4B,CAAC;CAEnC,MAAM,YAAqC,MAAM,SAAS,WAAW;CACrE,IAAI,CAAC,WACH,OAAO;CAGT,KAAK,IAAI,MAAM,GAAG,MAAM,UAAU,QAAQ,OAAO,GAAG;EAClD,MAAM,WAAW,UAAU;EAC3B,KAAK,MAAM,OAAO,wBAAwB,QAAQ,GAAG;GACnD,IAAI,cAAc,EAAE,IAAI;GAIxB,MAAM,QAAQ;IAAC,GAAG;IAAa,GAAG;IAAU,GAAG;IAAU,GAAG;GAAO;GACnE,MAAM,gBAAgB,SAAS;GAC/B,IACE,MAAM,MAAM,SAAS,cAAc,WAAW,IAAI,CAAC,KACnD,IAAI,gBACJ,IAAI,eAEJ,IAAI,gBAAgB;GAGtB,KAAK,KAAK,GAAG;EACf;CACF;CAEA,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC"}
@@ -12,7 +12,7 @@ function emptyCtx(source) {
12
12
  };
13
13
  }
14
14
  function currentFragment(ctx) {
15
- return ctx.stack[ctx.stack.length - 1];
15
+ return ctx.stack.at(-1);
16
16
  }
17
17
  function extractTreeValue(source, tree, offset) {
18
18
  if (tree.type === "wrapped-tree") {
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","names":["q","query","memCache.get"],"sources":["../../../../lib/modules/manager/bazel/parser.ts"],"sourcesContent":["import type { lexer, parser } from '@renovatebot/good-enough-parser';\nimport { lang, query as q } from '@renovatebot/good-enough-parser';\nimport { logger } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { hash } from '../../../util/hash.ts';\nimport { supportedRulesRegex } from './rules/index.ts';\nimport type { NestedFragment, RecordFragment } from './types.ts';\n\ninterface Ctx {\n readonly source: string;\n results: RecordFragment[];\n stack: NestedFragment[];\n recordKey?: string;\n subRecordKey?: string;\n argIndex?: number;\n}\n\nfunction emptyCtx(source: string): Ctx {\n return {\n source,\n results: [],\n stack: [],\n };\n}\n\nfunction currentFragment(ctx: Ctx): NestedFragment {\n const deepestFragment = ctx.stack[ctx.stack.length - 1];\n return deepestFragment;\n}\n\nfunction extractTreeValue(\n source: string,\n tree: parser.Tree,\n offset: number,\n): string {\n if (tree.type === 'wrapped-tree') {\n const { endsWith } = tree;\n const to = endsWith.offset + endsWith.value.length;\n return source.slice(offset, to);\n }\n\n // istanbul ignore next\n return '';\n}\n\n/**\n * Matches key-value pairs:\n * - `tag = \"1.2.3\"`\n * - `name = \"foobar\"`\n * - `deps = [\"foo\", \"bar\"]`\n * - `\n * artifacts = [\n maven.artifact(\n group = \"com.example1\",\n artifact = \"foobar\",\n version = \"1.2.3\",\n )\n ]\n `\n **/\nconst kwParams = q\n .sym<Ctx>((ctx, { value: recordKey }) => {\n return { ...ctx, recordKey };\n })\n .op('=')\n .alt(\n // string\n q.str((ctx, { offset, value }) => {\n const frag = currentFragment(ctx);\n if (frag.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n frag.children[key] = { type: 'string', value, offset };\n }\n return ctx;\n }),\n // array of strings or calls\n q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '[',\n endsWith: ']',\n preHandler: (ctx, tree) => {\n const parentRecord = currentFragment(ctx) as RecordFragment;\n if (\n parentRecord.type === 'record' &&\n ctx.recordKey &&\n tree.type === 'wrapped-tree'\n ) {\n const key = ctx.recordKey;\n parentRecord.children[key] = {\n type: 'array',\n value: '',\n offset: tree.startsWith.offset,\n children: [],\n };\n }\n return ctx;\n },\n search: q.alt(\n q.str<Ctx>((ctx, { value, offset }) => {\n const parentRecord = currentFragment(ctx);\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n if (array.type === 'array') {\n array.children.push({ type: 'string', value, offset });\n }\n }\n return ctx;\n }),\n q\n .sym<Ctx>()\n .handler(recordStartHandler)\n .handler((ctx, { value, offset }) => {\n const ruleFragment = currentFragment(ctx);\n if (ruleFragment.type === 'record') {\n ruleFragment.children._function = {\n type: 'string',\n value,\n offset,\n };\n }\n return ctx;\n })\n .many(\n q.op<Ctx>('.').sym((ctx, { value }) => {\n const ruleFragment = currentFragment(ctx);\n if (\n ruleFragment.type === 'record' &&\n ruleFragment.children._function\n ) {\n ruleFragment.children._function.value += `.${value}`;\n }\n return ctx;\n }),\n 0,\n 3,\n )\n .tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '(',\n endsWith: ')',\n search: q\n .opt(\n q\n .sym<Ctx>((ctx, { value: subRecordKey }) => ({\n ...ctx,\n subRecordKey,\n }))\n .op('='),\n )\n .str((ctx, { value: subRecordValue, offset }) => {\n const argIndex = ctx.argIndex ?? 0;\n\n const subRecordKey = ctx.subRecordKey! ?? argIndex.toString();\n const ruleFragment = currentFragment(ctx);\n if (ruleFragment.type === 'record') {\n ruleFragment.children[subRecordKey] = {\n type: 'string',\n value: subRecordValue,\n offset,\n };\n }\n delete ctx.subRecordKey;\n ctx.argIndex = argIndex + 1;\n return ctx;\n }),\n postHandler: (ctx, tree) => {\n delete ctx.argIndex;\n\n const callFrag = currentFragment(ctx);\n ctx.stack.pop();\n if (callFrag.type === 'record' && tree.type === 'wrapped-tree') {\n callFrag.value = extractTreeValue(\n ctx.source,\n tree,\n callFrag.offset,\n );\n\n const parentRecord = currentFragment(ctx);\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n if (array.type === 'array') {\n array.children.push(callFrag);\n }\n }\n }\n return ctx;\n },\n }),\n ),\n postHandler: (ctx, tree) => {\n const parentRecord = currentFragment(ctx);\n if (\n parentRecord.type === 'record' &&\n ctx.recordKey &&\n tree.type === 'wrapped-tree'\n ) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n if (array.type === 'array') {\n array.value = extractTreeValue(ctx.source, tree, array.offset);\n }\n }\n return ctx;\n },\n }),\n )\n .handler((ctx) => {\n delete ctx.recordKey;\n return ctx;\n });\n\n/**\n * Matches rule signature:\n * `git_repository(......)`\n * ^^^^^^^^\n *\n * @param search something to match inside parens\n */\nfunction ruleCall(\n search: q.QueryBuilder<Ctx, parser.Node>,\n): q.QueryBuilder<Ctx, parser.Node> {\n return q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n search,\n postHandler: (ctx, tree) => {\n const frag = currentFragment(ctx);\n if (frag.type === 'record' && tree.type === 'wrapped-tree') {\n frag.value = extractTreeValue(ctx.source, tree, frag.offset);\n ctx.stack.pop();\n ctx.results.push(frag);\n }\n\n return ctx;\n },\n });\n}\n\nfunction recordStartHandler(ctx: Ctx, { offset }: lexer.Token): Ctx {\n ctx.stack.push({\n type: 'record',\n value: '',\n offset,\n children: {},\n });\n return ctx;\n}\n\nfunction ruleNameHandler(ctx: Ctx, { value, offset }: lexer.Token): Ctx {\n const ruleFragment = currentFragment(ctx);\n if (ruleFragment.type === 'record') {\n ruleFragment.children.rule = { type: 'string', value, offset };\n }\n\n return ctx;\n}\n\n/**\n * Matches regular rules:\n * - `git_repository(...)`\n * - `_go_repository(...)`\n */\nconst regularRule = q\n .sym<Ctx>(supportedRulesRegex, (ctx, token) =>\n ruleNameHandler(recordStartHandler(ctx, token), token),\n )\n .join(ruleCall(kwParams));\n\n/**\n * Matches \"maybe\"-form rules:\n * - `maybe(git_repository, ...)`\n * - `maybe(_go_repository, ...)`\n */\nconst maybeRule = q\n .sym<Ctx>('maybe', recordStartHandler)\n .join(\n ruleCall(\n q.alt(\n q.begin<Ctx>().sym(supportedRulesRegex, ruleNameHandler).op(','),\n kwParams,\n ),\n ),\n );\n\nconst rule = q.alt<Ctx>(maybeRule, regularRule);\n\nconst query = q.tree<Ctx>({\n type: 'root-tree',\n maxDepth: 16,\n search: rule,\n});\n\nfunction getCacheKey(input: string): string {\n const hashedInput = hash(input);\n return `bazel-parser-${hashedInput}`;\n}\n\nconst starlark = lang.createLang('starlark');\n\nexport function parse(\n input: string,\n packageFile?: string,\n): RecordFragment[] | null {\n const cacheKey = getCacheKey(input);\n\n const cachedResult = memCache.get<RecordFragment[] | null>(cacheKey);\n // istanbul ignore if\n if (cachedResult === null || cachedResult) {\n return cachedResult;\n }\n\n let result: RecordFragment[] | null = null;\n try {\n const parsedResult = starlark.query(input, query, emptyCtx(input));\n if (parsedResult) {\n result = parsedResult.results;\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Bazel parsing error');\n }\n\n memCache.set(cacheKey, result);\n return result;\n}\n"],"mappings":";;;;;;AAiBA,SAAS,SAAS,QAAqB;CACrC,OAAO;EACL;EACA,SAAS,CAAC;EACV,OAAO,CAAC;CACV;AACF;AAEA,SAAS,gBAAgB,KAA0B;CAEjD,OADwB,IAAI,MAAM,IAAI,MAAM,SAAS;AAEvD;AAEA,SAAS,iBACP,QACA,MACA,QACQ;CACR,IAAI,KAAK,SAAS,gBAAgB;EAChC,MAAM,EAAE,aAAa;EACrB,MAAM,KAAK,SAAS,SAAS,SAAS,MAAM;EAC5C,OAAO,OAAO,MAAM,QAAQ,EAAE;CAChC;;CAGA,OAAO;AACT;;;;;;;;;;;;;;;;AAiBA,MAAM,WAAWA,MACd,KAAU,KAAK,EAAE,OAAO,gBAAgB;CACvC,OAAO;EAAE,GAAG;EAAK;CAAU;AAC7B,CAAC,CAAC,CACD,GAAG,GAAG,CAAC,CACP,IAECA,MAAE,KAAK,KAAK,EAAE,QAAQ,YAAY;CAChC,MAAM,OAAO,gBAAgB,GAAG;CAChC,IAAI,KAAK,SAAS,YAAY,IAAI,WAAW;EAC3C,MAAM,MAAM,IAAI;EAChB,KAAK,SAAS,OAAO;GAAE,MAAM;GAAU;GAAO;EAAO;CACvD;CACA,OAAO;AACT,CAAC,GAEDA,MAAE,KAAK;CACL,MAAM;CACN,UAAU;CACV,YAAY;CACZ,UAAU;CACV,aAAa,KAAK,SAAS;EACzB,MAAM,eAAe,gBAAgB,GAAG;EACxC,IACE,aAAa,SAAS,YACtB,IAAI,aACJ,KAAK,SAAS,gBACd;GACA,MAAM,MAAM,IAAI;GAChB,aAAa,SAAS,OAAO;IAC3B,MAAM;IACN,OAAO;IACP,QAAQ,KAAK,WAAW;IACxB,UAAU,CAAC;GACb;EACF;EACA,OAAO;CACT;CACA,QAAQA,MAAE,IACRA,MAAE,KAAU,KAAK,EAAE,OAAO,aAAa;EACrC,MAAM,eAAe,gBAAgB,GAAG;EACxC,IAAI,aAAa,SAAS,YAAY,IAAI,WAAW;GACnD,MAAM,MAAM,IAAI;GAChB,MAAM,QAAQ,aAAa,SAAS;GACpC,IAAI,MAAM,SAAS,SACjB,MAAM,SAAS,KAAK;IAAE,MAAM;IAAU;IAAO;GAAO,CAAC;EAEzD;EACA,OAAO;CACT,CAAC,GACDA,MACG,IAAS,CAAC,CACV,QAAQ,kBAAkB,CAAC,CAC3B,SAAS,KAAK,EAAE,OAAO,aAAa;EACnC,MAAM,eAAe,gBAAgB,GAAG;EACxC,IAAI,aAAa,SAAS,UACxB,aAAa,SAAS,YAAY;GAChC,MAAM;GACN;GACA;EACF;EAEF,OAAO;CACT,CAAC,CAAC,CACD,KACCA,MAAE,GAAQ,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,YAAY;EACrC,MAAM,eAAe,gBAAgB,GAAG;EACxC,IACE,aAAa,SAAS,YACtB,aAAa,SAAS,WAEtB,aAAa,SAAS,UAAU,SAAS,IAAI;EAE/C,OAAO;CACT,CAAC,GACD,GACA,CACF,CAAC,CACA,KAAK;EACJ,MAAM;EACN,UAAU;EACV,YAAY;EACZ,UAAU;EACV,QAAQA,MACL,IACCA,MACG,KAAU,KAAK,EAAE,OAAO,oBAAoB;GAC3C,GAAG;GACH;EACF,EAAE,CAAC,CACF,GAAG,GAAG,CACX,CAAC,CACA,KAAK,KAAK,EAAE,OAAO,gBAAgB,aAAa;GAC/C,MAAM,WAAW,IAAI,YAAY;GAEjC,MAAM,eAAe,IAAI,gBAAiB,SAAS,SAAS;GAC5D,MAAM,eAAe,gBAAgB,GAAG;GACxC,IAAI,aAAa,SAAS,UACxB,aAAa,SAAS,gBAAgB;IACpC,MAAM;IACN,OAAO;IACP;GACF;GAEF,OAAO,IAAI;GACX,IAAI,WAAW,WAAW;GAC1B,OAAO;EACT,CAAC;EACH,cAAc,KAAK,SAAS;GAC1B,OAAO,IAAI;GAEX,MAAM,WAAW,gBAAgB,GAAG;GACpC,IAAI,MAAM,IAAI;GACd,IAAI,SAAS,SAAS,YAAY,KAAK,SAAS,gBAAgB;IAC9D,SAAS,QAAQ,iBACf,IAAI,QACJ,MACA,SAAS,MACX;IAEA,MAAM,eAAe,gBAAgB,GAAG;IACxC,IAAI,aAAa,SAAS,YAAY,IAAI,WAAW;KACnD,MAAM,MAAM,IAAI;KAChB,MAAM,QAAQ,aAAa,SAAS;KACpC,IAAI,MAAM,SAAS,SACjB,MAAM,SAAS,KAAK,QAAQ;IAEhC;GACF;GACA,OAAO;EACT;CACF,CAAC,CACL;CACA,cAAc,KAAK,SAAS;EAC1B,MAAM,eAAe,gBAAgB,GAAG;EACxC,IACE,aAAa,SAAS,YACtB,IAAI,aACJ,KAAK,SAAS,gBACd;GACA,MAAM,MAAM,IAAI;GAChB,MAAM,QAAQ,aAAa,SAAS;GACpC,IAAI,MAAM,SAAS,SACjB,MAAM,QAAQ,iBAAiB,IAAI,QAAQ,MAAM,MAAM,MAAM;EAEjE;EACA,OAAO;CACT;AACF,CAAC,CACH,CAAC,CACA,SAAS,QAAQ;CAChB,OAAO,IAAI;CACX,OAAO;AACT,CAAC;;;;;;;;AASH,SAAS,SACP,QACkC;CAClC,OAAOA,MAAE,KAAK;EACZ,MAAM;EACN,UAAU;EACV;EACA,cAAc,KAAK,SAAS;GAC1B,MAAM,OAAO,gBAAgB,GAAG;GAChC,IAAI,KAAK,SAAS,YAAY,KAAK,SAAS,gBAAgB;IAC1D,KAAK,QAAQ,iBAAiB,IAAI,QAAQ,MAAM,KAAK,MAAM;IAC3D,IAAI,MAAM,IAAI;IACd,IAAI,QAAQ,KAAK,IAAI;GACvB;GAEA,OAAO;EACT;CACF,CAAC;AACH;AAEA,SAAS,mBAAmB,KAAU,EAAE,UAA4B;CAClE,IAAI,MAAM,KAAK;EACb,MAAM;EACN,OAAO;EACP;EACA,UAAU,CAAC;CACb,CAAC;CACD,OAAO;AACT;AAEA,SAAS,gBAAgB,KAAU,EAAE,OAAO,UAA4B;CACtE,MAAM,eAAe,gBAAgB,GAAG;CACxC,IAAI,aAAa,SAAS,UACxB,aAAa,SAAS,OAAO;EAAE,MAAM;EAAU;EAAO;CAAO;CAG/D,OAAO;AACT;;;;;;AAOA,MAAM,cAAcA,MACjB,IAAS,sBAAsB,KAAK,UACnC,gBAAgB,mBAAmB,KAAK,KAAK,GAAG,KAAK,CACvD,CAAC,CACA,KAAK,SAAS,QAAQ,CAAC;;;;;;AAO1B,MAAM,YAAYA,MACf,IAAS,SAAS,kBAAkB,CAAC,CACrC,KACC,SACEA,MAAE,IACAA,MAAE,MAAW,CAAC,CAAC,IAAI,qBAAqB,eAAe,CAAC,CAAC,GAAG,GAAG,GAC/D,QACF,CACF,CACF;AAEF,MAAM,OAAOA,MAAE,IAAS,WAAW,WAAW;AAE9C,MAAMC,UAAQD,MAAE,KAAU;CACxB,MAAM;CACN,UAAU;CACV,QAAQ;AACV,CAAC;AAED,SAAS,YAAY,OAAuB;CAE1C,OAAO,gBADa,KAAK,KACQ;AACnC;AAEA,MAAM,WAAW,KAAK,WAAW,UAAU;AAE3C,SAAgB,MACd,OACA,aACyB;CACzB,MAAM,WAAW,YAAY,KAAK;CAElC,MAAM,eAAeE,IAAsC,QAAQ;;CAEnE,IAAI,iBAAiB,QAAQ,cAC3B,OAAO;CAGT,IAAI,SAAkC;CACtC,IAAI;EACF,MAAM,eAAe,SAAS,MAAM,OAAOD,SAAO,SAAS,KAAK,CAAC;EACjE,IAAI,cACF,SAAS,aAAa;CAE1B,SAAS,iCAAgC;EACvC,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,qBAAqB;CAC1D;CAEA,IAAa,UAAU,MAAM;CAC7B,OAAO;AACT"}
1
+ {"version":3,"file":"parser.js","names":["q","query","memCache.get"],"sources":["../../../../lib/modules/manager/bazel/parser.ts"],"sourcesContent":["import type { lexer, parser } from '@renovatebot/good-enough-parser';\nimport { lang, query as q } from '@renovatebot/good-enough-parser';\nimport { logger } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { hash } from '../../../util/hash.ts';\nimport { supportedRulesRegex } from './rules/index.ts';\nimport type { NestedFragment, RecordFragment } from './types.ts';\n\ninterface Ctx {\n readonly source: string;\n results: RecordFragment[];\n stack: NestedFragment[];\n recordKey?: string;\n subRecordKey?: string;\n argIndex?: number;\n}\n\nfunction emptyCtx(source: string): Ctx {\n return {\n source,\n results: [],\n stack: [],\n };\n}\n\nfunction currentFragment(ctx: Ctx): NestedFragment {\n const deepestFragment = ctx.stack.at(-1)!;\n return deepestFragment;\n}\n\nfunction extractTreeValue(\n source: string,\n tree: parser.Tree,\n offset: number,\n): string {\n if (tree.type === 'wrapped-tree') {\n const { endsWith } = tree;\n const to = endsWith.offset + endsWith.value.length;\n return source.slice(offset, to);\n }\n\n // istanbul ignore next\n return '';\n}\n\n/**\n * Matches key-value pairs:\n * - `tag = \"1.2.3\"`\n * - `name = \"foobar\"`\n * - `deps = [\"foo\", \"bar\"]`\n * - `\n * artifacts = [\n maven.artifact(\n group = \"com.example1\",\n artifact = \"foobar\",\n version = \"1.2.3\",\n )\n ]\n `\n **/\nconst kwParams = q\n .sym<Ctx>((ctx, { value: recordKey }) => {\n return { ...ctx, recordKey };\n })\n .op('=')\n .alt(\n // string\n q.str((ctx, { offset, value }) => {\n const frag = currentFragment(ctx);\n if (frag.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n frag.children[key] = { type: 'string', value, offset };\n }\n return ctx;\n }),\n // array of strings or calls\n q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '[',\n endsWith: ']',\n preHandler: (ctx, tree) => {\n const parentRecord = currentFragment(ctx) as RecordFragment;\n if (\n parentRecord.type === 'record' &&\n ctx.recordKey &&\n tree.type === 'wrapped-tree'\n ) {\n const key = ctx.recordKey;\n parentRecord.children[key] = {\n type: 'array',\n value: '',\n offset: tree.startsWith.offset,\n children: [],\n };\n }\n return ctx;\n },\n search: q.alt(\n q.str<Ctx>((ctx, { value, offset }) => {\n const parentRecord = currentFragment(ctx);\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n if (array.type === 'array') {\n array.children.push({ type: 'string', value, offset });\n }\n }\n return ctx;\n }),\n q\n .sym<Ctx>()\n .handler(recordStartHandler)\n .handler((ctx, { value, offset }) => {\n const ruleFragment = currentFragment(ctx);\n if (ruleFragment.type === 'record') {\n ruleFragment.children._function = {\n type: 'string',\n value,\n offset,\n };\n }\n return ctx;\n })\n .many(\n q.op<Ctx>('.').sym((ctx, { value }) => {\n const ruleFragment = currentFragment(ctx);\n if (\n ruleFragment.type === 'record' &&\n ruleFragment.children._function\n ) {\n ruleFragment.children._function.value += `.${value}`;\n }\n return ctx;\n }),\n 0,\n 3,\n )\n .tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '(',\n endsWith: ')',\n search: q\n .opt(\n q\n .sym<Ctx>((ctx, { value: subRecordKey }) => ({\n ...ctx,\n subRecordKey,\n }))\n .op('='),\n )\n .str((ctx, { value: subRecordValue, offset }) => {\n const argIndex = ctx.argIndex ?? 0;\n\n const subRecordKey = ctx.subRecordKey! ?? argIndex.toString();\n const ruleFragment = currentFragment(ctx);\n if (ruleFragment.type === 'record') {\n ruleFragment.children[subRecordKey] = {\n type: 'string',\n value: subRecordValue,\n offset,\n };\n }\n delete ctx.subRecordKey;\n ctx.argIndex = argIndex + 1;\n return ctx;\n }),\n postHandler: (ctx, tree) => {\n delete ctx.argIndex;\n\n const callFrag = currentFragment(ctx);\n ctx.stack.pop();\n if (callFrag.type === 'record' && tree.type === 'wrapped-tree') {\n callFrag.value = extractTreeValue(\n ctx.source,\n tree,\n callFrag.offset,\n );\n\n const parentRecord = currentFragment(ctx);\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n if (array.type === 'array') {\n array.children.push(callFrag);\n }\n }\n }\n return ctx;\n },\n }),\n ),\n postHandler: (ctx, tree) => {\n const parentRecord = currentFragment(ctx);\n if (\n parentRecord.type === 'record' &&\n ctx.recordKey &&\n tree.type === 'wrapped-tree'\n ) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n if (array.type === 'array') {\n array.value = extractTreeValue(ctx.source, tree, array.offset);\n }\n }\n return ctx;\n },\n }),\n )\n .handler((ctx) => {\n delete ctx.recordKey;\n return ctx;\n });\n\n/**\n * Matches rule signature:\n * `git_repository(......)`\n * ^^^^^^^^\n *\n * @param search something to match inside parens\n */\nfunction ruleCall(\n search: q.QueryBuilder<Ctx, parser.Node>,\n): q.QueryBuilder<Ctx, parser.Node> {\n return q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n search,\n postHandler: (ctx, tree) => {\n const frag = currentFragment(ctx);\n if (frag.type === 'record' && tree.type === 'wrapped-tree') {\n frag.value = extractTreeValue(ctx.source, tree, frag.offset);\n ctx.stack.pop();\n ctx.results.push(frag);\n }\n\n return ctx;\n },\n });\n}\n\nfunction recordStartHandler(ctx: Ctx, { offset }: lexer.Token): Ctx {\n ctx.stack.push({\n type: 'record',\n value: '',\n offset,\n children: {},\n });\n return ctx;\n}\n\nfunction ruleNameHandler(ctx: Ctx, { value, offset }: lexer.Token): Ctx {\n const ruleFragment = currentFragment(ctx);\n if (ruleFragment.type === 'record') {\n ruleFragment.children.rule = { type: 'string', value, offset };\n }\n\n return ctx;\n}\n\n/**\n * Matches regular rules:\n * - `git_repository(...)`\n * - `_go_repository(...)`\n */\nconst regularRule = q\n .sym<Ctx>(supportedRulesRegex, (ctx, token) =>\n ruleNameHandler(recordStartHandler(ctx, token), token),\n )\n .join(ruleCall(kwParams));\n\n/**\n * Matches \"maybe\"-form rules:\n * - `maybe(git_repository, ...)`\n * - `maybe(_go_repository, ...)`\n */\nconst maybeRule = q\n .sym<Ctx>('maybe', recordStartHandler)\n .join(\n ruleCall(\n q.alt(\n q.begin<Ctx>().sym(supportedRulesRegex, ruleNameHandler).op(','),\n kwParams,\n ),\n ),\n );\n\nconst rule = q.alt<Ctx>(maybeRule, regularRule);\n\nconst query = q.tree<Ctx>({\n type: 'root-tree',\n maxDepth: 16,\n search: rule,\n});\n\nfunction getCacheKey(input: string): string {\n const hashedInput = hash(input);\n return `bazel-parser-${hashedInput}`;\n}\n\nconst starlark = lang.createLang('starlark');\n\nexport function parse(\n input: string,\n packageFile?: string,\n): RecordFragment[] | null {\n const cacheKey = getCacheKey(input);\n\n const cachedResult = memCache.get<RecordFragment[] | null>(cacheKey);\n // istanbul ignore if\n if (cachedResult === null || cachedResult) {\n return cachedResult;\n }\n\n let result: RecordFragment[] | null = null;\n try {\n const parsedResult = starlark.query(input, query, emptyCtx(input));\n if (parsedResult) {\n result = parsedResult.results;\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Bazel parsing error');\n }\n\n memCache.set(cacheKey, result);\n return result;\n}\n"],"mappings":"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"}
@@ -17,7 +17,7 @@ const buildpackRegistryId = regEx(/^[a-z0-9\-.]+\/[a-z0-9\-.]+(?:@(?<version>.+)
17
17
  function isBuildpackRegistryId(ref) {
18
18
  const bpRegistryMatch = buildpackRegistryId.exec(ref);
19
19
  if (!bpRegistryMatch) return false;
20
- else if (!bpRegistryMatch.groups?.version) return true;
20
+ if (!bpRegistryMatch.groups?.version) return true;
21
21
  return isVersion(bpRegistryMatch.groups.version);
22
22
  }
23
23
  function isBuildpackRegistryRef(ref) {
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["getDockerDep"],"sources":["../../../../lib/modules/manager/buildpacks/extract.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { BuildpacksRegistryDatasource } from '../../datasource/buildpacks-registry/index.ts';\nimport { isVersion } from '../../versioning/semver/index.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport {\n type ProjectDescriptor,\n ProjectDescriptorToml,\n isBuildpackByName,\n isBuildpackByURI,\n} from './schema.ts';\n\nexport const DOCKER_PREFIX = regEx(/^docker:\\/?\\//);\nconst dockerRef = regEx(\n /^((?:[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?(?:\\.[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?)*)(?::\\d{2,5}\\/)?)?[a-z\\d]+((\\.|_|__|-+)[a-z\\d]+)*(\\/[a-z\\d]+((\\.|_|__|-+)[a-z\\d]+)*)*(?::(\\w[\\w.-]{0,127})(?:@sha256:[A-Fa-f\\d]{32,})?|@sha256:[A-Fa-f\\d]{32,})$/,\n);\n\nexport function isDockerRef(ref: string): boolean {\n if (ref.startsWith('docker:/') || dockerRef.test(ref)) {\n return true;\n }\n return false;\n}\nexport const BUILDPACK_REGISTRY_PREFIX = 'urn:cnb:registry:';\nconst buildpackRegistryId = regEx(\n /^[a-z0-9\\-.]+\\/[a-z0-9\\-.]+(?:@(?<version>.+))?$/,\n);\n\nfunction isBuildpackRegistryId(ref: string): boolean {\n const bpRegistryMatch = buildpackRegistryId.exec(ref);\n if (!bpRegistryMatch) {\n return false;\n } else if (!bpRegistryMatch.groups?.version) {\n return true;\n }\n return isVersion(bpRegistryMatch.groups.version);\n}\n\nexport function isBuildpackRegistryRef(ref: string): boolean {\n return (\n isBuildpackRegistryId(ref) || ref.startsWith(BUILDPACK_REGISTRY_PREFIX)\n );\n}\n\nfunction parseProjectToml(\n content: string,\n packageFile: string,\n): ProjectDescriptor | null {\n const res = ProjectDescriptorToml.safeParse(content);\n if (res.success) {\n return res.data;\n }\n\n logger.debug(\n { packageFile, err: res.error },\n 'Failed to parse buildpacks project descriptor TOML',\n );\n\n return null;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const deps: PackageDependency[] = [];\n\n const descriptor = parseProjectToml(content, packageFile);\n if (!descriptor) {\n return null;\n }\n\n if (\n descriptor.io?.buildpacks?.builder &&\n isDockerRef(descriptor.io.buildpacks.builder)\n ) {\n const dep = getDockerDep(\n descriptor.io.buildpacks.builder.replace(DOCKER_PREFIX, ''),\n true,\n config.registryAliases,\n );\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Cloud Native Buildpacks builder',\n );\n\n deps.push({ ...dep, commitMessageTopic: 'builder {{depName}}' });\n }\n\n if (\n descriptor.io?.buildpacks?.group &&\n isArray(descriptor.io.buildpacks.group)\n ) {\n for (const group of descriptor.io.buildpacks.group) {\n if (isBuildpackByURI(group) && isDockerRef(group.uri)) {\n const dep = getDockerDep(\n group.uri.replace(DOCKER_PREFIX, ''),\n true,\n config.registryAliases,\n );\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Cloud Native Buildpack',\n );\n\n deps.push(dep);\n } else if (isBuildpackByURI(group) && isBuildpackRegistryRef(group.uri)) {\n const dep = getDep(group.uri.replace(BUILDPACK_REGISTRY_PREFIX, ''));\n if (dep) {\n deps.push(dep);\n }\n } else if (isBuildpackByName(group)) {\n const version = group.version;\n\n if (version) {\n const dep: PackageDependency = {\n datasource: BuildpacksRegistryDatasource.id,\n currentValue: version,\n packageName: group.id,\n };\n deps.push(dep);\n }\n }\n }\n }\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n\nexport function getDep(currentFrom: string): PackageDependency | null {\n if (currentFrom.includes('@')) {\n const dep: PackageDependency = {\n datasource: BuildpacksRegistryDatasource.id,\n packageName: currentFrom.split('@')[0],\n autoReplaceStringTemplate:\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',\n };\n const version = currentFrom.split('@')[1];\n dep.currentValue = version;\n return dep;\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;AAkBA,MAAa,gBAAgB,MAAM,eAAe;AAClD,MAAM,YAAY,MAChB,gPACF;AAEA,SAAgB,YAAY,KAAsB;CAChD,IAAI,IAAI,WAAW,UAAU,KAAK,UAAU,KAAK,GAAG,GAClD,OAAO;CAET,OAAO;AACT;AACA,MAAa,4BAA4B;AACzC,MAAM,sBAAsB,MAC1B,kDACF;AAEA,SAAS,sBAAsB,KAAsB;CACnD,MAAM,kBAAkB,oBAAoB,KAAK,GAAG;CACpD,IAAI,CAAC,iBACH,OAAO;MACF,IAAI,CAAC,gBAAgB,QAAQ,SAClC,OAAO;CAET,OAAO,UAAU,gBAAgB,OAAO,OAAO;AACjD;AAEA,SAAgB,uBAAuB,KAAsB;CAC3D,OACE,sBAAsB,GAAG,KAAK,IAAI,WAAA,mBAAoC;AAE1E;AAEA,SAAS,iBACP,SACA,aAC0B;CAC1B,MAAM,MAAM,sBAAsB,UAAU,OAAO;CACnD,IAAI,IAAI,SACN,OAAO,IAAI;CAGb,OAAO,MACL;EAAE;EAAa,KAAK,IAAI;CAAM,GAC9B,oDACF;CAEA,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,MAAM,OAA4B,CAAC;CAEnC,MAAM,aAAa,iBAAiB,SAAS,WAAW;CACxD,IAAI,CAAC,YACH,OAAO;CAGT,IACE,WAAW,IAAI,YAAY,WAC3B,YAAY,WAAW,GAAG,WAAW,OAAO,GAC5C;EACA,MAAM,MAAMA,SACV,WAAW,GAAG,WAAW,QAAQ,QAAQ,eAAe,EAAE,GAC1D,MACA,OAAO,eACT;EACA,OAAO,MACL;GACE,SAAS,IAAI;GACb,cAAc,IAAI;GAClB,eAAe,IAAI;EACrB,GACA,iCACF;EAEA,KAAK,KAAK;GAAE,GAAG;GAAK,oBAAoB;EAAsB,CAAC;CACjE;CAEA,IACE,WAAW,IAAI,YAAY,SAC3B,QAAQ,WAAW,GAAG,WAAW,KAAK;OAEjC,MAAM,SAAS,WAAW,GAAG,WAAW,OAC3C,IAAI,iBAAiB,KAAK,KAAK,YAAY,MAAM,GAAG,GAAG;GACrD,MAAM,MAAMA,SACV,MAAM,IAAI,QAAQ,eAAe,EAAE,GACnC,MACA,OAAO,eACT;GACA,OAAO,MACL;IACE,SAAS,IAAI;IACb,cAAc,IAAI;IAClB,eAAe,IAAI;GACrB,GACA,wBACF;GAEA,KAAK,KAAK,GAAG;EACf,OAAO,IAAI,iBAAiB,KAAK,KAAK,uBAAuB,MAAM,GAAG,GAAG;GACvE,MAAM,MAAM,OAAO,MAAM,IAAI,QAAQ,2BAA2B,EAAE,CAAC;GACnE,IAAI,KACF,KAAK,KAAK,GAAG;EAEjB,OAAO,IAAI,kBAAkB,KAAK,GAAG;GACnC,MAAM,UAAU,MAAM;GAEtB,IAAI,SAAS;IACX,MAAM,MAAyB;KAC7B,YAAY,6BAA6B;KACzC,cAAc;KACd,aAAa,MAAM;IACrB;IACA,KAAK,KAAK,GAAG;GACf;EACF;;CAIJ,IAAI,CAAC,KAAK,QACR,OAAO;CAET,OAAO,EAAE,KAAK;AAChB;AAEA,SAAgB,OAAO,aAA+C;CACpE,IAAI,YAAY,SAAS,GAAG,GAAG;EAC7B,MAAM,MAAyB;GAC7B,YAAY,6BAA6B;GACzC,aAAa,YAAY,MAAM,GAAG,CAAC,CAAC;GACpC,2BACE;EACJ;EAEA,IAAI,eADY,YAAY,MAAM,GAAG,CAAC,CAAC;EAEvC,OAAO;CACT;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"extract.js","names":["getDockerDep"],"sources":["../../../../lib/modules/manager/buildpacks/extract.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { BuildpacksRegistryDatasource } from '../../datasource/buildpacks-registry/index.ts';\nimport { isVersion } from '../../versioning/semver/index.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport {\n type ProjectDescriptor,\n ProjectDescriptorToml,\n isBuildpackByName,\n isBuildpackByURI,\n} from './schema.ts';\n\nexport const DOCKER_PREFIX = regEx(/^docker:\\/?\\//);\nconst dockerRef = regEx(\n /^((?:[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?(?:\\.[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?)*)(?::\\d{2,5}\\/)?)?[a-z\\d]+((\\.|_|__|-+)[a-z\\d]+)*(\\/[a-z\\d]+((\\.|_|__|-+)[a-z\\d]+)*)*(?::(\\w[\\w.-]{0,127})(?:@sha256:[A-Fa-f\\d]{32,})?|@sha256:[A-Fa-f\\d]{32,})$/,\n);\n\nexport function isDockerRef(ref: string): boolean {\n if (ref.startsWith('docker:/') || dockerRef.test(ref)) {\n return true;\n }\n return false;\n}\nexport const BUILDPACK_REGISTRY_PREFIX = 'urn:cnb:registry:';\nconst buildpackRegistryId = regEx(\n /^[a-z0-9\\-.]+\\/[a-z0-9\\-.]+(?:@(?<version>.+))?$/,\n);\n\nfunction isBuildpackRegistryId(ref: string): boolean {\n const bpRegistryMatch = buildpackRegistryId.exec(ref);\n if (!bpRegistryMatch) {\n return false;\n }\n if (!bpRegistryMatch.groups?.version) {\n return true;\n }\n return isVersion(bpRegistryMatch.groups.version);\n}\n\nexport function isBuildpackRegistryRef(ref: string): boolean {\n return (\n isBuildpackRegistryId(ref) || ref.startsWith(BUILDPACK_REGISTRY_PREFIX)\n );\n}\n\nfunction parseProjectToml(\n content: string,\n packageFile: string,\n): ProjectDescriptor | null {\n const res = ProjectDescriptorToml.safeParse(content);\n if (res.success) {\n return res.data;\n }\n\n logger.debug(\n { packageFile, err: res.error },\n 'Failed to parse buildpacks project descriptor TOML',\n );\n\n return null;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const deps: PackageDependency[] = [];\n\n const descriptor = parseProjectToml(content, packageFile);\n if (!descriptor) {\n return null;\n }\n\n if (\n descriptor.io?.buildpacks?.builder &&\n isDockerRef(descriptor.io.buildpacks.builder)\n ) {\n const dep = getDockerDep(\n descriptor.io.buildpacks.builder.replace(DOCKER_PREFIX, ''),\n true,\n config.registryAliases,\n );\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Cloud Native Buildpacks builder',\n );\n\n deps.push({ ...dep, commitMessageTopic: 'builder {{depName}}' });\n }\n\n if (\n descriptor.io?.buildpacks?.group &&\n isArray(descriptor.io.buildpacks.group)\n ) {\n for (const group of descriptor.io.buildpacks.group) {\n if (isBuildpackByURI(group) && isDockerRef(group.uri)) {\n const dep = getDockerDep(\n group.uri.replace(DOCKER_PREFIX, ''),\n true,\n config.registryAliases,\n );\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Cloud Native Buildpack',\n );\n\n deps.push(dep);\n } else if (isBuildpackByURI(group) && isBuildpackRegistryRef(group.uri)) {\n const dep = getDep(group.uri.replace(BUILDPACK_REGISTRY_PREFIX, ''));\n if (dep) {\n deps.push(dep);\n }\n } else if (isBuildpackByName(group)) {\n const version = group.version;\n\n if (version) {\n const dep: PackageDependency = {\n datasource: BuildpacksRegistryDatasource.id,\n currentValue: version,\n packageName: group.id,\n };\n deps.push(dep);\n }\n }\n }\n }\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n\nexport function getDep(currentFrom: string): PackageDependency | null {\n if (currentFrom.includes('@')) {\n const dep: PackageDependency = {\n datasource: BuildpacksRegistryDatasource.id,\n packageName: currentFrom.split('@')[0],\n autoReplaceStringTemplate:\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',\n };\n const version = currentFrom.split('@')[1];\n dep.currentValue = version;\n return dep;\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;AAkBA,MAAa,gBAAgB,MAAM,eAAe;AAClD,MAAM,YAAY,MAChB,gPACF;AAEA,SAAgB,YAAY,KAAsB;CAChD,IAAI,IAAI,WAAW,UAAU,KAAK,UAAU,KAAK,GAAG,GAClD,OAAO;CAET,OAAO;AACT;AACA,MAAa,4BAA4B;AACzC,MAAM,sBAAsB,MAC1B,kDACF;AAEA,SAAS,sBAAsB,KAAsB;CACnD,MAAM,kBAAkB,oBAAoB,KAAK,GAAG;CACpD,IAAI,CAAC,iBACH,OAAO;CAET,IAAI,CAAC,gBAAgB,QAAQ,SAC3B,OAAO;CAET,OAAO,UAAU,gBAAgB,OAAO,OAAO;AACjD;AAEA,SAAgB,uBAAuB,KAAsB;CAC3D,OACE,sBAAsB,GAAG,KAAK,IAAI,WAAA,mBAAoC;AAE1E;AAEA,SAAS,iBACP,SACA,aAC0B;CAC1B,MAAM,MAAM,sBAAsB,UAAU,OAAO;CACnD,IAAI,IAAI,SACN,OAAO,IAAI;CAGb,OAAO,MACL;EAAE;EAAa,KAAK,IAAI;CAAM,GAC9B,oDACF;CAEA,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,MAAM,OAA4B,CAAC;CAEnC,MAAM,aAAa,iBAAiB,SAAS,WAAW;CACxD,IAAI,CAAC,YACH,OAAO;CAGT,IACE,WAAW,IAAI,YAAY,WAC3B,YAAY,WAAW,GAAG,WAAW,OAAO,GAC5C;EACA,MAAM,MAAMA,SACV,WAAW,GAAG,WAAW,QAAQ,QAAQ,eAAe,EAAE,GAC1D,MACA,OAAO,eACT;EACA,OAAO,MACL;GACE,SAAS,IAAI;GACb,cAAc,IAAI;GAClB,eAAe,IAAI;EACrB,GACA,iCACF;EAEA,KAAK,KAAK;GAAE,GAAG;GAAK,oBAAoB;EAAsB,CAAC;CACjE;CAEA,IACE,WAAW,IAAI,YAAY,SAC3B,QAAQ,WAAW,GAAG,WAAW,KAAK;OAEjC,MAAM,SAAS,WAAW,GAAG,WAAW,OAC3C,IAAI,iBAAiB,KAAK,KAAK,YAAY,MAAM,GAAG,GAAG;GACrD,MAAM,MAAMA,SACV,MAAM,IAAI,QAAQ,eAAe,EAAE,GACnC,MACA,OAAO,eACT;GACA,OAAO,MACL;IACE,SAAS,IAAI;IACb,cAAc,IAAI;IAClB,eAAe,IAAI;GACrB,GACA,wBACF;GAEA,KAAK,KAAK,GAAG;EACf,OAAO,IAAI,iBAAiB,KAAK,KAAK,uBAAuB,MAAM,GAAG,GAAG;GACvE,MAAM,MAAM,OAAO,MAAM,IAAI,QAAQ,2BAA2B,EAAE,CAAC;GACnE,IAAI,KACF,KAAK,KAAK,GAAG;EAEjB,OAAO,IAAI,kBAAkB,KAAK,GAAG;GACnC,MAAM,UAAU,MAAM;GAEtB,IAAI,SAAS;IACX,MAAM,MAAyB;KAC7B,YAAY,6BAA6B;KACzC,cAAc;KACd,aAAa,MAAM;IACrB;IACA,KAAK,KAAK,GAAG;GACf;EACF;;CAIJ,IAAI,CAAC,KAAK,QACR,OAAO;CAET,OAAO,EAAE,KAAK;AAChB;AAEA,SAAgB,OAAO,aAA+C;CACpE,IAAI,YAAY,SAAS,GAAG,GAAG;EAC7B,MAAM,MAAyB;GAC7B,YAAY,6BAA6B;GACzC,aAAa,YAAY,MAAM,GAAG,CAAC,CAAC;GACpC,2BACE;EACJ;EAEA,IAAI,eADY,YAAY,MAAM,GAAG,CAAC,CAAC;EAEvC,OAAO;CACT;CAEA,OAAO;AACT"}
@@ -16,26 +16,25 @@ async function getRubyConstraint(updateArtifact) {
16
16
  if (ruby) {
17
17
  logger.debug("Using ruby constraint from config");
18
18
  return ruby;
19
- } else {
20
- const rubyMatch = extractRubyVersion(newPackageFileContent);
21
- if (rubyMatch) {
22
- logger.debug("Using ruby version from gemfile");
23
- return rubyMatch;
24
- }
25
- for (const file of [".ruby-version", ".tool-versions"]) {
26
- const rubyVersion = (await readLocalFile(getSiblingFileName(packageFileName, file), "utf8"))?.match(regEx(/^(?:ruby(?:-|\s+))?(\d[\d.]*)/m))?.[1];
27
- if (rubyVersion) {
28
- logger.debug(`Using ruby version specified in ${file}`);
29
- return rubyVersion;
30
- }
19
+ }
20
+ const rubyMatch = extractRubyVersion(newPackageFileContent);
21
+ if (rubyMatch) {
22
+ logger.debug("Using ruby version from gemfile");
23
+ return rubyMatch;
24
+ }
25
+ for (const file of [".ruby-version", ".tool-versions"]) {
26
+ const rubyVersion = (await readLocalFile(getSiblingFileName(packageFileName, file), "utf8"))?.match(regEx(/^(?:ruby(?:-|\s+))?(\d[\d.]*)/m))?.[1];
27
+ if (rubyVersion) {
28
+ logger.debug(`Using ruby version specified in ${file}`);
29
+ return rubyVersion;
31
30
  }
32
- const lockFile = await getLockFilePath(packageFileName);
33
- if (lockFile) {
34
- const rubyVersion = (await readLocalFile(lockFile, "utf8"))?.match(regEx(/^ {3}ruby (\d[\d.]*)(?:[a-z]|\s|$)/m))?.[1];
35
- if (rubyVersion) {
36
- logger.debug(`Using ruby version specified in lock file`);
37
- return rubyVersion;
38
- }
31
+ }
32
+ const lockFile = await getLockFilePath(packageFileName);
33
+ if (lockFile) {
34
+ const rubyVersion = (await readLocalFile(lockFile, "utf8"))?.match(regEx(/^ {3}ruby (\d[\d.]*)(?:[a-z]|\s|$)/m))?.[1];
35
+ if (rubyVersion) {
36
+ logger.debug(`Using ruby version specified in lock file`);
37
+ return rubyVersion;
39
38
  }
40
39
  }
41
40
  return null;
@@ -47,12 +46,11 @@ function getBundlerConstraint(updateArtifact, existingLockFileContent) {
47
46
  if (bundler) {
48
47
  logger.debug("Using bundler constraint from config");
49
48
  return bundler;
50
- } else {
51
- const bundledWith = regEx(/\nBUNDLED WITH\n\s+(.*?)(\n|$)/).exec(existingLockFileContent);
52
- if (bundledWith) {
53
- logger.debug("Using bundler version specified in lockfile");
54
- return bundledWith[1];
55
- }
49
+ }
50
+ const bundledWith = regEx(/\nBUNDLED WITH\n\s+(.*?)(\n|$)/).exec(existingLockFileContent);
51
+ if (bundledWith) {
52
+ logger.debug("Using bundler version specified in lockfile");
53
+ return bundledWith[1];
56
54
  }
57
55
  return null;
58
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":[],"sources":["../../../../lib/modules/manager/bundler/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport {\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { UpdateArtifact } from '../types.ts';\n\nexport const delimiters = ['\"', \"'\"];\n\nexport function extractRubyVersion(txt: string): string | null {\n const rubyMatch = regEx(/^ruby\\s+(\"[^\"]+\"|'[^']+')\\s*$/gm).exec(txt);\n if (rubyMatch?.length !== 2) {\n return null;\n }\n const quotedVersion = rubyMatch[1];\n return quotedVersion.substring(1, quotedVersion.length - 1);\n}\n\nexport async function getRubyConstraint(\n updateArtifact: UpdateArtifact,\n): Promise<string | null> {\n const { packageFileName, config, newPackageFileContent } = updateArtifact;\n const { constraints = {} } = config;\n const { ruby } = constraints;\n\n if (ruby) {\n logger.debug('Using ruby constraint from config');\n return ruby;\n } else {\n const rubyMatch = extractRubyVersion(newPackageFileContent);\n if (rubyMatch) {\n logger.debug('Using ruby version from gemfile');\n return rubyMatch;\n }\n for (const file of ['.ruby-version', '.tool-versions']) {\n const rubyVersion = (\n await readLocalFile(getSiblingFileName(packageFileName, file), 'utf8')\n )?.match(regEx(/^(?:ruby(?:-|\\s+))?(\\d[\\d.]*)/m))?.[1];\n if (rubyVersion) {\n logger.debug(`Using ruby version specified in ${file}`);\n return rubyVersion;\n }\n }\n const lockFile = await getLockFilePath(packageFileName);\n if (lockFile) {\n const rubyVersion = (await readLocalFile(lockFile, 'utf8'))?.match(\n regEx(/^ {3}ruby (\\d[\\d.]*)(?:[a-z]|\\s|$)/m),\n )?.[1];\n if (rubyVersion) {\n logger.debug(`Using ruby version specified in lock file`);\n return rubyVersion;\n }\n }\n }\n return null;\n}\n\nexport function getBundlerConstraint(\n updateArtifact: Pick<UpdateArtifact, 'config'>,\n existingLockFileContent: string,\n): string | null {\n const { config } = updateArtifact;\n const { constraints = {} } = config;\n const { bundler } = constraints;\n\n if (bundler) {\n logger.debug('Using bundler constraint from config');\n return bundler;\n } else {\n const bundledWith = regEx(/\\nBUNDLED WITH\\n\\s+(.*?)(\\n|$)/).exec(\n existingLockFileContent,\n );\n if (bundledWith) {\n logger.debug('Using bundler version specified in lockfile');\n return bundledWith[1];\n }\n }\n return null;\n}\n\nexport async function getLockFilePath(\n packageFilePath: string,\n): Promise<string> {\n const lockFilePath = (await localPathExists(`${packageFilePath}.lock`))\n ? `${packageFilePath}.lock`\n : `Gemfile.lock`;\n logger.debug(`Lockfile for ${packageFilePath} found in ${lockFilePath}`);\n return lockFilePath;\n}\n"],"mappings":";;;;AASA,MAAa,aAAa,CAAC,MAAK,GAAG;AAEnC,SAAgB,mBAAmB,KAA4B;CAC7D,MAAM,YAAY,MAAM,iCAAiC,CAAC,CAAC,KAAK,GAAG;CACnE,IAAI,WAAW,WAAW,GACxB,OAAO;CAET,MAAM,gBAAgB,UAAU;CAChC,OAAO,cAAc,UAAU,GAAG,cAAc,SAAS,CAAC;AAC5D;AAEA,eAAsB,kBACpB,gBACwB;CACxB,MAAM,EAAE,iBAAiB,QAAQ,0BAA0B;CAC3D,MAAM,EAAE,cAAc,CAAC,MAAM;CAC7B,MAAM,EAAE,SAAS;CAEjB,IAAI,MAAM;EACR,OAAO,MAAM,mCAAmC;EAChD,OAAO;CACT,OAAO;EACL,MAAM,YAAY,mBAAmB,qBAAqB;EAC1D,IAAI,WAAW;GACb,OAAO,MAAM,iCAAiC;GAC9C,OAAO;EACT;EACA,KAAK,MAAM,QAAQ,CAAC,iBAAiB,gBAAgB,GAAG;GACtD,MAAM,eACJ,MAAM,cAAc,mBAAmB,iBAAiB,IAAI,GAAG,MAAM,EAAA,EACpE,MAAM,MAAM,gCAAgC,CAAC,CAAC,GAAG;GACpD,IAAI,aAAa;IACf,OAAO,MAAM,mCAAmC,MAAM;IACtD,OAAO;GACT;EACF;EACA,MAAM,WAAW,MAAM,gBAAgB,eAAe;EACtD,IAAI,UAAU;GACZ,MAAM,eAAe,MAAM,cAAc,UAAU,MAAM,EAAA,EAAI,MAC3D,MAAM,qCAAqC,CAC7C,CAAC,GAAG;GACJ,IAAI,aAAa;IACf,OAAO,MAAM,2CAA2C;IACxD,OAAO;GACT;EACF;CACF;CACA,OAAO;AACT;AAEA,SAAgB,qBACd,gBACA,yBACe;CACf,MAAM,EAAE,WAAW;CACnB,MAAM,EAAE,cAAc,CAAC,MAAM;CAC7B,MAAM,EAAE,YAAY;CAEpB,IAAI,SAAS;EACX,OAAO,MAAM,sCAAsC;EACnD,OAAO;CACT,OAAO;EACL,MAAM,cAAc,MAAM,gCAAgC,CAAC,CAAC,KAC1D,uBACF;EACA,IAAI,aAAa;GACf,OAAO,MAAM,6CAA6C;GAC1D,OAAO,YAAY;EACrB;CACF;CACA,OAAO;AACT;AAEA,eAAsB,gBACpB,iBACiB;CACjB,MAAM,eAAgB,MAAM,gBAAgB,GAAG,gBAAgB,MAAM,IACjE,GAAG,gBAAgB,SACnB;CACJ,OAAO,MAAM,gBAAgB,gBAAgB,YAAY,cAAc;CACvE,OAAO;AACT"}
1
+ {"version":3,"file":"common.js","names":[],"sources":["../../../../lib/modules/manager/bundler/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport {\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { UpdateArtifact } from '../types.ts';\n\nexport const delimiters = ['\"', \"'\"];\n\nexport function extractRubyVersion(txt: string): string | null {\n const rubyMatch = regEx(/^ruby\\s+(\"[^\"]+\"|'[^']+')\\s*$/gm).exec(txt);\n if (rubyMatch?.length !== 2) {\n return null;\n }\n const quotedVersion = rubyMatch[1];\n return quotedVersion.substring(1, quotedVersion.length - 1);\n}\n\nexport async function getRubyConstraint(\n updateArtifact: UpdateArtifact,\n): Promise<string | null> {\n const { packageFileName, config, newPackageFileContent } = updateArtifact;\n const { constraints = {} } = config;\n const { ruby } = constraints;\n\n if (ruby) {\n logger.debug('Using ruby constraint from config');\n return ruby;\n }\n const rubyMatch = extractRubyVersion(newPackageFileContent);\n if (rubyMatch) {\n logger.debug('Using ruby version from gemfile');\n return rubyMatch;\n }\n for (const file of ['.ruby-version', '.tool-versions']) {\n const rubyVersion = (\n await readLocalFile(getSiblingFileName(packageFileName, file), 'utf8')\n )?.match(regEx(/^(?:ruby(?:-|\\s+))?(\\d[\\d.]*)/m))?.[1];\n if (rubyVersion) {\n logger.debug(`Using ruby version specified in ${file}`);\n return rubyVersion;\n }\n }\n const lockFile = await getLockFilePath(packageFileName);\n if (lockFile) {\n const rubyVersion = (await readLocalFile(lockFile, 'utf8'))?.match(\n regEx(/^ {3}ruby (\\d[\\d.]*)(?:[a-z]|\\s|$)/m),\n )?.[1];\n if (rubyVersion) {\n logger.debug(`Using ruby version specified in lock file`);\n return rubyVersion;\n }\n }\n\n return null;\n}\n\nexport function getBundlerConstraint(\n updateArtifact: Pick<UpdateArtifact, 'config'>,\n existingLockFileContent: string,\n): string | null {\n const { config } = updateArtifact;\n const { constraints = {} } = config;\n const { bundler } = constraints;\n\n if (bundler) {\n logger.debug('Using bundler constraint from config');\n return bundler;\n }\n const bundledWith = regEx(/\\nBUNDLED WITH\\n\\s+(.*?)(\\n|$)/).exec(\n existingLockFileContent,\n );\n if (bundledWith) {\n logger.debug('Using bundler version specified in lockfile');\n return bundledWith[1];\n }\n\n return null;\n}\n\nexport async function getLockFilePath(\n packageFilePath: string,\n): Promise<string> {\n const lockFilePath = (await localPathExists(`${packageFilePath}.lock`))\n ? `${packageFilePath}.lock`\n : `Gemfile.lock`;\n logger.debug(`Lockfile for ${packageFilePath} found in ${lockFilePath}`);\n return lockFilePath;\n}\n"],"mappings":";;;;AASA,MAAa,aAAa,CAAC,MAAK,GAAG;AAEnC,SAAgB,mBAAmB,KAA4B;CAC7D,MAAM,YAAY,MAAM,iCAAiC,CAAC,CAAC,KAAK,GAAG;CACnE,IAAI,WAAW,WAAW,GACxB,OAAO;CAET,MAAM,gBAAgB,UAAU;CAChC,OAAO,cAAc,UAAU,GAAG,cAAc,SAAS,CAAC;AAC5D;AAEA,eAAsB,kBACpB,gBACwB;CACxB,MAAM,EAAE,iBAAiB,QAAQ,0BAA0B;CAC3D,MAAM,EAAE,cAAc,CAAC,MAAM;CAC7B,MAAM,EAAE,SAAS;CAEjB,IAAI,MAAM;EACR,OAAO,MAAM,mCAAmC;EAChD,OAAO;CACT;CACA,MAAM,YAAY,mBAAmB,qBAAqB;CAC1D,IAAI,WAAW;EACb,OAAO,MAAM,iCAAiC;EAC9C,OAAO;CACT;CACA,KAAK,MAAM,QAAQ,CAAC,iBAAiB,gBAAgB,GAAG;EACtD,MAAM,eACJ,MAAM,cAAc,mBAAmB,iBAAiB,IAAI,GAAG,MAAM,EAAA,EACpE,MAAM,MAAM,gCAAgC,CAAC,CAAC,GAAG;EACpD,IAAI,aAAa;GACf,OAAO,MAAM,mCAAmC,MAAM;GACtD,OAAO;EACT;CACF;CACA,MAAM,WAAW,MAAM,gBAAgB,eAAe;CACtD,IAAI,UAAU;EACZ,MAAM,eAAe,MAAM,cAAc,UAAU,MAAM,EAAA,EAAI,MAC3D,MAAM,qCAAqC,CAC7C,CAAC,GAAG;EACJ,IAAI,aAAa;GACf,OAAO,MAAM,2CAA2C;GACxD,OAAO;EACT;CACF;CAEA,OAAO;AACT;AAEA,SAAgB,qBACd,gBACA,yBACe;CACf,MAAM,EAAE,WAAW;CACnB,MAAM,EAAE,cAAc,CAAC,MAAM;CAC7B,MAAM,EAAE,YAAY;CAEpB,IAAI,SAAS;EACX,OAAO,MAAM,sCAAsC;EACnD,OAAO;CACT;CACA,MAAM,cAAc,MAAM,gCAAgC,CAAC,CAAC,KAC1D,uBACF;CACA,IAAI,aAAa;EACf,OAAO,MAAM,6CAA6C;EAC1D,OAAO,YAAY;CACrB;CAEA,OAAO;AACT;AAEA,eAAsB,gBACpB,iBACiB;CACjB,MAAM,eAAgB,MAAM,gBAAgB,GAAG,gBAAgB,MAAM,IACjE,GAAG,gBAAgB,SACnB;CACJ,OAAO,MAAM,gBAAgB,gBAAgB,YAAY,cAAc;CACvE,OAAO;AACT"}
@@ -77,9 +77,7 @@ async function extractPackageFile(content, packageFile) {
77
77
  registryUrls: null
78
78
  });
79
79
  const variableMatch = variableMatchRegex.exec(line);
80
- if (variableMatch) {
81
- if (variableMatch.groups?.key) variables[variableMatch.groups?.key] = variableMatch.groups?.value;
82
- }
80
+ if (variableMatch?.groups?.key) variables[variableMatch.groups?.key] = variableMatch.groups?.value;
83
81
  const gemMatch = gemMatchRegex.exec(line)?.groups;
84
82
  if (gemMatch) {
85
83
  const dep = {
@@ -117,9 +115,7 @@ async function extractPackageFile(content, packageFile) {
117
115
  if (sourceBlockMatch) {
118
116
  let repositoryUrl = "";
119
117
  if (sourceBlockMatch.groups?.registryUrl) repositoryUrl = sourceBlockMatch.groups.registryUrl;
120
- if (sourceBlockMatch.groups?.sourceName) {
121
- if (variables[sourceBlockMatch.groups.sourceName]) repositoryUrl = variables[sourceBlockMatch.groups.sourceName];
122
- }
118
+ if (sourceBlockMatch.groups?.sourceName && variables[sourceBlockMatch.groups.sourceName]) repositoryUrl = variables[sourceBlockMatch.groups.sourceName];
123
119
  const sourceLineNumber = lineNumber;
124
120
  let sourceContent = "";
125
121
  let sourceLine = "";