renovate 44.90.3 → 44.92.0

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 (73) hide show
  1. package/dist/config/options/index.js +1 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/global-config-option-defaults.generated.js +1 -1
  4. package/dist/global-config-option-defaults.generated.js.map +1 -1
  5. package/dist/modules/datasource/cdnjs/index.js +2 -0
  6. package/dist/modules/datasource/cdnjs/index.js.map +1 -1
  7. package/dist/modules/manager/ansible-galaxy/collections.js +4 -6
  8. package/dist/modules/manager/ansible-galaxy/collections.js.map +1 -1
  9. package/dist/modules/manager/azure-pipelines/extract.js +1 -0
  10. package/dist/modules/manager/azure-pipelines/extract.js.map +1 -1
  11. package/dist/modules/manager/bazel/artifacts.js +5 -1
  12. package/dist/modules/manager/bazel/artifacts.js.map +1 -1
  13. package/dist/modules/manager/bazel/parser.js +15 -0
  14. package/dist/modules/manager/bazel/parser.js.map +1 -1
  15. package/dist/modules/manager/bazel/rules/http.js.map +1 -1
  16. package/dist/modules/manager/bundler/common.js +1 -0
  17. package/dist/modules/manager/bundler/common.js.map +1 -1
  18. package/dist/modules/manager/cargo/artifacts.js +2 -0
  19. package/dist/modules/manager/cargo/artifacts.js.map +1 -1
  20. package/dist/modules/manager/cargo/extract.js.map +1 -1
  21. package/dist/modules/manager/cocoapods/extract.js +3 -0
  22. package/dist/modules/manager/cocoapods/extract.js.map +1 -1
  23. package/dist/modules/manager/composer/artifacts.js +1 -0
  24. package/dist/modules/manager/composer/artifacts.js.map +1 -1
  25. package/dist/modules/manager/composer/schema.js.map +1 -1
  26. package/dist/modules/manager/cpanfile/parser.js +2 -0
  27. package/dist/modules/manager/cpanfile/parser.js.map +1 -1
  28. package/dist/modules/manager/deps-edn/extract.js +3 -1
  29. package/dist/modules/manager/deps-edn/extract.js.map +1 -1
  30. package/dist/modules/manager/droneci/extract.js +4 -6
  31. package/dist/modules/manager/droneci/extract.js.map +1 -1
  32. package/dist/modules/manager/fingerprint.generated.js +11 -11
  33. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  34. package/dist/modules/manager/flux/extract.js +1 -0
  35. package/dist/modules/manager/flux/extract.js.map +1 -1
  36. package/dist/modules/manager/github-actions/extract.js +3 -0
  37. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  38. package/dist/modules/manager/github-actions/known-actions.js +268 -2
  39. package/dist/modules/manager/github-actions/known-actions.js.map +1 -1
  40. package/dist/modules/manager/gitlabci/extract.js +1 -0
  41. package/dist/modules/manager/gitlabci/extract.js.map +1 -1
  42. package/dist/modules/manager/glasskube/extract.js +2 -0
  43. package/dist/modules/manager/glasskube/extract.js.map +1 -1
  44. package/dist/modules/manager/gomod/artifacts-extra.js +1 -0
  45. package/dist/modules/manager/gomod/artifacts-extra.js.map +1 -1
  46. package/dist/modules/manager/gomod/artifacts.js +1 -0
  47. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  48. package/dist/modules/manager/gomod/extract.js +1 -0
  49. package/dist/modules/manager/gomod/extract.js.map +1 -1
  50. package/dist/modules/manager/gradle/artifacts.js +1 -1
  51. package/dist/modules/manager/gradle/artifacts.js.map +1 -1
  52. package/dist/modules/manager/gradle-wrapper/utils.js +1 -0
  53. package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
  54. package/dist/modules/manager/npm/extract/common/dependency.js +2 -1
  55. package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
  56. package/dist/modules/manager/pep621/extract.js +1 -2
  57. package/dist/modules/manager/pep621/extract.js.map +1 -1
  58. package/dist/modules/manager/quadlet/extract.js +2 -4
  59. package/dist/modules/manager/quadlet/extract.js.map +1 -1
  60. package/dist/modules/manager/swift/artifacts.js +3 -1
  61. package/dist/modules/manager/swift/artifacts.js.map +1 -1
  62. package/dist/modules/manager/swift/extract.js +1 -0
  63. package/dist/modules/manager/swift/extract.js.map +1 -1
  64. package/dist/modules/manager/terraform/extractors/others/modules.js.map +1 -1
  65. package/dist/modules/manager/terraform/lockfile/index.js +1 -0
  66. package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
  67. package/dist/modules/manager/terragrunt/extract.js +1 -0
  68. package/dist/modules/manager/terragrunt/extract.js.map +1 -1
  69. package/dist/modules/manager/tflint-plugin/extract.js +1 -0
  70. package/dist/modules/manager/tflint-plugin/extract.js.map +1 -1
  71. package/dist/modules/manager/tflint-plugin/plugins.js.map +1 -1
  72. package/package.json +3 -3
  73. package/renovate-schema.json +2 -2
@@ -23,7 +23,7 @@ const globalConfigOptionDefaults = {
23
23
  "detectHostRulesFromEnv": false,
24
24
  "dockerChildPrefix": "renovate_",
25
25
  "dockerMaxPages": 20,
26
- "dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.98.3",
26
+ "dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.98.6",
27
27
  "dockerUser": "12021",
28
28
  "executionTimeout": 15,
29
29
  "exitCodeForErrors": false,
@@ -1 +1 @@
1
- {"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.98.3\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exitCodeForErrors\": false,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"inheritConfigTrusted\": false,\n \"internalHostAccess\": \"warn\",\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"rebaseAllOpenBranches\": false,\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,8BAA8B;CAC9B,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,wBAAwB;CACxB,sBAAsB;CACtB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,yBAAyB;CACzB,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
1
+ {"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.98.6\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exitCodeForErrors\": false,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"inheritConfigTrusted\": false,\n \"internalHostAccess\": \"warn\",\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"rebaseAllOpenBranches\": false,\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,8BAA8B;CAC9B,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,wBAAwB;CACxB,sBAAsB;CACtB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,yBAAyB;CACzB,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
@@ -40,6 +40,7 @@ var CdnjsDatasource = class CdnjsDatasource extends Datasource {
40
40
  return withCache({
41
41
  namespace: `datasource-${CdnjsDatasource.id}`,
42
42
  key: `getReleases:${library}`,
43
+ cacheable: true,
43
44
  fallback: true
44
45
  }, () => this._getReleases(config));
45
46
  }
@@ -64,6 +65,7 @@ var CdnjsDatasource = class CdnjsDatasource extends Datasource {
64
65
  return withCache({
65
66
  namespace: `datasource-${CdnjsDatasource.id}`,
66
67
  key: `getDigest:${config.registryUrl}:${config.packageName}:${newValue}`,
68
+ cacheable: true,
67
69
  fallback: true
68
70
  }, () => this._getDigest(config, newValue));
69
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/cdnjs/index.ts"],"sourcesContent":["import { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { HttpError } from '../../../util/http/index.ts';\nimport { Result } from '../../../util/result.ts';\nimport { Datasource } from '../datasource.ts';\nimport { DigestsConfig, ReleasesConfig } from '../schema.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { CdnjsAPISriResponse, CdnjsAPIVersionResponse } from './schema.ts';\n\nexport class CdnjsDatasource extends Datasource {\n static readonly id = 'cdnjs';\n\n constructor() {\n super(CdnjsDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultRegistryUrls = ['https://api.cdnjs.com/'];\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ packageName, registryUrl }) => {\n const [library] = packageName.split('/');\n\n const url = `${registryUrl}libraries/${library}?fields=homepage,repository,versions`;\n\n return this.http.getJsonSafe(\n url,\n { cacheProvider: memCacheProvider },\n CdnjsAPIVersionResponse,\n );\n })\n .transform(({ versions, homepage, repository }): ReleaseResult => {\n const releases: Release[] = versions;\n\n const res: ReleaseResult = { releases };\n\n if (homepage) {\n res.homepage = homepage;\n }\n\n if (repository) {\n res.sourceUrl = repository;\n }\n\n return res;\n });\n\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'cdnjs: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const library = config.packageName.split('/')[0];\n return withCache(\n {\n namespace: `datasource-${CdnjsDatasource.id}`,\n key: `getReleases:${library}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getDigest(\n config: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n const { packageName } = config;\n const [library] = packageName.split('/');\n const assetName = packageName.replace(`${library}/`, '');\n\n const result = Result.parse(config, DigestsConfig)\n .transform(({ registryUrl }) => {\n const url = `${registryUrl}libraries/${library}/${newValue}?fields=sri`;\n\n return this.http.getJsonSafe(url, CdnjsAPISriResponse);\n })\n .transform(({ sri }): string => {\n return sri?.[assetName];\n });\n\n const { val = null, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'cdnjs: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${CdnjsDatasource.id}`,\n key: `getDigest:${config.registryUrl}:${config.packageName}:${newValue}`,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n override handleHttpErrors(err: HttpError): void {\n if (err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,wBAAwB;CAEjE,mBAAqC;CACrC,gBACE;CAEF,MAAc,aACZ,QAC+B;EA6B/B,MAAM,EAAE,KAAK,QAAQ,MA5BN,OAAO,MAAM,QAAQ,cAAc,CAAC,CAChD,WAAW,EAAE,aAAa,kBAAkB;GAC3C,MAAM,CAAC,WAAW,YAAY,MAAM,GAAG;GAEvC,MAAM,MAAM,GAAG,YAAY,YAAY,QAAQ;GAE/C,OAAO,KAAK,KAAK,YACf,KACA,EAAE,eAAe,iBAAiB,GAClC,uBACF;EACF,CAAC,CAAC,CACD,WAAW,EAAE,UAAU,UAAU,iBAAgC;GAGhE,MAAM,MAAqB,EAAE,UAAA,SAAS;GAEtC,IAAI,UACF,IAAI,WAAW;GAGjB,IAAI,YACF,IAAI,YAAY;GAGlB,OAAO;EACT,CAE8B,CAAC,CAAC,OAAO;EAEzC,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,yBAAyB;GAC/C,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,MAAM,UAAU,OAAO,YAAY,MAAM,GAAG,CAAC,CAAC;EAC9C,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,eAAe;GACpB,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,WACZ,QACA,UACwB;EACxB,MAAM,EAAE,gBAAgB;EACxB,MAAM,CAAC,WAAW,YAAY,MAAM,GAAG;EACvC,MAAM,YAAY,YAAY,QAAQ,GAAG,QAAQ,IAAI,EAAE;EAYvD,MAAM,EAAE,MAAM,MAAM,QAAQ,MAVb,OAAO,MAAM,QAAQ,aAAa,CAAC,CAC/C,WAAW,EAAE,kBAAkB;GAC9B,MAAM,MAAM,GAAG,YAAY,YAAY,QAAQ,GAAG,SAAS;GAE3D,OAAO,KAAK,KAAK,YAAY,KAAK,mBAAmB;EACvD,CAAC,CAAC,CACD,WAAW,EAAE,UAAkB;GAC9B,OAAO,MAAM;EACf,CAEqC,CAAC,CAAC,OAAO;EAEhD,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,yBAAyB;GAC/C,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,aAAa,OAAO,YAAY,GAAG,OAAO,YAAY,GAAG;GAC9D,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;CAEA,iBAA0B,KAAsB;EAC9C,IAAI,IAAI,UAAU,eAAe,KAC/B,MAAM,IAAI,kBAAkB,GAAG;CAEnC;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/cdnjs/index.ts"],"sourcesContent":["import { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { HttpError } from '../../../util/http/index.ts';\nimport { Result } from '../../../util/result.ts';\nimport { Datasource } from '../datasource.ts';\nimport { DigestsConfig, ReleasesConfig } from '../schema.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { CdnjsAPISriResponse, CdnjsAPIVersionResponse } from './schema.ts';\n\nexport class CdnjsDatasource extends Datasource {\n static readonly id = 'cdnjs';\n\n constructor() {\n super(CdnjsDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultRegistryUrls = ['https://api.cdnjs.com/'];\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ packageName, registryUrl }) => {\n const [library] = packageName.split('/');\n\n const url = `${registryUrl}libraries/${library}?fields=homepage,repository,versions`;\n\n return this.http.getJsonSafe(\n url,\n { cacheProvider: memCacheProvider },\n CdnjsAPIVersionResponse,\n );\n })\n .transform(({ versions, homepage, repository }): ReleaseResult => {\n const releases: Release[] = versions;\n\n const res: ReleaseResult = { releases };\n\n if (homepage) {\n res.homepage = homepage;\n }\n\n if (repository) {\n res.sourceUrl = repository;\n }\n\n return res;\n });\n\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'cdnjs: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const library = config.packageName.split('/')[0];\n return withCache(\n {\n namespace: `datasource-${CdnjsDatasource.id}`,\n key: `getReleases:${library}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getDigest(\n config: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n const { packageName } = config;\n const [library] = packageName.split('/');\n const assetName = packageName.replace(`${library}/`, '');\n\n const result = Result.parse(config, DigestsConfig)\n .transform(({ registryUrl }) => {\n const url = `${registryUrl}libraries/${library}/${newValue}?fields=sri`;\n\n return this.http.getJsonSafe(url, CdnjsAPISriResponse);\n })\n .transform(({ sri }): string => {\n return sri?.[assetName];\n });\n\n const { val = null, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'cdnjs: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${CdnjsDatasource.id}`,\n key: `getDigest:${config.registryUrl}:${config.packageName}:${newValue}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n override handleHttpErrors(err: HttpError): void {\n if (err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,wBAAwB;CAEjE,mBAAqC;CACrC,gBACE;CAEF,MAAc,aACZ,QAC+B;EA6B/B,MAAM,EAAE,KAAK,QAAQ,MA5BN,OAAO,MAAM,QAAQ,cAAc,CAAC,CAChD,WAAW,EAAE,aAAa,kBAAkB;GAC3C,MAAM,CAAC,WAAW,YAAY,MAAM,GAAG;GAEvC,MAAM,MAAM,GAAG,YAAY,YAAY,QAAQ;GAE/C,OAAO,KAAK,KAAK,YACf,KACA,EAAE,eAAe,iBAAiB,GAClC,uBACF;EACF,CAAC,CAAC,CACD,WAAW,EAAE,UAAU,UAAU,iBAAgC;GAGhE,MAAM,MAAqB,EAAE,UAAA,SAAS;GAEtC,IAAI,UACF,IAAI,WAAW;GAGjB,IAAI,YACF,IAAI,YAAY;GAGlB,OAAO;EACT,CAE8B,CAAC,CAAC,OAAO;EAEzC,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,yBAAyB;GAC/C,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,MAAM,UAAU,OAAO,YAAY,MAAM,GAAG,CAAC,CAAC;EAC9C,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,eAAe;GACpB,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,WACZ,QACA,UACwB;EACxB,MAAM,EAAE,gBAAgB;EACxB,MAAM,CAAC,WAAW,YAAY,MAAM,GAAG;EACvC,MAAM,YAAY,YAAY,QAAQ,GAAG,QAAQ,IAAI,EAAE;EAYvD,MAAM,EAAE,MAAM,MAAM,QAAQ,MAVb,OAAO,MAAM,QAAQ,aAAa,CAAC,CAC/C,WAAW,EAAE,kBAAkB;GAC9B,MAAM,MAAM,GAAG,YAAY,YAAY,QAAQ,GAAG,SAAS;GAE3D,OAAO,KAAK,KAAK,YAAY,KAAK,mBAAmB;EACvD,CAAC,CAAC,CACD,WAAW,EAAE,UAAkB;GAC9B,OAAO,MAAM;EACf,CAEqC,CAAC,CAAC,OAAO;EAEhD,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,yBAAyB;GAC/C,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,aAAa,OAAO,YAAY,GAAG,OAAO,YAAY,GAAG;GAC9D,WAAW;GACX,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;CAEA,iBAA0B,KAAsB;EAC9C,IAAI,IAAI,UAAU,eAAe,KAC/B,MAAM,IAAI,kBAAkB,GAAG;CAEnC;AACF"}
@@ -75,10 +75,9 @@ function finalize(dependency) {
75
75
  break;
76
76
  default:
77
77
  dep.skipReason = "unsupported";
78
- return true;
78
+ return;
79
79
  }
80
80
  if (!dependency.currentValue && !dep.skipReason) dep.skipReason = "unspecified-version";
81
- return true;
82
81
  }
83
82
  function extractCollections(lines) {
84
83
  const deps = [];
@@ -101,10 +100,9 @@ function extractCollections(lines) {
101
100
  lineMatch = blockLineRegEx.exec(line);
102
101
  if (lineMatch) lineNumber += 1;
103
102
  } while (lineMatch);
104
- if (finalize(dep)) {
105
- delete dep.managerData;
106
- deps.push(dep);
107
- }
103
+ finalize(dep);
104
+ delete dep.managerData;
105
+ deps.push(dep);
108
106
  }
109
107
  }
110
108
  return deps;
@@ -1 +1 @@
1
- {"version":3,"file":"collections.js","names":[],"sources":["../../../../lib/modules/manager/ansible-galaxy/collections.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GalaxyCollectionDatasource } from '../../datasource/galaxy-collection/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { AnsibleGalaxyPackageDependency } from './types.ts';\nimport {\n blockLineRegEx,\n galaxyDepRegex,\n nameMatchRegex,\n newBlockRegEx,\n} from './util.ts';\n\nfunction interpretLine(\n lineMatch: RegExpMatchArray,\n dependency: AnsibleGalaxyPackageDependency,\n): void {\n const localDependency = dependency;\n const key = lineMatch.groups!.key;\n const value = lineMatch.groups!.value.replace(regEx(/[\"']/g), '');\n switch (key) {\n case 'name': {\n localDependency.managerData.name = value;\n break;\n }\n case 'version': {\n localDependency.managerData.version = value;\n localDependency.currentValue = value;\n break;\n }\n case 'source': {\n localDependency.managerData.source = value;\n if (value?.startsWith('git@') || value?.endsWith('.git')) {\n localDependency.packageName = value;\n } else {\n localDependency.registryUrls = value\n ? [value]\n : /* istanbul ignore next: should have test */ [];\n }\n break;\n }\n case 'type': {\n localDependency.managerData.type = value;\n break;\n }\n default: {\n // fail if we find an unexpected key\n localDependency.skipReason = 'unsupported';\n }\n }\n}\n\nfunction handleGitDep(\n dep: AnsibleGalaxyPackageDependency,\n nameMatch: RegExpExecArray | null,\n): void {\n dep.datasource = GitTagsDatasource.id;\n\n if (nameMatch?.groups) {\n // if a github.com repository is referenced use github-tags instead of git-tags\n if (nameMatch.groups.hostname === 'github.com') {\n dep.datasource = GithubTagsDatasource.id;\n } else {\n dep.datasource = GitTagsDatasource.id;\n }\n // source definition without version appendix\n const source = nameMatch.groups.source;\n const massagedDepName = nameMatch.groups.depName.replace(\n regEx(/.git$/),\n '',\n );\n dep.depName = `${nameMatch.groups.hostname}/${massagedDepName}`;\n // remove leading `git+` from URLs like `git+https://...`\n dep.packageName = source.replace(regEx(/git\\+/), '');\n\n // if version is declared using version appendix `<source url>,v1.2.0`, use it\n if (nameMatch.groups.version) {\n dep.currentValue = nameMatch.groups.version;\n } else {\n dep.currentValue = dep.managerData.version;\n }\n }\n}\n\nfunction handleGalaxyDep(dep: AnsibleGalaxyPackageDependency): void {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n dep.registryUrls = dep.managerData.source\n ? /* istanbul ignore next: should have test */ [dep.managerData.source]\n : [];\n dep.currentValue = dep.managerData.version;\n}\n\nfunction finalize(dependency: AnsibleGalaxyPackageDependency): boolean {\n const dep = dependency;\n dep.depName = dep.managerData.name;\n\n const name = dep.managerData.name;\n const nameMatch = nameMatchRegex.exec(name);\n\n // use type if defined\n switch (dependency.managerData.type) {\n case 'galaxy':\n handleGalaxyDep(dep);\n break;\n case 'git':\n handleGitDep(dep, nameMatch);\n break;\n case 'file':\n dep.skipReason = 'local-dependency';\n break;\n case null:\n // try to find out type based on source\n if (nameMatch) {\n handleGitDep(dep, nameMatch);\n break;\n }\n if (galaxyDepRegex.exec(dep.managerData.name)) {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n break;\n }\n dep.skipReason = 'no-source-match';\n break;\n default:\n dep.skipReason = 'unsupported';\n return true;\n }\n\n if (!dependency.currentValue && !dep.skipReason) {\n dep.skipReason = 'unspecified-version';\n }\n return true;\n}\n\nexport function extractCollections(lines: string[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {\n let lineMatch = newBlockRegEx.exec(lines[lineNumber]);\n if (lineMatch) {\n const dep: AnsibleGalaxyPackageDependency = {\n depType: 'galaxy-collection',\n managerData: {\n name: null,\n version: null,\n type: null,\n source: null,\n },\n };\n do {\n interpretLine(lineMatch, dep);\n const line = lines[lineNumber + 1];\n\n if (!line) {\n break;\n }\n lineMatch = blockLineRegEx.exec(line);\n if (lineMatch) {\n lineNumber += 1;\n }\n } while (lineMatch);\n if (finalize(dep)) {\n delete (dep as PackageDependency).managerData;\n deps.push(dep);\n }\n }\n }\n return deps;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"collections.js","names":[],"sources":["../../../../lib/modules/manager/ansible-galaxy/collections.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GalaxyCollectionDatasource } from '../../datasource/galaxy-collection/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { AnsibleGalaxyPackageDependency } from './types.ts';\nimport {\n blockLineRegEx,\n galaxyDepRegex,\n nameMatchRegex,\n newBlockRegEx,\n} from './util.ts';\n\nfunction interpretLine(\n lineMatch: RegExpMatchArray,\n dependency: AnsibleGalaxyPackageDependency,\n): void {\n const localDependency = dependency;\n const key = lineMatch.groups!.key;\n const value = lineMatch.groups!.value.replace(regEx(/[\"']/g), '');\n switch (key) {\n case 'name': {\n localDependency.managerData.name = value;\n break;\n }\n case 'version': {\n localDependency.managerData.version = value;\n localDependency.currentValue = value;\n break;\n }\n case 'source': {\n localDependency.managerData.source = value;\n if (value?.startsWith('git@') || value?.endsWith('.git')) {\n localDependency.packageName = value;\n } else {\n localDependency.registryUrls = value\n ? [value]\n : /* istanbul ignore next: should have test */ [];\n }\n break;\n }\n case 'type': {\n localDependency.managerData.type = value;\n break;\n }\n default: {\n // fail if we find an unexpected key\n localDependency.skipReason = 'unsupported';\n }\n }\n}\n\nfunction handleGitDep(\n dep: AnsibleGalaxyPackageDependency,\n nameMatch: RegExpExecArray | null,\n): void {\n dep.datasource = GitTagsDatasource.id;\n\n if (nameMatch?.groups) {\n // if a github.com repository is referenced use github-tags instead of git-tags\n if (nameMatch.groups.hostname === 'github.com') {\n dep.datasource = GithubTagsDatasource.id;\n } else {\n dep.datasource = GitTagsDatasource.id;\n }\n // source definition without version appendix\n const source = nameMatch.groups.source;\n const massagedDepName = nameMatch.groups.depName.replace(\n regEx(/.git$/),\n '',\n );\n dep.depName = `${nameMatch.groups.hostname}/${massagedDepName}`;\n // remove leading `git+` from URLs like `git+https://...`\n dep.packageName = source.replace(regEx(/git\\+/), '');\n\n // if version is declared using version appendix `<source url>,v1.2.0`, use it\n if (nameMatch.groups.version) {\n dep.currentValue = nameMatch.groups.version;\n } else {\n dep.currentValue = dep.managerData.version;\n }\n }\n}\n\nfunction handleGalaxyDep(dep: AnsibleGalaxyPackageDependency): void {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n dep.registryUrls = dep.managerData.source\n ? /* istanbul ignore next: should have test */ [dep.managerData.source]\n : [];\n dep.currentValue = dep.managerData.version;\n}\n\nfunction finalize(dependency: AnsibleGalaxyPackageDependency): void {\n const dep = dependency;\n dep.depName = dep.managerData.name;\n\n const name = dep.managerData.name;\n const nameMatch = nameMatchRegex.exec(name);\n\n // use type if defined\n switch (dependency.managerData.type) {\n case 'galaxy':\n handleGalaxyDep(dep);\n break;\n case 'git':\n handleGitDep(dep, nameMatch);\n break;\n case 'file':\n dep.skipReason = 'local-dependency';\n break;\n case null:\n // try to find out type based on source\n if (nameMatch) {\n handleGitDep(dep, nameMatch);\n break;\n }\n if (galaxyDepRegex.exec(dep.managerData.name)) {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n break;\n }\n dep.skipReason = 'no-source-match';\n break;\n default:\n dep.skipReason = 'unsupported';\n return;\n }\n\n if (!dependency.currentValue && !dep.skipReason) {\n dep.skipReason = 'unspecified-version';\n }\n}\n\nexport function extractCollections(lines: string[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {\n let lineMatch = newBlockRegEx.exec(lines[lineNumber]);\n if (lineMatch) {\n const dep: AnsibleGalaxyPackageDependency = {\n depType: 'galaxy-collection',\n managerData: {\n name: null,\n version: null,\n type: null,\n source: null,\n },\n };\n do {\n interpretLine(lineMatch, dep);\n const line = lines[lineNumber + 1];\n\n if (!line) {\n break;\n }\n lineMatch = blockLineRegEx.exec(line);\n if (lineMatch) {\n lineNumber += 1;\n }\n } while (lineMatch);\n finalize(dep);\n delete (dep as PackageDependency).managerData;\n deps.push(dep);\n }\n }\n return deps;\n}\n"],"mappings":";;;;;;AAaA,SAAS,cACP,WACA,YACM;CACN,MAAM,kBAAkB;CACxB,MAAM,MAAM,UAAU,OAAQ;CAC9B,MAAM,QAAQ,UAAU,OAAQ,MAAM,QAAQ,MAAM,OAAO,GAAG,EAAE;CAChE,QAAQ,KAAR;EACE,KAAK;GACH,gBAAgB,YAAY,OAAO;GACnC;EAEF,KAAK;GACH,gBAAgB,YAAY,UAAU;GACtC,gBAAgB,eAAe;GAC/B;EAEF,KAAK;GACH,gBAAgB,YAAY,SAAS;GACrC,IAAI,OAAO,WAAW,MAAM,KAAK,OAAO,SAAS,MAAM,GACrD,gBAAgB,cAAc;QAE9B,gBAAgB,eAAe,QAC3B,CAAC,KAAK,iDACuC,CAAC;GAEpD;EAEF,KAAK;GACH,gBAAgB,YAAY,OAAO;GACnC;EAEF,SAEE,gBAAgB,aAAa;CAEjC;AACF;AAEA,SAAS,aACP,KACA,WACM;CACN,IAAI,aAAa,kBAAkB;CAEnC,IAAI,WAAW,QAAQ;EAErB,IAAI,UAAU,OAAO,aAAa,cAChC,IAAI,aAAa,qBAAqB;OAEtC,IAAI,aAAa,kBAAkB;EAGrC,MAAM,SAAS,UAAU,OAAO;EAChC,MAAM,kBAAkB,UAAU,OAAO,QAAQ,QAC/C,MAAM,OAAO,GACb,EACF;EACA,IAAI,UAAU,GAAG,UAAU,OAAO,SAAS,GAAG;EAE9C,IAAI,cAAc,OAAO,QAAQ,MAAM,OAAO,GAAG,EAAE;EAGnD,IAAI,UAAU,OAAO,SACnB,IAAI,eAAe,UAAU,OAAO;OAEpC,IAAI,eAAe,IAAI,YAAY;CAEvC;AACF;AAEA,SAAS,gBAAgB,KAA2C;CAClE,IAAI,aAAa,2BAA2B;CAC5C,IAAI,UAAU,IAAI,YAAY;CAC9B,IAAI,eAAe,IAAI,YAAY,sDACc,CAAC,IAAI,YAAY,MAAM,IACpE,CAAC;CACL,IAAI,eAAe,IAAI,YAAY;AACrC;AAEA,SAAS,SAAS,YAAkD;CAClE,MAAM,MAAM;CACZ,IAAI,UAAU,IAAI,YAAY;CAE9B,MAAM,OAAO,IAAI,YAAY;CAC7B,MAAM,YAAY,eAAe,KAAK,IAAI;CAG1C,QAAQ,WAAW,YAAY,MAA/B;EACE,KAAK;GACH,gBAAgB,GAAG;GACnB;EACF,KAAK;GACH,aAAa,KAAK,SAAS;GAC3B;EACF,KAAK;GACH,IAAI,aAAa;GACjB;EACF,KAAK;GAEH,IAAI,WAAW;IACb,aAAa,KAAK,SAAS;IAC3B;GACF;GACA,IAAI,eAAe,KAAK,IAAI,YAAY,IAAI,GAAG;IAC7C,IAAI,aAAa,2BAA2B;IAC5C,IAAI,UAAU,IAAI,YAAY;IAC9B;GACF;GACA,IAAI,aAAa;GACjB;EACF;GACE,IAAI,aAAa;GACjB;CACJ;CAEA,IAAI,CAAC,WAAW,gBAAgB,CAAC,IAAI,YACnC,IAAI,aAAa;AAErB;AAEA,SAAgB,mBAAmB,OAAsC;CACvE,MAAM,OAA4B,CAAC;CAEnC,KAAK,IAAI,aAAa,GAAG,aAAa,MAAM,QAAQ,cAAc,GAAG;EACnE,IAAI,YAAY,cAAc,KAAK,MAAM,WAAW;EACpD,IAAI,WAAW;GACb,MAAM,MAAsC;IAC1C,SAAS;IACT,aAAa;KACX,MAAM;KACN,SAAS;KACT,MAAM;KACN,QAAQ;IACV;GACF;GACA,GAAG;IACD,cAAc,WAAW,GAAG;IAC5B,MAAM,OAAO,MAAM,aAAa;IAEhC,IAAI,CAAC,MACH;IAEF,YAAY,eAAe,KAAK,IAAI;IACpC,IAAI,WACF,cAAc;GAElB,SAAS;GACT,SAAS,GAAG;GACZ,OAAQ,IAA0B;GAClC,KAAK,KAAK,GAAG;EACf;CACF;CACA,OAAO;AACT"}
@@ -113,6 +113,7 @@ function extractPackageFile(content, packageFile, config) {
113
113
  }
114
114
  for (const container of coerceArray(pkg.resources?.containers)) {
115
115
  const dep = extractContainer(container);
116
+ // v8 ignore else -- `extractContainer()` always returns a dep
116
117
  if (dep) deps.push(dep);
117
118
  }
118
119
  for (const { jobs } of coerceArray(pkg.stages)) deps.push(...extractJobs(jobs));
@@ -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 }\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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"}
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 // v8 ignore else -- `extractContainer()` always returns a dep\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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"}
@@ -14,7 +14,9 @@ function getUrlFragments(rule) {
14
14
  if (urlRecord?.type === "string") urls.push(urlRecord);
15
15
  const urlsRecord = rule.children.urls;
16
16
  if (urlsRecord?.type === "array") {
17
- for (const urlRecord of urlsRecord.children) if (urlRecord.type === "string") urls.push(urlRecord);
17
+ for (const urlRecord of urlsRecord.children)
18
+ // v8 ignore else -- type narrowing only
19
+ if (urlRecord.type === "string") urls.push(urlRecord);
18
20
  }
19
21
  return urls;
20
22
  }
@@ -74,6 +76,7 @@ async function updateArtifacts(updateArtifact) {
74
76
  for (const upgrade of upgrades) {
75
77
  const { managerData } = upgrade;
76
78
  const idx = managerData?.idx;
79
+ // v8 ignore else -- only http rules reach updateArtifacts
77
80
  if (upgrade.depType === "http_file" || upgrade.depType === "http_archive") {
78
81
  const rule = findCodeFragment(newContents, [idx]);
79
82
  /* v8 ignore next -- used only for type narrowing */
@@ -93,6 +96,7 @@ async function updateArtifacts(updateArtifact) {
93
96
  const urls = urlFragments.map(({ value }) => updateValues(value));
94
97
  const hash = await getHashFromUrls(urls);
95
98
  if (!hash) {
99
+ // v8 ignore else -- the empty case already continued above
96
100
  if (urlFragments.length >= 1) artifactErrors.push({
97
101
  fileName: path,
98
102
  stderr: `Could not calculate sha256 for ${upgrade.depName} at ${upgrade.newValue}. Checked URLs: ${urls.join(", ")}`
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":["packageCache.get","packageCache.set","pMap"],"sources":["../../../../lib/modules/manager/bazel/artifacts.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { map as pMap } from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n ArtifactError,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport {\n findCodeFragment,\n patchCodeAtFragments,\n updateCode,\n} from './common.ts';\nimport type { RecordFragment, StringFragment } from './types.ts';\n\nconst http = new Http('bazel');\n\nfunction getUrlFragments(rule: RecordFragment): StringFragment[] {\n const urls: StringFragment[] = [];\n\n const urlRecord = rule.children.url;\n if (urlRecord?.type === 'string') {\n urls.push(urlRecord);\n }\n\n const urlsRecord = rule.children.urls;\n if (urlsRecord?.type === 'array') {\n for (const urlRecord of urlsRecord.children) {\n if (urlRecord.type === 'string') {\n urls.push(urlRecord);\n }\n }\n }\n\n return urls;\n}\n\nconst urlMassages = {\n 'bazel-skylib.': 'bazel_skylib-',\n '/bazel-gazelle/releases/download/0': '/bazel-gazelle/releases/download/v0',\n '/bazel-gazelle-0': '/bazel-gazelle-v0',\n '/rules_go/releases/download/0': '/rules_go/releases/download/v0',\n '/rules_go-0': '/rules_go-v0',\n};\n\nfunction massageUrl(url: string): string {\n let result = url;\n for (const [from, to] of Object.entries(urlMassages)) {\n result = result.replace(from, to);\n }\n return result;\n}\n\nfunction migrateUrl(url: string, upgrade: Upgrade): string {\n const newValue = upgrade.newValue?.replace(regEx(/^v/), '');\n\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.3.5\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.4.0\n if (\n url.endsWith('/rules_webtesting.tar.gz') &&\n !newValue?.match(regEx(/^0\\.[0123]\\./))\n ) {\n return url.replace(regEx(/\\.tar\\.gz$/), `-${newValue}.tar.gz`);\n }\n\n return url;\n}\n\nfunction replaceAll(input: string, from: string, to: string): string {\n return input.split(from).join(to);\n}\n\nfunction replaceValues(\n content: string,\n from: string | null | undefined,\n to: string | null | undefined,\n): string {\n // istanbul ignore if\n if (!from || !to || from === to) {\n return content;\n }\n const massagedFrom = from.replace(regEx(/^v/), '');\n const massagedTo = to.replace(regEx(/^v/), '');\n return replaceAll(content, massagedFrom, massagedTo);\n}\n\nasync function getHashFromUrl(url: string): Promise<string | null> {\n const cacheNamespace = 'url-sha256';\n const cachedResult = await packageCache.get<string | null>(\n cacheNamespace,\n url,\n );\n /* istanbul ignore next line */\n if (cachedResult) {\n return cachedResult;\n }\n try {\n const hash = await hashStream(http.stream(url), 'sha256');\n const cacheMinutes = 3 * 24 * 60; // 3 days\n await packageCache.set(cacheNamespace, url, hash, cacheMinutes);\n return hash;\n } catch /* istanbul ignore next */ {\n return null;\n }\n}\n\nasync function getHashFromUrls(urls: string[]): Promise<string | null> {\n const hashes = (\n await pMap(urls, (url) => getHashFromUrl(massageUrl(url)))\n ).filter(isTruthy);\n if (!hashes.length) {\n logger.debug({ urls }, 'Could not calculate hash for URLs');\n return null;\n }\n\n const distinctHashes = new Set(hashes);\n // istanbul ignore if\n if (distinctHashes.size > 1) {\n logger.warn({ urls }, 'Found multiple hashes for single def');\n }\n\n return hashes[0];\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName: path, updatedDeps: upgrades } = updateArtifact;\n const oldContents = updateArtifact.newPackageFileContent;\n let newContents = oldContents;\n const artifactErrors: ArtifactError[] = [];\n for (const upgrade of upgrades) {\n const { managerData } = upgrade;\n const idx = managerData?.idx as number;\n\n if (upgrade.depType === 'http_file' || upgrade.depType === 'http_archive') {\n const rule = findCodeFragment(newContents, [idx]);\n /* v8 ignore next -- used only for type narrowing */\n if (rule?.type !== 'record') {\n continue;\n }\n\n const urlFragments = getUrlFragments(rule);\n if (!urlFragments?.length) {\n logger.debug(`def: ${rule.value}, urls is empty`);\n continue;\n }\n\n function updateValues(oldUrl: string): string {\n let url = oldUrl;\n url = replaceValues(url, upgrade.currentValue, upgrade.newValue);\n url = replaceValues(url, upgrade.currentDigest, upgrade.newDigest);\n url = migrateUrl(url, upgrade);\n return url;\n }\n\n const urls = urlFragments.map(({ value }) => updateValues(value));\n const hash = await getHashFromUrls(urls);\n if (!hash) {\n if (urlFragments.length >= 1) {\n artifactErrors.push({\n fileName: path,\n stderr: `Could not calculate sha256 for ${upgrade.depName} at ${upgrade.newValue}. Checked URLs: ${urls.join(', ')}`,\n });\n }\n continue;\n }\n\n newContents = patchCodeAtFragments(\n newContents,\n urlFragments,\n updateValues,\n );\n newContents = updateCode(\n newContents,\n [idx, 'strip_prefix'],\n updateValues,\n );\n newContents = updateCode(newContents, [idx, 'sha256'], hash);\n }\n }\n\n if (oldContents === newContents) {\n if (artifactErrors.length) {\n // If we have artifact errors, return them even if we have file changes\n return artifactErrors.map((error) => ({\n artifactError: error,\n }));\n }\n return null;\n }\n\n return [\n {\n file: {\n type: 'addition',\n path,\n contents: newContents,\n },\n },\n ];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","names":["packageCache.get","packageCache.set","pMap"],"sources":["../../../../lib/modules/manager/bazel/artifacts.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { map as pMap } from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n ArtifactError,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport {\n findCodeFragment,\n patchCodeAtFragments,\n updateCode,\n} from './common.ts';\nimport type { RecordFragment, StringFragment } from './types.ts';\n\nconst http = new Http('bazel');\n\nfunction getUrlFragments(rule: RecordFragment): StringFragment[] {\n const urls: StringFragment[] = [];\n\n const urlRecord = rule.children.url;\n if (urlRecord?.type === 'string') {\n urls.push(urlRecord);\n }\n\n const urlsRecord = rule.children.urls;\n if (urlsRecord?.type === 'array') {\n for (const urlRecord of urlsRecord.children) {\n // v8 ignore else -- type narrowing only\n if (urlRecord.type === 'string') {\n urls.push(urlRecord);\n }\n }\n }\n\n return urls;\n}\n\nconst urlMassages = {\n 'bazel-skylib.': 'bazel_skylib-',\n '/bazel-gazelle/releases/download/0': '/bazel-gazelle/releases/download/v0',\n '/bazel-gazelle-0': '/bazel-gazelle-v0',\n '/rules_go/releases/download/0': '/rules_go/releases/download/v0',\n '/rules_go-0': '/rules_go-v0',\n};\n\nfunction massageUrl(url: string): string {\n let result = url;\n for (const [from, to] of Object.entries(urlMassages)) {\n result = result.replace(from, to);\n }\n return result;\n}\n\nfunction migrateUrl(url: string, upgrade: Upgrade): string {\n const newValue = upgrade.newValue?.replace(regEx(/^v/), '');\n\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.3.5\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.4.0\n if (\n url.endsWith('/rules_webtesting.tar.gz') &&\n !newValue?.match(regEx(/^0\\.[0123]\\./))\n ) {\n return url.replace(regEx(/\\.tar\\.gz$/), `-${newValue}.tar.gz`);\n }\n\n return url;\n}\n\nfunction replaceAll(input: string, from: string, to: string): string {\n return input.split(from).join(to);\n}\n\nfunction replaceValues(\n content: string,\n from: string | null | undefined,\n to: string | null | undefined,\n): string {\n // istanbul ignore if\n if (!from || !to || from === to) {\n return content;\n }\n const massagedFrom = from.replace(regEx(/^v/), '');\n const massagedTo = to.replace(regEx(/^v/), '');\n return replaceAll(content, massagedFrom, massagedTo);\n}\n\nasync function getHashFromUrl(url: string): Promise<string | null> {\n const cacheNamespace = 'url-sha256';\n const cachedResult = await packageCache.get<string | null>(\n cacheNamespace,\n url,\n );\n /* istanbul ignore next line */\n if (cachedResult) {\n return cachedResult;\n }\n try {\n const hash = await hashStream(http.stream(url), 'sha256');\n const cacheMinutes = 3 * 24 * 60; // 3 days\n await packageCache.set(cacheNamespace, url, hash, cacheMinutes);\n return hash;\n } catch /* istanbul ignore next */ {\n return null;\n }\n}\n\nasync function getHashFromUrls(urls: string[]): Promise<string | null> {\n const hashes = (\n await pMap(urls, (url) => getHashFromUrl(massageUrl(url)))\n ).filter(isTruthy);\n if (!hashes.length) {\n logger.debug({ urls }, 'Could not calculate hash for URLs');\n return null;\n }\n\n const distinctHashes = new Set(hashes);\n // istanbul ignore if\n if (distinctHashes.size > 1) {\n logger.warn({ urls }, 'Found multiple hashes for single def');\n }\n\n return hashes[0];\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName: path, updatedDeps: upgrades } = updateArtifact;\n const oldContents = updateArtifact.newPackageFileContent;\n let newContents = oldContents;\n const artifactErrors: ArtifactError[] = [];\n for (const upgrade of upgrades) {\n const { managerData } = upgrade;\n const idx = managerData?.idx as number;\n\n // v8 ignore else -- only http rules reach updateArtifacts\n if (upgrade.depType === 'http_file' || upgrade.depType === 'http_archive') {\n const rule = findCodeFragment(newContents, [idx]);\n /* v8 ignore next -- used only for type narrowing */\n if (rule?.type !== 'record') {\n continue;\n }\n\n const urlFragments = getUrlFragments(rule);\n if (!urlFragments?.length) {\n logger.debug(`def: ${rule.value}, urls is empty`);\n continue;\n }\n\n function updateValues(oldUrl: string): string {\n let url = oldUrl;\n url = replaceValues(url, upgrade.currentValue, upgrade.newValue);\n url = replaceValues(url, upgrade.currentDigest, upgrade.newDigest);\n url = migrateUrl(url, upgrade);\n return url;\n }\n\n const urls = urlFragments.map(({ value }) => updateValues(value));\n const hash = await getHashFromUrls(urls);\n if (!hash) {\n // v8 ignore else -- the empty case already continued above\n if (urlFragments.length >= 1) {\n artifactErrors.push({\n fileName: path,\n stderr: `Could not calculate sha256 for ${upgrade.depName} at ${upgrade.newValue}. Checked URLs: ${urls.join(', ')}`,\n });\n }\n continue;\n }\n\n newContents = patchCodeAtFragments(\n newContents,\n urlFragments,\n updateValues,\n );\n newContents = updateCode(\n newContents,\n [idx, 'strip_prefix'],\n updateValues,\n );\n newContents = updateCode(newContents, [idx, 'sha256'], hash);\n }\n }\n\n if (oldContents === newContents) {\n if (artifactErrors.length) {\n // If we have artifact errors, return them even if we have file changes\n return artifactErrors.map((error) => ({\n artifactError: error,\n }));\n }\n return null;\n }\n\n return [\n {\n file: {\n type: 'addition',\n path,\n contents: newContents,\n },\n },\n ];\n}\n"],"mappings":"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"}
@@ -15,6 +15,7 @@ function currentFragment(ctx) {
15
15
  return ctx.stack.at(-1);
16
16
  }
17
17
  function extractTreeValue(source, tree, offset) {
18
+ // v8 ignore else -- type narrowing only
18
19
  if (tree.type === "wrapped-tree") {
19
20
  const { endsWith } = tree;
20
21
  const to = endsWith.offset + endsWith.value.length;
@@ -45,6 +46,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
45
46
  };
46
47
  }).op("=").alt(query.str((ctx, { offset, value }) => {
47
48
  const frag = currentFragment(ctx);
49
+ // v8 ignore else -- type narrowing only
48
50
  if (frag.type === "record" && ctx.recordKey) {
49
51
  const key = ctx.recordKey;
50
52
  frag.children[key] = {
@@ -61,6 +63,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
61
63
  endsWith: "]",
62
64
  preHandler: (ctx, tree) => {
63
65
  const parentRecord = currentFragment(ctx);
66
+ // v8 ignore else -- type narrowing only
64
67
  if (parentRecord.type === "record" && ctx.recordKey && tree.type === "wrapped-tree") {
65
68
  const key = ctx.recordKey;
66
69
  parentRecord.children[key] = {
@@ -74,9 +77,11 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
74
77
  },
75
78
  search: query.alt(query.str((ctx, { value, offset }) => {
76
79
  const parentRecord = currentFragment(ctx);
80
+ // v8 ignore else -- type narrowing only
77
81
  if (parentRecord.type === "record" && ctx.recordKey) {
78
82
  const key = ctx.recordKey;
79
83
  const array = parentRecord.children[key];
84
+ // v8 ignore else -- type narrowing only
80
85
  if (array.type === "array") array.children.push({
81
86
  type: "string",
82
87
  value,
@@ -86,6 +91,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
86
91
  return ctx;
87
92
  }), query.sym().handler(recordStartHandler).handler((ctx, { value, offset }) => {
88
93
  const ruleFragment = currentFragment(ctx);
94
+ // v8 ignore else -- type narrowing only
89
95
  if (ruleFragment.type === "record") ruleFragment.children._function = {
90
96
  type: "string",
91
97
  value,
@@ -94,6 +100,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
94
100
  return ctx;
95
101
  }).many(query.op(".").sym((ctx, { value }) => {
96
102
  const ruleFragment = currentFragment(ctx);
103
+ // v8 ignore else -- type narrowing only
97
104
  if (ruleFragment.type === "record" && ruleFragment.children._function) ruleFragment.children._function.value += `.${value}`;
98
105
  return ctx;
99
106
  }), 0, 3).tree({
@@ -108,6 +115,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
108
115
  const argIndex = ctx.argIndex ?? 0;
109
116
  const subRecordKey = ctx.subRecordKey ?? argIndex.toString();
110
117
  const ruleFragment = currentFragment(ctx);
118
+ // v8 ignore else -- type narrowing only
111
119
  if (ruleFragment.type === "record") ruleFragment.children[subRecordKey] = {
112
120
  type: "string",
113
121
  value: subRecordValue,
@@ -121,12 +129,15 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
121
129
  delete ctx.argIndex;
122
130
  const callFrag = currentFragment(ctx);
123
131
  ctx.stack.pop();
132
+ // v8 ignore else -- type narrowing only
124
133
  if (callFrag.type === "record" && tree.type === "wrapped-tree") {
125
134
  callFrag.value = extractTreeValue(ctx.source, tree, callFrag.offset);
126
135
  const parentRecord = currentFragment(ctx);
136
+ // v8 ignore else -- type narrowing only
127
137
  if (parentRecord.type === "record" && ctx.recordKey) {
128
138
  const key = ctx.recordKey;
129
139
  const array = parentRecord.children[key];
140
+ // v8 ignore else -- type narrowing only
130
141
  if (array.type === "array") array.children.push(callFrag);
131
142
  }
132
143
  }
@@ -135,9 +146,11 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
135
146
  })),
136
147
  postHandler: (ctx, tree) => {
137
148
  const parentRecord = currentFragment(ctx);
149
+ // v8 ignore else -- type narrowing only
138
150
  if (parentRecord.type === "record" && ctx.recordKey && tree.type === "wrapped-tree") {
139
151
  const key = ctx.recordKey;
140
152
  const array = parentRecord.children[key];
153
+ // v8 ignore else -- type narrowing only
141
154
  if (array.type === "array") array.value = extractTreeValue(ctx.source, tree, array.offset);
142
155
  }
143
156
  return ctx;
@@ -160,6 +173,7 @@ function ruleCall(search) {
160
173
  search,
161
174
  postHandler: (ctx, tree) => {
162
175
  const frag = currentFragment(ctx);
176
+ // v8 ignore else -- type narrowing only
163
177
  if (frag.type === "record" && tree.type === "wrapped-tree") {
164
178
  frag.value = extractTreeValue(ctx.source, tree, frag.offset);
165
179
  ctx.stack.pop();
@@ -180,6 +194,7 @@ function recordStartHandler(ctx, { offset }) {
180
194
  }
181
195
  function ruleNameHandler(ctx, { value, offset }) {
182
196
  const ruleFragment = currentFragment(ctx);
197
+ // v8 ignore else -- type narrowing only
183
198
  if (ruleFragment.type === "record") ruleFragment.children.rule = {
184
199
  type: "string",
185
200
  value,
@@ -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.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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"}
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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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 // v8 ignore else -- type narrowing only\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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","names":[],"sources":["../../../../../lib/modules/manager/bazel/rules/http.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { regEx } from '../../../../util/regex.ts';\nimport { parseUrl } from '../../../../util/url.ts';\nimport { GithubReleasesDatasource } from '../../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../../datasource/github-tags/index.ts';\nimport { GitlabReleasesDatasource } from '../../../datasource/gitlab-releases/index.ts';\nimport { GitlabTagsDatasource } from '../../../datasource/gitlab-tags/index.ts';\nimport type { PackageDependency } from '../../types.ts';\n\n// Source: https://bazel.build/rules/lib/repo/http\nconst archives = [\n '.zip',\n '.tar',\n '.jar',\n '.war',\n '.aar',\n '.ar',\n '.deb',\n\n '.gz',\n '.tar.gz',\n '.tgz',\n\n '.bz2',\n '.tar.bz2',\n '.tbz2',\n\n '.xz',\n '.tar.xz',\n '.txz',\n\n '.zst',\n '.tar.zst',\n '.tzst',\n];\n\nconst archiveSuffixRegex = regEx(\n `(?:${archives.map((archive) => RegExp.escape(archive)).join('|')})$`,\n);\n\nfunction stripArchiveSuffix(value: string): string {\n return value.replace(archiveSuffixRegex, '');\n}\n\nfunction isHash(value: unknown): value is string {\n return isString(value) && regEx(/[0-9a-z]{40}/i).test(value);\n}\n\nexport function parseGithubPath(\n pathname: string,\n): Partial<PackageDependency> | null {\n const [p0, p1, p2, p3, p4, p5] = pathname.split('/').slice(1);\n const packageName = `${p0}/${p1}`;\n let datasource = '';\n let value: string | null = null;\n if (p2 === 'releases' && p3 === 'download') {\n datasource = GithubReleasesDatasource.id;\n value = p4;\n } else if (p2 === 'archive' && p3 === 'refs' && p4 === 'tags') {\n // https://github.com/foo/bar/archive/refs/tags/v1.2.3.tar.gz\n datasource = GithubTagsDatasource.id;\n value = p5;\n } else if (p2 === 'archive') {\n // https://github.com/foo/bar/archive/1.2.3.tar.gz\n datasource = GithubTagsDatasource.id;\n value = p3;\n }\n\n if (!value) {\n return null;\n }\n\n value = stripArchiveSuffix(value);\n return isHash(value)\n ? { datasource, packageName, currentDigest: value }\n : { datasource, packageName, currentValue: value };\n}\n\nfunction parseGitlabPath(pathname: string): Partial<PackageDependency> | null {\n // https://gitlab.com/libeigen/eigen/-/archive/3.3.5/eigen-3.3.5.zip\n // https://gitlab.com/libeigen/eigen/-/archive/90ee821c563fa20db4d64d6991ddca256d5c52f2/eigen-90ee821c563fa20db4d64d6991ddca256d5c52f2.tar.gz\n const [p0, p1, p2, p3, p4] = pathname.split('/').slice(1);\n const packageName = `${p0}/${p1}`;\n if (p2 === '-' && p3 === 'archive' && p4) {\n return isHash(p4)\n ? {\n datasource: GitlabTagsDatasource.id,\n packageName,\n currentDigest: p4,\n }\n : {\n datasource: GitlabReleasesDatasource.id,\n packageName,\n currentValue: p4,\n };\n }\n return null;\n}\n\nexport function parseArchiveUrl(\n urlString: string | undefined | null,\n): Partial<PackageDependency> | null {\n if (!urlString) {\n return null;\n }\n\n const url = parseUrl(urlString);\n\n if (url?.host === 'github.com') {\n return parseGithubPath(url.pathname);\n }\n\n if (url?.host === 'gitlab.com') {\n return parseGitlabPath(url.pathname);\n }\n\n return null;\n}\n\nexport const httpRules = [\n 'http_archive',\n '_http_archive',\n 'http_file',\n '_http_file',\n] as const;\n\nexport const HttpTarget = z\n .object({\n rule: z.enum(httpRules),\n name: z.string(),\n url: z.string().optional(),\n urls: z.array(z.string()).optional(),\n sha256: z.string(),\n })\n .refine(({ url, urls }) => !!url || !!urls)\n .transform(({ rule, name, url, urls = [] }): PackageDependency[] => {\n const parsedUrl = [url, ...urls].map(parseArchiveUrl).find(isTruthy);\n if (!parsedUrl) {\n return [];\n }\n\n const dep: PackageDependency = {\n datasource: parsedUrl.datasource,\n depType: rule,\n depName: name,\n packageName: parsedUrl.packageName,\n };\n\n // We don't want to set both `currentValue` and `currentDigest`.\n //\n // What we want is to provide the first occurrence of `currentValue`,\n // or, if it's not available, `currentDigest`.\n //\n // Auto-replace mechanism will replace this first occurrence,\n // and artifact update function will do the rest.\n //\n // Hence, `if-else-if` is being used here.\n if (parsedUrl.currentValue) {\n dep.currentValue = parsedUrl.currentValue;\n } else if (parsedUrl.currentDigest) {\n dep.currentDigest = parsedUrl.currentDigest;\n }\n\n return [dep];\n });\n"],"mappings":";;;;;;;;;AAqCA,MAAM,qBAAqB,MACzB,MAAM;CA1BN;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;AAIa,CAAC,CAAC,KAAK,YAAY,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,GACpE;AAEA,SAAS,mBAAmB,OAAuB;CACjD,OAAO,MAAM,QAAQ,oBAAoB,EAAE;AAC7C;AAEA,SAAS,OAAO,OAAiC;CAC/C,OAAO,SAAS,KAAK,KAAK,MAAM,eAAe,CAAC,CAAC,KAAK,KAAK;AAC7D;AAEA,SAAgB,gBACd,UACmC;CACnC,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;CAC5D,MAAM,cAAc,GAAG,GAAG,GAAG;CAC7B,IAAI,aAAa;CACjB,IAAI,QAAuB;CAC3B,IAAI,OAAO,cAAc,OAAO,YAAY;EAC1C,aAAa,yBAAyB;EACtC,QAAQ;CACV,OAAO,IAAI,OAAO,aAAa,OAAO,UAAU,OAAO,QAAQ;EAE7D,aAAa,qBAAqB;EAClC,QAAQ;CACV,OAAO,IAAI,OAAO,WAAW;EAE3B,aAAa,qBAAqB;EAClC,QAAQ;CACV;CAEA,IAAI,CAAC,OACH,OAAO;CAGT,QAAQ,mBAAmB,KAAK;CAChC,OAAO,OAAO,KAAK,IACf;EAAE;EAAY;EAAa,eAAe;CAAM,IAChD;EAAE;EAAY;EAAa,cAAc;CAAM;AACrD;AAEA,SAAS,gBAAgB,UAAqD;CAG5E,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;CACxD,MAAM,cAAc,GAAG,GAAG,GAAG;CAC7B,IAAI,OAAO,OAAO,OAAO,aAAa,IACpC,OAAO,OAAO,EAAE,IACZ;EACE,YAAY,qBAAqB;EACjC;EACA,eAAe;CACjB,IACA;EACE,YAAY,yBAAyB;EACrC;EACA,cAAc;CAChB;CAEN,OAAO;AACT;AAEA,SAAgB,gBACd,WACmC;CACnC,IAAI,CAAC,WACH,OAAO;CAGT,MAAM,MAAM,SAAS,SAAS;CAE9B,IAAI,KAAK,SAAS,cAChB,OAAO,gBAAgB,IAAI,QAAQ;CAGrC,IAAI,KAAK,SAAS,cAChB,OAAO,gBAAgB,IAAI,QAAQ;CAGrC,OAAO;AACT;AAEA,MAAa,YAAY;CACvB;CACA;CACA;CACA;AACF;AAEA,MAAa,aAAa,EACvB,OAAO;CACN,MAAM,EAAE,KAAK,SAAS;CACtB,MAAM,EAAE,OAAO;CACf,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CACzB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACnC,QAAQ,EAAE,OAAO;AACnB,CAAC,CAAC,CACD,QAAQ,EAAE,KAAK,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAC1C,WAAW,EAAE,MAAM,MAAM,KAAK,OAAO,CAAC,QAA6B;CAClE,MAAM,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,KAAK,QAAQ;CACnE,IAAI,CAAC,WACH,OAAO,CAAC;CAGV,MAAM,MAAyB;EAC7B,YAAY,UAAU;EACtB,SAAS;EACT,SAAS;EACT,aAAa,UAAU;CACzB;CAWA,IAAI,UAAU,cACZ,IAAI,eAAe,UAAU;MACxB,IAAI,UAAU,eACnB,IAAI,gBAAgB,UAAU;CAGhC,OAAO,CAAC,GAAG;AACb,CAAC"}
1
+ {"version":3,"file":"http.js","names":[],"sources":["../../../../../lib/modules/manager/bazel/rules/http.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { regEx } from '../../../../util/regex.ts';\nimport { parseUrl } from '../../../../util/url.ts';\nimport { GithubReleasesDatasource } from '../../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../../datasource/github-tags/index.ts';\nimport { GitlabReleasesDatasource } from '../../../datasource/gitlab-releases/index.ts';\nimport { GitlabTagsDatasource } from '../../../datasource/gitlab-tags/index.ts';\nimport type { PackageDependency } from '../../types.ts';\n\n// Source: https://bazel.build/rules/lib/repo/http\nconst archives = [\n '.zip',\n '.tar',\n '.jar',\n '.war',\n '.aar',\n '.ar',\n '.deb',\n\n '.gz',\n '.tar.gz',\n '.tgz',\n\n '.bz2',\n '.tar.bz2',\n '.tbz2',\n\n '.xz',\n '.tar.xz',\n '.txz',\n\n '.zst',\n '.tar.zst',\n '.tzst',\n];\n\nconst archiveSuffixRegex = regEx(\n `(?:${archives.map((archive) => RegExp.escape(archive)).join('|')})$`,\n);\n\nfunction stripArchiveSuffix(value: string): string {\n return value.replace(archiveSuffixRegex, '');\n}\n\nfunction isHash(value: unknown): value is string {\n return isString(value) && regEx(/[0-9a-z]{40}/i).test(value);\n}\n\nexport function parseGithubPath(\n pathname: string,\n): Partial<PackageDependency> | null {\n const [p0, p1, p2, p3, p4, p5] = pathname.split('/').slice(1);\n const packageName = `${p0}/${p1}`;\n let datasource = '';\n let value: string | null = null;\n if (p2 === 'releases' && p3 === 'download') {\n datasource = GithubReleasesDatasource.id;\n value = p4;\n } else if (p2 === 'archive' && p3 === 'refs' && p4 === 'tags') {\n // https://github.com/foo/bar/archive/refs/tags/v1.2.3.tar.gz\n datasource = GithubTagsDatasource.id;\n value = p5;\n } else if (p2 === 'archive') {\n // https://github.com/foo/bar/archive/1.2.3.tar.gz\n datasource = GithubTagsDatasource.id;\n value = p3;\n }\n\n if (!value) {\n return null;\n }\n\n value = stripArchiveSuffix(value);\n return isHash(value)\n ? { datasource, packageName, currentDigest: value }\n : { datasource, packageName, currentValue: value };\n}\n\nfunction parseGitlabPath(pathname: string): Partial<PackageDependency> | null {\n // https://gitlab.com/libeigen/eigen/-/archive/3.3.5/eigen-3.3.5.zip\n // https://gitlab.com/libeigen/eigen/-/archive/90ee821c563fa20db4d64d6991ddca256d5c52f2/eigen-90ee821c563fa20db4d64d6991ddca256d5c52f2.tar.gz\n const [p0, p1, p2, p3, p4] = pathname.split('/').slice(1);\n const packageName = `${p0}/${p1}`;\n if (p2 === '-' && p3 === 'archive' && p4) {\n return isHash(p4)\n ? {\n datasource: GitlabTagsDatasource.id,\n packageName,\n currentDigest: p4,\n }\n : {\n datasource: GitlabReleasesDatasource.id,\n packageName,\n currentValue: p4,\n };\n }\n return null;\n}\n\nexport function parseArchiveUrl(\n urlString: string | undefined | null,\n): Partial<PackageDependency> | null {\n if (!urlString) {\n return null;\n }\n\n const url = parseUrl(urlString);\n\n if (url?.host === 'github.com') {\n return parseGithubPath(url.pathname);\n }\n\n if (url?.host === 'gitlab.com') {\n return parseGitlabPath(url.pathname);\n }\n\n return null;\n}\n\nexport const httpRules = [\n 'http_archive',\n '_http_archive',\n 'http_file',\n '_http_file',\n] as const;\n\nexport const HttpTarget = z\n .object({\n rule: z.enum(httpRules),\n name: z.string(),\n url: z.string().optional(),\n urls: z.array(z.string()).optional(),\n sha256: z.string(),\n })\n .refine(({ url, urls }) => !!url || !!urls)\n .transform(({ rule, name, url, urls = [] }): PackageDependency[] => {\n const parsedUrl = [url, ...urls].map(parseArchiveUrl).find(isTruthy);\n if (!parsedUrl) {\n return [];\n }\n\n const dep: PackageDependency = {\n datasource: parsedUrl.datasource,\n depType: rule,\n depName: name,\n packageName: parsedUrl.packageName,\n };\n\n // We don't want to set both `currentValue` and `currentDigest`.\n //\n // What we want is to provide the first occurrence of `currentValue`,\n // or, if it's not available, `currentDigest`.\n //\n // Auto-replace mechanism will replace this first occurrence,\n // and artifact update function will do the rest.\n //\n // Hence, `if-else-if` is being used here.\n if (parsedUrl.currentValue) {\n dep.currentValue = parsedUrl.currentValue;\n // NOTE: a url with neither a value nor a digest never gets this far. A\n // coverage-ignore hint cannot suppress the implicit else on an `else if`.\n } else if (parsedUrl.currentDigest) {\n dep.currentDigest = parsedUrl.currentDigest;\n }\n\n return [dep];\n });\n"],"mappings":";;;;;;;;;AAqCA,MAAM,qBAAqB,MACzB,MAAM;CA1BN;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;AAIa,CAAC,CAAC,KAAK,YAAY,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,GACpE;AAEA,SAAS,mBAAmB,OAAuB;CACjD,OAAO,MAAM,QAAQ,oBAAoB,EAAE;AAC7C;AAEA,SAAS,OAAO,OAAiC;CAC/C,OAAO,SAAS,KAAK,KAAK,MAAM,eAAe,CAAC,CAAC,KAAK,KAAK;AAC7D;AAEA,SAAgB,gBACd,UACmC;CACnC,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;CAC5D,MAAM,cAAc,GAAG,GAAG,GAAG;CAC7B,IAAI,aAAa;CACjB,IAAI,QAAuB;CAC3B,IAAI,OAAO,cAAc,OAAO,YAAY;EAC1C,aAAa,yBAAyB;EACtC,QAAQ;CACV,OAAO,IAAI,OAAO,aAAa,OAAO,UAAU,OAAO,QAAQ;EAE7D,aAAa,qBAAqB;EAClC,QAAQ;CACV,OAAO,IAAI,OAAO,WAAW;EAE3B,aAAa,qBAAqB;EAClC,QAAQ;CACV;CAEA,IAAI,CAAC,OACH,OAAO;CAGT,QAAQ,mBAAmB,KAAK;CAChC,OAAO,OAAO,KAAK,IACf;EAAE;EAAY;EAAa,eAAe;CAAM,IAChD;EAAE;EAAY;EAAa,cAAc;CAAM;AACrD;AAEA,SAAS,gBAAgB,UAAqD;CAG5E,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;CACxD,MAAM,cAAc,GAAG,GAAG,GAAG;CAC7B,IAAI,OAAO,OAAO,OAAO,aAAa,IACpC,OAAO,OAAO,EAAE,IACZ;EACE,YAAY,qBAAqB;EACjC;EACA,eAAe;CACjB,IACA;EACE,YAAY,yBAAyB;EACrC;EACA,cAAc;CAChB;CAEN,OAAO;AACT;AAEA,SAAgB,gBACd,WACmC;CACnC,IAAI,CAAC,WACH,OAAO;CAGT,MAAM,MAAM,SAAS,SAAS;CAE9B,IAAI,KAAK,SAAS,cAChB,OAAO,gBAAgB,IAAI,QAAQ;CAGrC,IAAI,KAAK,SAAS,cAChB,OAAO,gBAAgB,IAAI,QAAQ;CAGrC,OAAO;AACT;AAEA,MAAa,YAAY;CACvB;CACA;CACA;CACA;AACF;AAEA,MAAa,aAAa,EACvB,OAAO;CACN,MAAM,EAAE,KAAK,SAAS;CACtB,MAAM,EAAE,OAAO;CACf,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CACzB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACnC,QAAQ,EAAE,OAAO;AACnB,CAAC,CAAC,CACD,QAAQ,EAAE,KAAK,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAC1C,WAAW,EAAE,MAAM,MAAM,KAAK,OAAO,CAAC,QAA6B;CAClE,MAAM,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,KAAK,QAAQ;CACnE,IAAI,CAAC,WACH,OAAO,CAAC;CAGV,MAAM,MAAyB;EAC7B,YAAY,UAAU;EACtB,SAAS;EACT,SAAS;EACT,aAAa,UAAU;CACzB;CAWA,IAAI,UAAU,cACZ,IAAI,eAAe,UAAU;MAGxB,IAAI,UAAU,eACnB,IAAI,gBAAgB,UAAU;CAGhC,OAAO,CAAC,GAAG;AACb,CAAC"}
@@ -24,6 +24,7 @@ async function getRubyConstraintFromFiles(packageFileName, newPackageFileContent
24
24
  }
25
25
  }
26
26
  const lockFile = await getLockFilePath(packageFileName);
27
+ // v8 ignore else -- `getLockFilePath()` always returns a path
27
28
  if (lockFile) {
28
29
  const rubyVersion = (await readLocalFile(lockFile, "utf8"))?.match(regEx(/^ {3}ruby (?<version>\d[\d.]*)(?:[a-z]|\s|$)/m))?.groups?.version;
29
30
  if (rubyVersion) {
@@ -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';\nimport { resolveToolConstraint } from '../util.ts';\n\nexport const delimiters = ['\"', \"'\"];\n\nexport function extractRubyVersion(txt: string): string | null {\n const rubyMatch = regEx(/^ruby\\s+(?<version>\"[^\"]+\"|'[^']+')\\s*$/gm).exec(\n txt,\n );\n if (!rubyMatch?.groups) {\n return null;\n }\n const quotedVersion = rubyMatch.groups.version;\n return quotedVersion.substring(1, quotedVersion.length - 1);\n}\n\nasync function getRubyConstraintFromFiles(\n packageFileName: string,\n newPackageFileContent: string,\n): Promise<string | null> {\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+))?(?<version>\\d[\\d.]*)/m))?.groups\n ?.version;\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 (?<version>\\d[\\d.]*)(?:[a-z]|\\s|$)/m),\n )?.groups?.version;\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 async function getRubyConstraint(\n updateArtifact: UpdateArtifact,\n): Promise<string | undefined> {\n const { packageFileName, config, newPackageFileContent } = updateArtifact;\n return await resolveToolConstraint(config, 'ruby', () =>\n getRubyConstraintFromFiles(packageFileName, newPackageFileContent),\n );\n}\n\nfunction getBundlerConstraintFromLockFile(\n existingLockFileContent: string,\n): string | null {\n const bundledWith = regEx(/\\nBUNDLED WITH\\n\\s+(?<version>.*?)(?:\\n|$)/).exec(\n existingLockFileContent,\n );\n if (bundledWith) {\n logger.debug('Using bundler version specified in lockfile');\n return bundledWith.groups!.version;\n }\n\n return null;\n}\n\nexport async function getBundlerConstraint(\n updateArtifact: Pick<UpdateArtifact, 'config'>,\n existingLockFileContent: string,\n): Promise<string | undefined> {\n const { config } = updateArtifact;\n return await resolveToolConstraint(config, 'bundler', () =>\n getBundlerConstraintFromLockFile(existingLockFileContent),\n );\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":";;;;;AAUA,MAAa,aAAa,CAAC,MAAK,GAAG;AAEnC,SAAgB,mBAAmB,KAA4B;CAC7D,MAAM,YAAY,MAAM,2CAA2C,CAAC,CAAC,KACnE,GACF;CACA,IAAI,CAAC,WAAW,QACd,OAAO;CAET,MAAM,gBAAgB,UAAU,OAAO;CACvC,OAAO,cAAc,UAAU,GAAG,cAAc,SAAS,CAAC;AAC5D;AAEA,eAAe,2BACb,iBACA,uBACwB;CACxB,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,0CAA0C,CAAC,CAAC,EAAE,QACzD;EACJ,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,+CAA+C,CACvD,CAAC,EAAE,QAAQ;EACX,IAAI,aAAa;GACf,OAAO,MAAM,2CAA2C;GACxD,OAAO;EACT;CACF;CAEA,OAAO;AACT;AAEA,eAAsB,kBACpB,gBAC6B;CAC7B,MAAM,EAAE,iBAAiB,QAAQ,0BAA0B;CAC3D,OAAO,MAAM,sBAAsB,QAAQ,cACzC,2BAA2B,iBAAiB,qBAAqB,CACnE;AACF;AAEA,SAAS,iCACP,yBACe;CACf,MAAM,cAAc,MAAM,4CAA4C,CAAC,CAAC,KACtE,uBACF;CACA,IAAI,aAAa;EACf,OAAO,MAAM,6CAA6C;EAC1D,OAAO,YAAY,OAAQ;CAC7B;CAEA,OAAO;AACT;AAEA,eAAsB,qBACpB,gBACA,yBAC6B;CAC7B,MAAM,EAAE,WAAW;CACnB,OAAO,MAAM,sBAAsB,QAAQ,iBACzC,iCAAiC,uBAAuB,CAC1D;AACF;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';\nimport { resolveToolConstraint } from '../util.ts';\n\nexport const delimiters = ['\"', \"'\"];\n\nexport function extractRubyVersion(txt: string): string | null {\n const rubyMatch = regEx(/^ruby\\s+(?<version>\"[^\"]+\"|'[^']+')\\s*$/gm).exec(\n txt,\n );\n if (!rubyMatch?.groups) {\n return null;\n }\n const quotedVersion = rubyMatch.groups.version;\n return quotedVersion.substring(1, quotedVersion.length - 1);\n}\n\nasync function getRubyConstraintFromFiles(\n packageFileName: string,\n newPackageFileContent: string,\n): Promise<string | null> {\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+))?(?<version>\\d[\\d.]*)/m))?.groups\n ?.version;\n if (rubyVersion) {\n logger.debug(`Using ruby version specified in ${file}`);\n return rubyVersion;\n }\n }\n const lockFile = await getLockFilePath(packageFileName);\n // v8 ignore else -- `getLockFilePath()` always returns a path\n if (lockFile) {\n const rubyVersion = (await readLocalFile(lockFile, 'utf8'))?.match(\n regEx(/^ {3}ruby (?<version>\\d[\\d.]*)(?:[a-z]|\\s|$)/m),\n )?.groups?.version;\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 async function getRubyConstraint(\n updateArtifact: UpdateArtifact,\n): Promise<string | undefined> {\n const { packageFileName, config, newPackageFileContent } = updateArtifact;\n return await resolveToolConstraint(config, 'ruby', () =>\n getRubyConstraintFromFiles(packageFileName, newPackageFileContent),\n );\n}\n\nfunction getBundlerConstraintFromLockFile(\n existingLockFileContent: string,\n): string | null {\n const bundledWith = regEx(/\\nBUNDLED WITH\\n\\s+(?<version>.*?)(?:\\n|$)/).exec(\n existingLockFileContent,\n );\n if (bundledWith) {\n logger.debug('Using bundler version specified in lockfile');\n return bundledWith.groups!.version;\n }\n\n return null;\n}\n\nexport async function getBundlerConstraint(\n updateArtifact: Pick<UpdateArtifact, 'config'>,\n existingLockFileContent: string,\n): Promise<string | undefined> {\n const { config } = updateArtifact;\n return await resolveToolConstraint(config, 'bundler', () =>\n getBundlerConstraintFromLockFile(existingLockFileContent),\n );\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":";;;;;AAUA,MAAa,aAAa,CAAC,MAAK,GAAG;AAEnC,SAAgB,mBAAmB,KAA4B;CAC7D,MAAM,YAAY,MAAM,2CAA2C,CAAC,CAAC,KACnE,GACF;CACA,IAAI,CAAC,WAAW,QACd,OAAO;CAET,MAAM,gBAAgB,UAAU,OAAO;CACvC,OAAO,cAAc,UAAU,GAAG,cAAc,SAAS,CAAC;AAC5D;AAEA,eAAe,2BACb,iBACA,uBACwB;CACxB,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,0CAA0C,CAAC,CAAC,EAAE,QACzD;EACJ,IAAI,aAAa;GACf,OAAO,MAAM,mCAAmC,MAAM;GACtD,OAAO;EACT;CACF;CACA,MAAM,WAAW,MAAM,gBAAgB,eAAe;;CAEtD,IAAI,UAAU;EACZ,MAAM,eAAe,MAAM,cAAc,UAAU,MAAM,EAAA,EAAI,MAC3D,MAAM,+CAA+C,CACvD,CAAC,EAAE,QAAQ;EACX,IAAI,aAAa;GACf,OAAO,MAAM,2CAA2C;GACxD,OAAO;EACT;CACF;CAEA,OAAO;AACT;AAEA,eAAsB,kBACpB,gBAC6B;CAC7B,MAAM,EAAE,iBAAiB,QAAQ,0BAA0B;CAC3D,OAAO,MAAM,sBAAsB,QAAQ,cACzC,2BAA2B,iBAAiB,qBAAqB,CACnE;AACF;AAEA,SAAS,iCACP,yBACe;CACf,MAAM,cAAc,MAAM,4CAA4C,CAAC,CAAC,KACtE,uBACF;CACA,IAAI,aAAa;EACf,OAAO,MAAM,6CAA6C;EAC1D,OAAO,YAAY,OAAQ;CAC7B;CAEA,OAAO;AACT;AAEA,eAAsB,qBACpB,gBACA,yBAC6B;CAC7B,MAAM,EAAE,WAAW;CACnB,OAAO,MAAM,sBAAsB,QAAQ,iBACzC,iCAAiC,uBAAuB,CAC1D;AACF;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"}
@@ -65,6 +65,7 @@ async function updateArtifactsImpl({ packageFileName, updatedDeps, newPackageFil
65
65
  const hasNonCrateDep = updatedDeps.some((dep) => dep.datasource !== CrateDatasource.id);
66
66
  const crateDepWithoutLockedVersion = updatedDeps.find((dep) => !dep.lockedVersion && dep.datasource === CrateDatasource.id);
67
67
  if (hasNonCrateDep || crateDepWithoutLockedVersion) {
68
+ // v8 ignore else -- needs a workspace update driven only by a non-crate dep
68
69
  if (crateDepWithoutLockedVersion) logger.warn({ dependency: crateDepWithoutLockedVersion.depName }, "Missing locked version for dependency");
69
70
  await cargoUpdate(packageFileName, false, rustConstraint);
70
71
  } else await cargoUpdatePrecise(packageFileName, updatedDeps, rustConstraint);
@@ -87,6 +88,7 @@ async function updateArtifactsImpl({ packageFileName, updatedDeps, newPackageFil
87
88
  if (recursionLimit > 0 && newCargoLockContent && regEx(/error: package ID specification/).test(err.stderr)) {
88
89
  const versions = extractLockFileContentVersions(newCargoLockContent);
89
90
  const newUpdatedDeps = updatedDeps.filter((dep) => !coerceArray(versions?.get(dep.packageName)).includes(dep.newVersion));
91
+ // v8 ignore else -- this retry only runs when a dep was already current
90
92
  if (newUpdatedDeps.length < updatedDeps.length) {
91
93
  logger.debug("Dependency already up to date - reattempting recursively");
92
94
  return updateArtifactsImpl({
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/cargo/artifacts.ts"],"sourcesContent":["import { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n findLocalSiblingOrParent,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../util/git/exec.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport { extractLockFileContentVersions } from './locked-version.ts';\n\nconst gitExec = withGitEnvironment(['cargo']);\n\nasync function cargoUpdate(\n manifestPath: string,\n isLockFileMaintenance: boolean,\n constraint: string | undefined,\n): Promise<void> {\n let cmd = `cargo update --config net.git-fetch-with-cli=true --manifest-path ${quote(\n manifestPath,\n )}`;\n // If we're updating a specific crate, `cargo-update` requires `--workspace`\n // for more information, see: https://github.com/renovatebot/renovate/issues/12332\n if (!isLockFileMaintenance) {\n cmd += ` --workspace`;\n }\n\n const execOptions: ExecOptions = {\n docker: {},\n toolConstraints: [{ toolName: 'rust', constraint }],\n };\n await gitExec(cmd, execOptions);\n}\n\nasync function cargoUpdatePrecise(\n manifestPath: string,\n updatedDeps: Upgrade[],\n constraint: string | undefined,\n): Promise<void> {\n const cmds = [];\n\n // First update individual dependencies to their `newVersion`. Necessary when\n // using the `update-lockfile` rangeStrategy which doesn't touch Cargo.toml.\n for (const dep of updatedDeps) {\n // If the range is bumped in Cargo.toml, the old lockedVersion may no longer\n // exist in Cargo's dependency graph, so let the --workspace update at the\n // end re-resolve it instead.\n if (dep.currentValue && dep.newValue && dep.currentValue !== dep.newValue) {\n continue;\n }\n\n cmds.push(\n `cargo update --config net.git-fetch-with-cli=true` +\n ` --manifest-path ${quote(manifestPath)}` +\n ` --package ${quote(`${dep.packageName}@${dep.lockedVersion}`)}` +\n ` --precise ${quote(dep.newVersion!)}`,\n );\n }\n\n // Then update all dependencies that have been bumped in `Cargo.toml`.\n cmds.push(\n `cargo update --config net.git-fetch-with-cli=true --manifest-path ${quote(manifestPath)} --workspace`,\n );\n\n const execOptions: ExecOptions = {\n docker: {},\n toolConstraints: [{ toolName: 'rust', constraint }],\n };\n\n await gitExec(cmds, execOptions);\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n return await updateArtifactsImpl(updateArtifact);\n}\n\nasync function updateArtifactsImpl(\n {\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n }: UpdateArtifact,\n recursionLimit = 10,\n): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`cargo.updateArtifacts(${packageFileName})`);\n\n // For standalone package crates, the `Cargo.lock` will be in the same\n // directory as `Cargo.toml` (ie. a sibling). For cargo workspaces, it\n // will be further up.\n const lockFileName = await findLocalSiblingOrParent(\n packageFileName,\n 'Cargo.lock',\n );\n const existingLockFileContent = lockFileName\n ? await readLocalFile(lockFileName)\n : null;\n if (!existingLockFileContent || !lockFileName) {\n logger.debug('No Cargo.lock found');\n return null;\n }\n\n const { isLockFileMaintenance } = config;\n if (!isLockFileMaintenance && !updatedDeps?.length) {\n logger.debug('No more dependencies to update');\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: existingLockFileContent,\n },\n },\n ];\n }\n\n const rustConstraint = await resolveToolConstraint(config, 'rust');\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n logger.debug(`Updating ${lockFileName}`);\n\n if (isLockFileMaintenance) {\n await cargoUpdate(packageFileName, true, rustConstraint);\n } else {\n const hasNonCrateDep = updatedDeps.some(\n (dep) => dep.datasource !== CrateDatasource.id,\n );\n const crateDepWithoutLockedVersion = updatedDeps.find(\n (dep) => !dep.lockedVersion && dep.datasource === CrateDatasource.id,\n );\n // Non-crate dependencies (like git ones) do not have locked versions.\n // For crate dependencies, a locked version is expected.\n // In both situations, perform a regular workspace lockfile update.\n if (hasNonCrateDep || crateDepWithoutLockedVersion) {\n if (crateDepWithoutLockedVersion) {\n // Only warn when a crate dependency has no locked version\n logger.warn(\n { dependency: crateDepWithoutLockedVersion.depName },\n 'Missing locked version for dependency',\n );\n }\n await cargoUpdate(packageFileName, false, rustConstraint);\n } else {\n // If all dependencies have locked versions then update them precisely.\n await cargoUpdatePrecise(packageFileName, updatedDeps, rustConstraint);\n }\n }\n\n logger.debug('Returning updated Cargo.lock');\n const newCargoLockContent = await readLocalFile(lockFileName);\n if (existingLockFileContent === newCargoLockContent) {\n logger.debug('Cargo.lock is unchanged');\n return null;\n }\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newCargoLockContent,\n },\n },\n ];\n } catch (err) {\n // istanbul ignore if\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n\n // Sometimes `cargo update` will fail when a preceding dependency update\n // causes another dependency to update. In this case we can no longer\n // reference the dependency by its old version, so we filter it out\n // and retry recursively.\n const newCargoLockContent = await readLocalFile(lockFileName, 'utf8');\n if (\n recursionLimit > 0 &&\n newCargoLockContent &&\n regEx(/error: package ID specification/).test(err.stderr)\n ) {\n const versions = extractLockFileContentVersions(newCargoLockContent);\n const newUpdatedDeps = updatedDeps.filter(\n (dep) =>\n !coerceArray(versions?.get(dep.packageName!)).includes(\n dep.newVersion!,\n ),\n );\n\n if (newUpdatedDeps.length < updatedDeps.length) {\n logger.debug(\n 'Dependency already up to date - reattempting recursively',\n );\n return updateArtifactsImpl(\n {\n packageFileName,\n updatedDeps: newUpdatedDeps,\n newPackageFileContent,\n config,\n },\n recursionLimit - 1,\n );\n }\n }\n\n logger.debug({ err }, 'Failed to update Cargo lock file');\n\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/cargo/artifacts.ts"],"sourcesContent":["import { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n findLocalSiblingOrParent,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../util/git/exec.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport { extractLockFileContentVersions } from './locked-version.ts';\n\nconst gitExec = withGitEnvironment(['cargo']);\n\nasync function cargoUpdate(\n manifestPath: string,\n isLockFileMaintenance: boolean,\n constraint: string | undefined,\n): Promise<void> {\n let cmd = `cargo update --config net.git-fetch-with-cli=true --manifest-path ${quote(\n manifestPath,\n )}`;\n // If we're updating a specific crate, `cargo-update` requires `--workspace`\n // for more information, see: https://github.com/renovatebot/renovate/issues/12332\n if (!isLockFileMaintenance) {\n cmd += ` --workspace`;\n }\n\n const execOptions: ExecOptions = {\n docker: {},\n toolConstraints: [{ toolName: 'rust', constraint }],\n };\n await gitExec(cmd, execOptions);\n}\n\nasync function cargoUpdatePrecise(\n manifestPath: string,\n updatedDeps: Upgrade[],\n constraint: string | undefined,\n): Promise<void> {\n const cmds = [];\n\n // First update individual dependencies to their `newVersion`. Necessary when\n // using the `update-lockfile` rangeStrategy which doesn't touch Cargo.toml.\n for (const dep of updatedDeps) {\n // If the range is bumped in Cargo.toml, the old lockedVersion may no longer\n // exist in Cargo's dependency graph, so let the --workspace update at the\n // end re-resolve it instead.\n if (dep.currentValue && dep.newValue && dep.currentValue !== dep.newValue) {\n continue;\n }\n\n cmds.push(\n `cargo update --config net.git-fetch-with-cli=true` +\n ` --manifest-path ${quote(manifestPath)}` +\n ` --package ${quote(`${dep.packageName}@${dep.lockedVersion}`)}` +\n ` --precise ${quote(dep.newVersion!)}`,\n );\n }\n\n // Then update all dependencies that have been bumped in `Cargo.toml`.\n cmds.push(\n `cargo update --config net.git-fetch-with-cli=true --manifest-path ${quote(manifestPath)} --workspace`,\n );\n\n const execOptions: ExecOptions = {\n docker: {},\n toolConstraints: [{ toolName: 'rust', constraint }],\n };\n\n await gitExec(cmds, execOptions);\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n return await updateArtifactsImpl(updateArtifact);\n}\n\nasync function updateArtifactsImpl(\n {\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n }: UpdateArtifact,\n recursionLimit = 10,\n): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`cargo.updateArtifacts(${packageFileName})`);\n\n // For standalone package crates, the `Cargo.lock` will be in the same\n // directory as `Cargo.toml` (ie. a sibling). For cargo workspaces, it\n // will be further up.\n const lockFileName = await findLocalSiblingOrParent(\n packageFileName,\n 'Cargo.lock',\n );\n const existingLockFileContent = lockFileName\n ? await readLocalFile(lockFileName)\n : null;\n if (!existingLockFileContent || !lockFileName) {\n logger.debug('No Cargo.lock found');\n return null;\n }\n\n const { isLockFileMaintenance } = config;\n if (!isLockFileMaintenance && !updatedDeps?.length) {\n logger.debug('No more dependencies to update');\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: existingLockFileContent,\n },\n },\n ];\n }\n\n const rustConstraint = await resolveToolConstraint(config, 'rust');\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n logger.debug(`Updating ${lockFileName}`);\n\n if (isLockFileMaintenance) {\n await cargoUpdate(packageFileName, true, rustConstraint);\n } else {\n const hasNonCrateDep = updatedDeps.some(\n (dep) => dep.datasource !== CrateDatasource.id,\n );\n const crateDepWithoutLockedVersion = updatedDeps.find(\n (dep) => !dep.lockedVersion && dep.datasource === CrateDatasource.id,\n );\n // Non-crate dependencies (like git ones) do not have locked versions.\n // For crate dependencies, a locked version is expected.\n // In both situations, perform a regular workspace lockfile update.\n if (hasNonCrateDep || crateDepWithoutLockedVersion) {\n // v8 ignore else -- needs a workspace update driven only by a non-crate dep\n if (crateDepWithoutLockedVersion) {\n // Only warn when a crate dependency has no locked version\n logger.warn(\n { dependency: crateDepWithoutLockedVersion.depName },\n 'Missing locked version for dependency',\n );\n }\n await cargoUpdate(packageFileName, false, rustConstraint);\n } else {\n // If all dependencies have locked versions then update them precisely.\n await cargoUpdatePrecise(packageFileName, updatedDeps, rustConstraint);\n }\n }\n\n logger.debug('Returning updated Cargo.lock');\n const newCargoLockContent = await readLocalFile(lockFileName);\n if (existingLockFileContent === newCargoLockContent) {\n logger.debug('Cargo.lock is unchanged');\n return null;\n }\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newCargoLockContent,\n },\n },\n ];\n } catch (err) {\n // istanbul ignore if\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n\n // Sometimes `cargo update` will fail when a preceding dependency update\n // causes another dependency to update. In this case we can no longer\n // reference the dependency by its old version, so we filter it out\n // and retry recursively.\n const newCargoLockContent = await readLocalFile(lockFileName, 'utf8');\n if (\n recursionLimit > 0 &&\n newCargoLockContent &&\n regEx(/error: package ID specification/).test(err.stderr)\n ) {\n const versions = extractLockFileContentVersions(newCargoLockContent);\n const newUpdatedDeps = updatedDeps.filter(\n (dep) =>\n !coerceArray(versions?.get(dep.packageName!)).includes(\n dep.newVersion!,\n ),\n );\n\n // v8 ignore else -- this retry only runs when a dep was already current\n if (newUpdatedDeps.length < updatedDeps.length) {\n logger.debug(\n 'Dependency already up to date - reattempting recursively',\n );\n return updateArtifactsImpl(\n {\n packageFileName,\n updatedDeps: newUpdatedDeps,\n newPackageFileContent,\n config,\n },\n recursionLimit - 1,\n );\n }\n }\n\n logger.debug({ err }, 'Failed to update Cargo lock file');\n\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}