renovate 44.119.0 → 44.120.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 (56) hide show
  1. package/dist/modules/manager/ansible/extract.js +1 -1
  2. package/dist/modules/manager/ansible/extract.js.map +1 -1
  3. package/dist/modules/manager/azure-pipelines/extract.js +6 -4
  4. package/dist/modules/manager/azure-pipelines/extract.js.map +1 -1
  5. package/dist/modules/manager/bazel-module/extract.js +4 -1
  6. package/dist/modules/manager/bazel-module/extract.js.map +1 -1
  7. package/dist/modules/manager/bitbucket-pipelines/util.js +8 -4
  8. package/dist/modules/manager/bitbucket-pipelines/util.js.map +1 -1
  9. package/dist/modules/manager/buildpacks/extract.js +2 -2
  10. package/dist/modules/manager/buildpacks/extract.js.map +1 -1
  11. package/dist/modules/manager/circleci/extract.js +6 -6
  12. package/dist/modules/manager/circleci/extract.js.map +1 -1
  13. package/dist/modules/manager/crossplane/extract.js +1 -1
  14. package/dist/modules/manager/crossplane/extract.js.map +1 -1
  15. package/dist/modules/manager/crow/extract.js +1 -1
  16. package/dist/modules/manager/crow/extract.js.map +1 -1
  17. package/dist/modules/manager/devcontainer/extract.js +1 -1
  18. package/dist/modules/manager/devcontainer/extract.js.map +1 -1
  19. package/dist/modules/manager/docker-compose/extract.js +1 -1
  20. package/dist/modules/manager/docker-compose/extract.js.map +1 -1
  21. package/dist/modules/manager/dockerfile/extract.js +14 -6
  22. package/dist/modules/manager/dockerfile/extract.js.map +1 -1
  23. package/dist/modules/manager/droneci/extract.js +8 -4
  24. package/dist/modules/manager/droneci/extract.js.map +1 -1
  25. package/dist/modules/manager/fingerprint.generated.js +2 -2
  26. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  27. package/dist/modules/manager/flux/extract.js +16 -4
  28. package/dist/modules/manager/flux/extract.js.map +1 -1
  29. package/dist/modules/manager/github-actions/extract.js +12 -18
  30. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  31. package/dist/modules/manager/gitlabci/utils.js +1 -1
  32. package/dist/modules/manager/gitlabci/utils.js.map +1 -1
  33. package/dist/modules/manager/helm-values/extract.js +5 -2
  34. package/dist/modules/manager/helm-values/extract.js.map +1 -1
  35. package/dist/modules/manager/helmv3/oci.js +4 -1
  36. package/dist/modules/manager/helmv3/oci.js.map +1 -1
  37. package/dist/modules/manager/kubernetes/extract.js +2 -2
  38. package/dist/modules/manager/kubernetes/extract.js.map +1 -1
  39. package/dist/modules/manager/kustomize/extract.js +8 -2
  40. package/dist/modules/manager/kustomize/extract.js.map +1 -1
  41. package/dist/modules/manager/maven/extract.js +1 -1
  42. package/dist/modules/manager/maven/extract.js.map +1 -1
  43. package/dist/modules/manager/nuget/extract.js +1 -1
  44. package/dist/modules/manager/nuget/extract.js.map +1 -1
  45. package/dist/modules/manager/quadlet/extract.js +1 -1
  46. package/dist/modules/manager/quadlet/extract.js.map +1 -1
  47. package/dist/modules/manager/terraform/extractors/resources/generic-docker-image-ref.js +1 -1
  48. package/dist/modules/manager/terraform/extractors/resources/generic-docker-image-ref.js.map +1 -1
  49. package/dist/modules/manager/terraform/util.js +4 -1
  50. package/dist/modules/manager/terraform/util.js.map +1 -1
  51. package/dist/modules/manager/woodpecker/extract.js +1 -1
  52. package/dist/modules/manager/woodpecker/extract.js.map +1 -1
  53. package/dist/workers/repository/process/lookup/index.js +9 -1
  54. package/dist/workers/repository/process/lookup/index.js.map +1 -1
  55. package/package.json +1 -1
  56. package/renovate-schema.json +2 -2
@@ -10,7 +10,7 @@ function extractPackageFile(content, packageFile, config) {
10
10
  const match = re.exec(line);
11
11
  if (match) {
12
12
  const currentFrom = match.groups.image;
13
- const dep = getDep(currentFrom, true, config.registryAliases);
13
+ const dep = getDep(currentFrom, { registryAliases: config.registryAliases });
14
14
  logger.debug({
15
15
  depName: dep.depName,
16
16
  currentValue: dep.currentValue,
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ansible/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace(`ansible.extractPackageFile(${packageFile})`);\n let deps: PackageDependency[] = [];\n const re = regEx(/^\\s*image:\\s*'?\"?(?<image>[^\\s'\"]+)'?\"?\\s*$/);\n for (const line of content.split(newlineRegex)) {\n const match = re.exec(line);\n if (match) {\n const currentFrom = match.groups!.image;\n const dep = getDep(currentFrom, true, config.registryAliases);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Docker image inside ansible',\n );\n deps.push(dep);\n }\n }\n deps = deps.filter((dep) => !dep.currentValue?.includes('${'));\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n"],"mappings":";;;;AASA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,OAAO,MAAM,8BAA8B,YAAY,EAAE;CACzD,IAAI,OAA4B,CAAC;CACjC,MAAM,KAAK,MAAM,6CAA6C;CAC9D,KAAK,MAAM,QAAQ,QAAQ,MAAM,YAAY,GAAG;EAC9C,MAAM,QAAQ,GAAG,KAAK,IAAI;EAC1B,IAAI,OAAO;GACT,MAAM,cAAc,MAAM,OAAQ;GAClC,MAAM,MAAM,OAAO,aAAa,MAAM,OAAO,eAAe;GAC5D,OAAO,MACL;IACE,SAAS,IAAI;IACb,cAAc,IAAI;IAClB,eAAe,IAAI;GACrB,GACA,6BACF;GACA,KAAK,KAAK,GAAG;EACf;CACF;CACA,OAAO,KAAK,QAAQ,QAAQ,CAAC,IAAI,cAAc,SAAS,IAAI,CAAC;CAC7D,IAAI,CAAC,KAAK,QACR,OAAO;CAET,OAAO,EAAE,KAAK;AAChB"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ansible/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace(`ansible.extractPackageFile(${packageFile})`);\n let deps: PackageDependency[] = [];\n const re = regEx(/^\\s*image:\\s*'?\"?(?<image>[^\\s'\"]+)'?\"?\\s*$/);\n for (const line of content.split(newlineRegex)) {\n const match = re.exec(line);\n if (match) {\n const currentFrom = match.groups!.image;\n const dep = getDep(currentFrom, {\n registryAliases: config.registryAliases,\n });\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Docker image inside ansible',\n );\n deps.push(dep);\n }\n }\n deps = deps.filter((dep) => !dep.currentValue?.includes('${'));\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n"],"mappings":";;;;AASA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,OAAO,MAAM,8BAA8B,YAAY,EAAE;CACzD,IAAI,OAA4B,CAAC;CACjC,MAAM,KAAK,MAAM,6CAA6C;CAC9D,KAAK,MAAM,QAAQ,QAAQ,MAAM,YAAY,GAAG;EAC9C,MAAM,QAAQ,GAAG,KAAK,IAAI;EAC1B,IAAI,OAAO;GACT,MAAM,cAAc,MAAM,OAAQ;GAClC,MAAM,MAAM,OAAO,aAAa,EAC9B,iBAAiB,OAAO,gBAC1B,CAAC;GACD,OAAO,MACL;IACE,SAAS,IAAI;IACb,cAAc,IAAI;IAClB,eAAe,IAAI;GACrB,GACA,6BACF;GACA,KAAK,KAAK,GAAG;EACf;CACF;CACA,OAAO,KAAK,QAAQ,QAAQ,CAAC,IAAI,cAAc,SAAS,IAAI,CAAC;CAC7D,IAAI,CAAC,KAAK,QACR,OAAO;CAET,OAAO,EAAE,KAAK;AAChB"}
@@ -39,14 +39,16 @@ function extractRepository(repository, currentRepository) {
39
39
  replaceString: repository.ref
40
40
  };
41
41
  }
42
- function extractContainer(container) {
43
- const dep = getDep(container.image);
42
+ function extractContainer(container, config) {
43
+ const dep = getDep(container.image, {
44
+ registryAliases: config.registryAliases,
45
+ depType: "docker"
46
+ });
44
47
  logger.debug({
45
48
  depName: dep.depName,
46
49
  currentValue: dep.currentValue,
47
50
  currentDigest: dep.currentDigest
48
51
  }, "Azure pipelines docker image");
49
- dep.depType = "docker";
50
52
  return dep;
51
53
  }
52
54
  function extractAzurePipelinesTasks(task) {
@@ -112,7 +114,7 @@ function extractPackageFile(content, packageFile, config) {
112
114
  if (dep) deps.push(dep);
113
115
  }
114
116
  for (const container of coerceArray(pkg.resources?.containers)) {
115
- const dep = extractContainer(container);
117
+ const dep = extractContainer(container, config);
116
118
  // v8 ignore else -- `extractContainer()` always returns a dep
117
119
  if (dep) deps.push(dep);
118
120
  }
@@ -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 // 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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"}
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 config: ExtractConfig,\n): PackageDependency | null {\n const dep = getDep(container.image, {\n registryAliases: config.registryAliases,\n depType: 'docker',\n });\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Azure pipelines docker image',\n );\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, config);\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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"}
@@ -21,7 +21,10 @@ async function extractPackageFile(content, packageFile, config) {
21
21
  const dockerDeps = LooseArray(RuleToDockerPackageDep).transform((deps) => deps.map((dep) => {
22
22
  const imageRef = `${dep.packageName}${dep.currentValue ? `:${dep.currentValue}` : ""}${dep.currentDigest ? `@${dep.currentDigest}` : ""}`;
23
23
  return {
24
- ...getDep(imageRef, false, config?.registryAliases),
24
+ ...getDep(imageRef, {
25
+ specifyReplaceString: false,
26
+ registryAliases: config?.registryAliases
27
+ }),
25
28
  depType: "oci_pull",
26
29
  depName: dep.depName,
27
30
  replaceString: dep.replaceString
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["rules.toPackageDependencies","bazelrc.read"],"sources":["../../../../lib/modules/manager/bazel-module/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { isNotNullOrUndefined } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport * as bazelrc from './bazelrc.ts';\nimport { RuleToCratePackageDep } from './parser/crate.ts';\nimport { parse } from './parser/index.ts';\nimport { RuleToMavenPackageDep, fillRegistryUrls } from './parser/maven.ts';\nimport { RuleToDockerPackageDep } from './parser/oci.ts';\nimport type { ResultFragment } from './parser/types.ts';\nimport * as rules from './rules.ts';\nimport {\n GitRepositoryToPackageDep,\n RuleToBazelModulePackageDep,\n} from './rules.ts';\nimport { transformRulesImgCalls } from './rules-img.ts';\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n config?: ExtractConfig,\n): Promise<PackageFileContent | null> {\n try {\n const records = parse(content);\n const pfc = await extractBazelPfc(records, packageFile);\n const gitRepositoryDeps = extractGitRepositoryDeps(records);\n const mavenDeps = extractMavenDeps(records);\n const dockerDeps = LooseArray(RuleToDockerPackageDep)\n .transform((deps) =>\n deps.map((dep) => {\n // Reconstruct the image reference from parsed data\n const imageRef = `${dep.packageName}${dep.currentValue ? `:${dep.currentValue}` : ''}${dep.currentDigest ? `@${dep.currentDigest}` : ''}`;\n // Use getDep to handle registry aliases properly\n const processedDep = getDep(imageRef, false, config?.registryAliases);\n return {\n ...processedDep,\n depType: 'oci_pull',\n depName: dep.depName, // Keep the original name field from bazel\n replaceString: dep.replaceString, // Keep the original replace string\n };\n }),\n )\n .parse(records);\n const rulesImgDeps = transformRulesImgCalls(records);\n const crateDeps = LooseArray(RuleToCratePackageDep).parse(records);\n\n if (gitRepositoryDeps.length) {\n pfc.deps.push(...gitRepositoryDeps);\n }\n\n if (mavenDeps.length) {\n pfc.deps.push(...mavenDeps);\n }\n\n if (dockerDeps.length) {\n pfc.deps.push(...dockerDeps);\n }\n\n if (rulesImgDeps.length) {\n pfc.deps.push(...rulesImgDeps);\n }\n\n if (crateDeps.length) {\n pfc.deps.push(...crateDeps);\n }\n\n return pfc.deps.length ? pfc : null;\n } catch (err) {\n logger.debug({ err, packageFile }, 'Failed to parse bazel module file.');\n return null;\n }\n}\n\nasync function extractBazelPfc(\n records: ResultFragment[],\n packageFile: string,\n): Promise<PackageFileContent> {\n const pfc: PackageFileContent = LooseArray(RuleToBazelModulePackageDep)\n .transform(rules.toPackageDependencies)\n .transform((deps) => ({ deps }))\n .parse(records);\n\n const registryUrls = (await bazelrc.read(upath.dirname(packageFile)))\n // Ignore any entries for custom configurations\n .filter((ce) => ce.config === undefined)\n .map((ce) => ce.getOption('registry')?.value)\n .map((url) => url?.replace(regEx(/^[\"']|[\"']$/g), ''))\n .filter(isNotNullOrUndefined);\n if (registryUrls.length) {\n pfc.registryUrls = registryUrls;\n }\n\n return pfc;\n}\n\nfunction extractGitRepositoryDeps(\n records: ResultFragment[],\n): PackageDependency[] {\n return LooseArray(GitRepositoryToPackageDep).parse(records);\n}\n\nfunction extractMavenDeps(records: ResultFragment[]): PackageDependency[] {\n return LooseArray(RuleToMavenPackageDep)\n .transform(fillRegistryUrls)\n .parse(records);\n}\n"],"mappings":";;;;;;;;;;;;;;AAwBA,eAAsB,mBACpB,SACA,aACA,QACoC;CACpC,IAAI;EACF,MAAM,UAAU,MAAM,OAAO;EAC7B,MAAM,MAAM,MAAM,gBAAgB,SAAS,WAAW;EACtD,MAAM,oBAAoB,yBAAyB,OAAO;EAC1D,MAAM,YAAY,iBAAiB,OAAO;EAC1C,MAAM,aAAa,WAAW,sBAAsB,CAAC,CAClD,WAAW,SACV,KAAK,KAAK,QAAQ;GAEhB,MAAM,WAAW,GAAG,IAAI,cAAc,IAAI,eAAe,IAAI,IAAI,iBAAiB,KAAK,IAAI,gBAAgB,IAAI,IAAI,kBAAkB;GAGrI,OAAO;IACL,GAFmB,OAAO,UAAU,OAAO,QAAQ,eAErC;IACd,SAAS;IACT,SAAS,IAAI;IACb,eAAe,IAAI;GACrB;EACF,CAAC,CACH,CAAC,CACA,MAAM,OAAO;EAChB,MAAM,eAAe,uBAAuB,OAAO;EACnD,MAAM,YAAY,WAAW,qBAAqB,CAAC,CAAC,MAAM,OAAO;EAEjE,IAAI,kBAAkB,QACpB,IAAI,KAAK,KAAK,GAAG,iBAAiB;EAGpC,IAAI,UAAU,QACZ,IAAI,KAAK,KAAK,GAAG,SAAS;EAG5B,IAAI,WAAW,QACb,IAAI,KAAK,KAAK,GAAG,UAAU;EAG7B,IAAI,aAAa,QACf,IAAI,KAAK,KAAK,GAAG,YAAY;EAG/B,IAAI,UAAU,QACZ,IAAI,KAAK,KAAK,GAAG,SAAS;EAG5B,OAAO,IAAI,KAAK,SAAS,MAAM;CACjC,SAAS,KAAK;EACZ,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,oCAAoC;EACvE,OAAO;CACT;AACF;AAEA,eAAe,gBACb,SACA,aAC6B;CAC7B,MAAM,MAA0B,WAAW,2BAA2B,CAAC,CACpE,UAAUA,qBAA2B,CAAC,CACtC,WAAW,UAAU,EAAE,KAAK,EAAE,CAAC,CAC/B,MAAM,OAAO;CAEhB,MAAM,gBAAgB,MAAMC,KAAa,MAAM,QAAQ,WAAW,CAAC,EAAA,CAEhE,QAAQ,OAAO,GAAG,WAAW,KAAA,CAAS,CAAC,CACvC,KAAK,OAAO,GAAG,UAAU,UAAU,CAAC,EAAE,KAAK,CAAC,CAC5C,KAAK,QAAQ,KAAK,QAAQ,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,CACrD,OAAO,oBAAoB;CAC9B,IAAI,aAAa,QACf,IAAI,eAAe;CAGrB,OAAO;AACT;AAEA,SAAS,yBACP,SACqB;CACrB,OAAO,WAAW,yBAAyB,CAAC,CAAC,MAAM,OAAO;AAC5D;AAEA,SAAS,iBAAiB,SAAgD;CACxE,OAAO,WAAW,qBAAqB,CAAC,CACrC,UAAU,gBAAgB,CAAC,CAC3B,MAAM,OAAO;AAClB"}
1
+ {"version":3,"file":"extract.js","names":["rules.toPackageDependencies","bazelrc.read"],"sources":["../../../../lib/modules/manager/bazel-module/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { isNotNullOrUndefined } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport * as bazelrc from './bazelrc.ts';\nimport { RuleToCratePackageDep } from './parser/crate.ts';\nimport { parse } from './parser/index.ts';\nimport { RuleToMavenPackageDep, fillRegistryUrls } from './parser/maven.ts';\nimport { RuleToDockerPackageDep } from './parser/oci.ts';\nimport type { ResultFragment } from './parser/types.ts';\nimport * as rules from './rules.ts';\nimport {\n GitRepositoryToPackageDep,\n RuleToBazelModulePackageDep,\n} from './rules.ts';\nimport { transformRulesImgCalls } from './rules-img.ts';\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n config?: ExtractConfig,\n): Promise<PackageFileContent | null> {\n try {\n const records = parse(content);\n const pfc = await extractBazelPfc(records, packageFile);\n const gitRepositoryDeps = extractGitRepositoryDeps(records);\n const mavenDeps = extractMavenDeps(records);\n const dockerDeps = LooseArray(RuleToDockerPackageDep)\n .transform((deps) =>\n deps.map((dep) => {\n // Reconstruct the image reference from parsed data\n const imageRef = `${dep.packageName}${dep.currentValue ? `:${dep.currentValue}` : ''}${dep.currentDigest ? `@${dep.currentDigest}` : ''}`;\n // Use getDep to handle registry aliases properly\n const processedDep = getDep(imageRef, {\n specifyReplaceString: false,\n registryAliases: config?.registryAliases,\n });\n return {\n ...processedDep,\n depType: 'oci_pull',\n depName: dep.depName, // Keep the original name field from bazel\n replaceString: dep.replaceString, // Keep the original replace string\n };\n }),\n )\n .parse(records);\n const rulesImgDeps = transformRulesImgCalls(records);\n const crateDeps = LooseArray(RuleToCratePackageDep).parse(records);\n\n if (gitRepositoryDeps.length) {\n pfc.deps.push(...gitRepositoryDeps);\n }\n\n if (mavenDeps.length) {\n pfc.deps.push(...mavenDeps);\n }\n\n if (dockerDeps.length) {\n pfc.deps.push(...dockerDeps);\n }\n\n if (rulesImgDeps.length) {\n pfc.deps.push(...rulesImgDeps);\n }\n\n if (crateDeps.length) {\n pfc.deps.push(...crateDeps);\n }\n\n return pfc.deps.length ? pfc : null;\n } catch (err) {\n logger.debug({ err, packageFile }, 'Failed to parse bazel module file.');\n return null;\n }\n}\n\nasync function extractBazelPfc(\n records: ResultFragment[],\n packageFile: string,\n): Promise<PackageFileContent> {\n const pfc: PackageFileContent = LooseArray(RuleToBazelModulePackageDep)\n .transform(rules.toPackageDependencies)\n .transform((deps) => ({ deps }))\n .parse(records);\n\n const registryUrls = (await bazelrc.read(upath.dirname(packageFile)))\n // Ignore any entries for custom configurations\n .filter((ce) => ce.config === undefined)\n .map((ce) => ce.getOption('registry')?.value)\n .map((url) => url?.replace(regEx(/^[\"']|[\"']$/g), ''))\n .filter(isNotNullOrUndefined);\n if (registryUrls.length) {\n pfc.registryUrls = registryUrls;\n }\n\n return pfc;\n}\n\nfunction extractGitRepositoryDeps(\n records: ResultFragment[],\n): PackageDependency[] {\n return LooseArray(GitRepositoryToPackageDep).parse(records);\n}\n\nfunction extractMavenDeps(records: ResultFragment[]): PackageDependency[] {\n return LooseArray(RuleToMavenPackageDep)\n .transform(fillRegistryUrls)\n .parse(records);\n}\n"],"mappings":";;;;;;;;;;;;;;AAwBA,eAAsB,mBACpB,SACA,aACA,QACoC;CACpC,IAAI;EACF,MAAM,UAAU,MAAM,OAAO;EAC7B,MAAM,MAAM,MAAM,gBAAgB,SAAS,WAAW;EACtD,MAAM,oBAAoB,yBAAyB,OAAO;EAC1D,MAAM,YAAY,iBAAiB,OAAO;EAC1C,MAAM,aAAa,WAAW,sBAAsB,CAAC,CAClD,WAAW,SACV,KAAK,KAAK,QAAQ;GAEhB,MAAM,WAAW,GAAG,IAAI,cAAc,IAAI,eAAe,IAAI,IAAI,iBAAiB,KAAK,IAAI,gBAAgB,IAAI,IAAI,kBAAkB;GAMrI,OAAO;IACL,GALmB,OAAO,UAAU;KACpC,sBAAsB;KACtB,iBAAiB,QAAQ;IAC3B,CAEgB;IACd,SAAS;IACT,SAAS,IAAI;IACb,eAAe,IAAI;GACrB;EACF,CAAC,CACH,CAAC,CACA,MAAM,OAAO;EAChB,MAAM,eAAe,uBAAuB,OAAO;EACnD,MAAM,YAAY,WAAW,qBAAqB,CAAC,CAAC,MAAM,OAAO;EAEjE,IAAI,kBAAkB,QACpB,IAAI,KAAK,KAAK,GAAG,iBAAiB;EAGpC,IAAI,UAAU,QACZ,IAAI,KAAK,KAAK,GAAG,SAAS;EAG5B,IAAI,WAAW,QACb,IAAI,KAAK,KAAK,GAAG,UAAU;EAG7B,IAAI,aAAa,QACf,IAAI,KAAK,KAAK,GAAG,YAAY;EAG/B,IAAI,UAAU,QACZ,IAAI,KAAK,KAAK,GAAG,SAAS;EAG5B,OAAO,IAAI,KAAK,SAAS,MAAM;CACjC,SAAS,KAAK;EACZ,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,oCAAoC;EACvE,OAAO;CACT;AACF;AAEA,eAAe,gBACb,SACA,aAC6B;CAC7B,MAAM,MAA0B,WAAW,2BAA2B,CAAC,CACpE,UAAUA,qBAA2B,CAAC,CACtC,WAAW,UAAU,EAAE,KAAK,EAAE,CAAC,CAC/B,MAAM,OAAO;CAEhB,MAAM,gBAAgB,MAAMC,KAAa,MAAM,QAAQ,WAAW,CAAC,EAAA,CAEhE,QAAQ,OAAO,GAAG,WAAW,KAAA,CAAS,CAAC,CACvC,KAAK,OAAO,GAAG,UAAU,UAAU,CAAC,EAAE,KAAK,CAAC,CAC5C,KAAK,QAAQ,KAAK,QAAQ,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,CACrD,OAAO,oBAAoB;CAC9B,IAAI,aAAa,QACf,IAAI,eAAe;CAGrB,OAAO;AACT;AAEA,SAAS,yBACP,SACqB;CACrB,OAAO,WAAW,yBAAyB,CAAC,CAAC,MAAM,OAAO;AAC5D;AAEA,SAAS,iBAAiB,SAAgD;CACxE,OAAO,WAAW,qBAAqB,CAAC,CACrC,UAAU,gBAAgB,CAAC,CAC3B,MAAM,OAAO;AAClB"}
@@ -16,8 +16,10 @@ function addDepAsBitbucketTag(deps, pipe) {
16
16
  deps.push(dep);
17
17
  }
18
18
  function addDepAsDockerImage(deps, currentDockerImage, registryAliases) {
19
- const dep = getDep(currentDockerImage, true, registryAliases);
20
- dep.depType = "docker";
19
+ const dep = getDep(currentDockerImage, {
20
+ registryAliases,
21
+ depType: "docker"
22
+ });
21
23
  deps.push(dep);
22
24
  }
23
25
  function addDepFromObject(deps, lines, start, len, spaces, registryAliases) {
@@ -28,8 +30,10 @@ function addDepFromObject(deps, lines, start, len, spaces, registryAliases) {
28
30
  if (!indentRegex.test(line)) return idx;
29
31
  const groups = nameRegex.exec(line)?.groups;
30
32
  if (groups) {
31
- const dep = getDep(groups.image, true, registryAliases);
32
- dep.depType = "docker";
33
+ const dep = getDep(groups.image, {
34
+ registryAliases,
35
+ depType: "docker"
36
+ });
33
37
  deps.push(dep);
34
38
  return idx;
35
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","names":[],"sources":["../../../../lib/modules/manager/bitbucket-pipelines/util.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type { PackageDependency } from '../types.ts';\n\nexport const pipeRegex = regEx(`^\\\\s*-\\\\s?pipe:\\\\s*'?\"?([^\\\\s'\"]+)'?\"?\\\\s*$`);\nexport const dockerImageRegex = regEx(\n `^\\\\s*-?\\\\s?image:\\\\s*'?\"?([^\\\\s'\"]+)'?\"?\\\\s*$`,\n);\nexport const dockerImageObjectRegex = regEx('^(?<spaces>\\\\s*)image:\\\\s*$');\n\nexport function addDepAsBitbucketTag(\n deps: PackageDependency[],\n pipe: string,\n): void {\n const [depName, currentValue] = pipe.split(':');\n const dep: PackageDependency = {\n depName,\n currentValue,\n datasource: BitbucketTagsDatasource.id,\n };\n dep.depType = 'bitbucket-tags';\n deps.push(dep);\n}\n\nexport function addDepAsDockerImage(\n deps: PackageDependency[],\n currentDockerImage: string,\n registryAliases?: Record<string, string>,\n): void {\n const dep = getDep(currentDockerImage, true, registryAliases);\n dep.depType = 'docker';\n deps.push(dep);\n}\n\nexport function addDepFromObject(\n deps: PackageDependency[],\n lines: string[],\n start: number,\n len: number,\n spaces: string,\n registryAliases?: Record<string, string>,\n): number {\n const nameRegex = regEx(\n `^${spaces}\\\\s+name:\\\\s*['\"]?(?<image>[^\\\\s'\"]+)['\"]?\\\\s*$`,\n );\n const indentRegex = regEx(`^${spaces}\\\\s+`);\n\n for (let idx = start + 1; idx < len; idx++) {\n const line = lines[idx];\n\n if (!indentRegex.test(line)) {\n // malformed\n return idx;\n }\n\n const groups = nameRegex.exec(line)?.groups;\n if (groups) {\n const dep = getDep(groups.image, true, registryAliases);\n dep.depType = 'docker';\n deps.push(dep);\n return idx;\n }\n }\n\n // malformed\n return start;\n}\n"],"mappings":";;;;AAKA,MAAa,YAAY,MAAM,6CAA6C;AAC5E,MAAa,mBAAmB,MAC9B,+CACF;AACA,MAAa,yBAAyB,MAAM,6BAA6B;AAEzE,SAAgB,qBACd,MACA,MACM;CACN,MAAM,CAAC,SAAS,gBAAgB,KAAK,MAAM,GAAG;CAC9C,MAAM,MAAyB;EAC7B;EACA;EACA,YAAY,wBAAwB;CACtC;CACA,IAAI,UAAU;CACd,KAAK,KAAK,GAAG;AACf;AAEA,SAAgB,oBACd,MACA,oBACA,iBACM;CACN,MAAM,MAAM,OAAO,oBAAoB,MAAM,eAAe;CAC5D,IAAI,UAAU;CACd,KAAK,KAAK,GAAG;AACf;AAEA,SAAgB,iBACd,MACA,OACA,OACA,KACA,QACA,iBACQ;CACR,MAAM,YAAY,MAChB,IAAI,OAAO,gDACb;CACA,MAAM,cAAc,MAAM,IAAI,OAAO,KAAK;CAE1C,KAAK,IAAI,MAAM,QAAQ,GAAG,MAAM,KAAK,OAAO;EAC1C,MAAM,OAAO,MAAM;EAEnB,IAAI,CAAC,YAAY,KAAK,IAAI,GAExB,OAAO;EAGT,MAAM,SAAS,UAAU,KAAK,IAAI,CAAC,EAAE;EACrC,IAAI,QAAQ;GACV,MAAM,MAAM,OAAO,OAAO,OAAO,MAAM,eAAe;GACtD,IAAI,UAAU;GACd,KAAK,KAAK,GAAG;GACb,OAAO;EACT;CACF;CAGA,OAAO;AACT"}
1
+ {"version":3,"file":"util.js","names":[],"sources":["../../../../lib/modules/manager/bitbucket-pipelines/util.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type { PackageDependency } from '../types.ts';\n\nexport const pipeRegex = regEx(`^\\\\s*-\\\\s?pipe:\\\\s*'?\"?([^\\\\s'\"]+)'?\"?\\\\s*$`);\nexport const dockerImageRegex = regEx(\n `^\\\\s*-?\\\\s?image:\\\\s*'?\"?([^\\\\s'\"]+)'?\"?\\\\s*$`,\n);\nexport const dockerImageObjectRegex = regEx('^(?<spaces>\\\\s*)image:\\\\s*$');\n\nexport function addDepAsBitbucketTag(\n deps: PackageDependency[],\n pipe: string,\n): void {\n const [depName, currentValue] = pipe.split(':');\n const dep: PackageDependency = {\n depName,\n currentValue,\n datasource: BitbucketTagsDatasource.id,\n };\n dep.depType = 'bitbucket-tags';\n deps.push(dep);\n}\n\nexport function addDepAsDockerImage(\n deps: PackageDependency[],\n currentDockerImage: string,\n registryAliases?: Record<string, string>,\n): void {\n const dep = getDep(currentDockerImage, {\n registryAliases,\n depType: 'docker',\n });\n deps.push(dep);\n}\n\nexport function addDepFromObject(\n deps: PackageDependency[],\n lines: string[],\n start: number,\n len: number,\n spaces: string,\n registryAliases?: Record<string, string>,\n): number {\n const nameRegex = regEx(\n `^${spaces}\\\\s+name:\\\\s*['\"]?(?<image>[^\\\\s'\"]+)['\"]?\\\\s*$`,\n );\n const indentRegex = regEx(`^${spaces}\\\\s+`);\n\n for (let idx = start + 1; idx < len; idx++) {\n const line = lines[idx];\n\n if (!indentRegex.test(line)) {\n // malformed\n return idx;\n }\n\n const groups = nameRegex.exec(line)?.groups;\n if (groups) {\n const dep = getDep(groups.image, { registryAliases, depType: 'docker' });\n deps.push(dep);\n return idx;\n }\n }\n\n // malformed\n return start;\n}\n"],"mappings":";;;;AAKA,MAAa,YAAY,MAAM,6CAA6C;AAC5E,MAAa,mBAAmB,MAC9B,+CACF;AACA,MAAa,yBAAyB,MAAM,6BAA6B;AAEzE,SAAgB,qBACd,MACA,MACM;CACN,MAAM,CAAC,SAAS,gBAAgB,KAAK,MAAM,GAAG;CAC9C,MAAM,MAAyB;EAC7B;EACA;EACA,YAAY,wBAAwB;CACtC;CACA,IAAI,UAAU;CACd,KAAK,KAAK,GAAG;AACf;AAEA,SAAgB,oBACd,MACA,oBACA,iBACM;CACN,MAAM,MAAM,OAAO,oBAAoB;EACrC;EACA,SAAS;CACX,CAAC;CACD,KAAK,KAAK,GAAG;AACf;AAEA,SAAgB,iBACd,MACA,OACA,OACA,KACA,QACA,iBACQ;CACR,MAAM,YAAY,MAChB,IAAI,OAAO,gDACb;CACA,MAAM,cAAc,MAAM,IAAI,OAAO,KAAK;CAE1C,KAAK,IAAI,MAAM,QAAQ,GAAG,MAAM,KAAK,OAAO;EAC1C,MAAM,OAAO,MAAM;EAEnB,IAAI,CAAC,YAAY,KAAK,IAAI,GAExB,OAAO;EAGT,MAAM,SAAS,UAAU,KAAK,IAAI,CAAC,EAAE;EACrC,IAAI,QAAQ;GACV,MAAM,MAAM,OAAO,OAAO,OAAO;IAAE;IAAiB,SAAS;GAAS,CAAC;GACvE,KAAK,KAAK,GAAG;GACb,OAAO;EACT;CACF;CAGA,OAAO;AACT"}
@@ -37,7 +37,7 @@ function extractPackageFile(content, packageFile, config) {
37
37
  const descriptor = parseProjectToml(content, packageFile);
38
38
  if (!descriptor) return null;
39
39
  if (descriptor.io?.buildpacks?.builder && isDockerRef(descriptor.io.buildpacks.builder)) {
40
- const dep = getDep$1(descriptor.io.buildpacks.builder.replace(DOCKER_PREFIX, ""), true, config.registryAliases);
40
+ const dep = getDep$1(descriptor.io.buildpacks.builder.replace(DOCKER_PREFIX, ""), { registryAliases: config.registryAliases });
41
41
  logger.trace({
42
42
  depName: dep.depName,
43
43
  currentValue: dep.currentValue,
@@ -50,7 +50,7 @@ function extractPackageFile(content, packageFile, config) {
50
50
  }
51
51
  if (descriptor.io?.buildpacks?.group && isArray(descriptor.io.buildpacks.group)) {
52
52
  for (const group of descriptor.io.buildpacks.group) if (isBuildpackByURI(group) && isDockerRef(group.uri)) {
53
- const dep = getDep$1(group.uri.replace(DOCKER_PREFIX, ""), true, config.registryAliases);
53
+ const dep = getDep$1(group.uri.replace(DOCKER_PREFIX, ""), { registryAliases: config.registryAliases });
54
54
  logger.trace({
55
55
  depName: dep.depName,
56
56
  currentValue: dep.currentValue,
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["getDockerDep"],"sources":["../../../../lib/modules/manager/buildpacks/extract.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { BuildpacksRegistryDatasource } from '../../datasource/buildpacks-registry/index.ts';\nimport { isVersion } from '../../versioning/semver/index.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport {\n type ProjectDescriptor,\n ProjectDescriptorToml,\n isBuildpackByName,\n isBuildpackByURI,\n} from './schema.ts';\n\nexport const DOCKER_PREFIX = regEx(/^docker:\\/?\\//);\nconst dockerRef = regEx(\n /^(?:(?:(?:[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?(?:\\.[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?)*)(?::\\d{2,5}\\/)?)?[a-z\\d]+(?:(?:\\.|_|__|-+)[a-z\\d]+)*(?:\\/[a-z\\d]+(?:(?:\\.|_|__|-+)[a-z\\d]+)*)*(?::(?:\\w[\\w.-]{0,127})(?:@sha256:[A-Fa-f\\d]{32,})?|@sha256:[A-Fa-f\\d]{32,}))$/,\n);\n\nexport function isDockerRef(ref: string): boolean {\n if (ref.startsWith('docker:/') || dockerRef.test(ref)) {\n return true;\n }\n return false;\n}\nexport const BUILDPACK_REGISTRY_PREFIX = 'urn:cnb:registry:';\nconst buildpackRegistryId = regEx(\n /^[a-z0-9\\-.]+\\/[a-z0-9\\-.]+(?:@(?<version>.+))?$/,\n);\n\nfunction isBuildpackRegistryId(ref: string): boolean {\n const bpRegistryMatch = buildpackRegistryId.exec(ref);\n if (!bpRegistryMatch) {\n return false;\n }\n if (!bpRegistryMatch.groups?.version) {\n return true;\n }\n return isVersion(bpRegistryMatch.groups.version);\n}\n\nexport function isBuildpackRegistryRef(ref: string): boolean {\n return (\n isBuildpackRegistryId(ref) || ref.startsWith(BUILDPACK_REGISTRY_PREFIX)\n );\n}\n\nfunction parseProjectToml(\n content: string,\n packageFile: string,\n): ProjectDescriptor | null {\n const res = ProjectDescriptorToml.safeParse(content);\n if (res.success) {\n return res.data;\n }\n\n logger.debug(\n { packageFile, err: res.error },\n 'Failed to parse buildpacks project descriptor TOML',\n );\n\n return null;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const deps: PackageDependency[] = [];\n\n const descriptor = parseProjectToml(content, packageFile);\n if (!descriptor) {\n return null;\n }\n\n if (\n descriptor.io?.buildpacks?.builder &&\n isDockerRef(descriptor.io.buildpacks.builder)\n ) {\n const dep = getDockerDep(\n descriptor.io.buildpacks.builder.replace(DOCKER_PREFIX, ''),\n true,\n config.registryAliases,\n );\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Cloud Native Buildpacks builder',\n );\n\n deps.push({ ...dep, commitMessageTopic: 'builder {{depName}}' });\n }\n\n if (\n descriptor.io?.buildpacks?.group &&\n isArray(descriptor.io.buildpacks.group)\n ) {\n for (const group of descriptor.io.buildpacks.group) {\n if (isBuildpackByURI(group) && isDockerRef(group.uri)) {\n const dep = getDockerDep(\n group.uri.replace(DOCKER_PREFIX, ''),\n true,\n config.registryAliases,\n );\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Cloud Native Buildpack',\n );\n\n deps.push(dep);\n } else if (isBuildpackByURI(group) && isBuildpackRegistryRef(group.uri)) {\n const dep = getDep(group.uri.replace(BUILDPACK_REGISTRY_PREFIX, ''));\n if (dep) {\n deps.push(dep);\n }\n } else if (isBuildpackByName(group)) {\n const version = group.version;\n\n if (version) {\n const dep: PackageDependency = {\n datasource: BuildpacksRegistryDatasource.id,\n currentValue: version,\n packageName: group.id,\n };\n deps.push(dep);\n }\n }\n }\n }\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n\nexport function getDep(currentFrom: string): PackageDependency | null {\n if (currentFrom.includes('@')) {\n const dep: PackageDependency = {\n datasource: BuildpacksRegistryDatasource.id,\n packageName: currentFrom.split('@')[0],\n autoReplaceStringTemplate:\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',\n };\n const version = currentFrom.split('@')[1];\n dep.currentValue = version;\n return dep;\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;AAkBA,MAAa,gBAAgB,MAAM,eAAe;AAClD,MAAM,YAAY,MAChB,kQACF;AAEA,SAAgB,YAAY,KAAsB;CAChD,IAAI,IAAI,WAAW,UAAU,KAAK,UAAU,KAAK,GAAG,GAClD,OAAO;CAET,OAAO;AACT;AACA,MAAa,4BAA4B;AACzC,MAAM,sBAAsB,MAC1B,kDACF;AAEA,SAAS,sBAAsB,KAAsB;CACnD,MAAM,kBAAkB,oBAAoB,KAAK,GAAG;CACpD,IAAI,CAAC,iBACH,OAAO;CAET,IAAI,CAAC,gBAAgB,QAAQ,SAC3B,OAAO;CAET,OAAO,UAAU,gBAAgB,OAAO,OAAO;AACjD;AAEA,SAAgB,uBAAuB,KAAsB;CAC3D,OACE,sBAAsB,GAAG,KAAK,IAAI,WAAA,mBAAoC;AAE1E;AAEA,SAAS,iBACP,SACA,aAC0B;CAC1B,MAAM,MAAM,sBAAsB,UAAU,OAAO;CACnD,IAAI,IAAI,SACN,OAAO,IAAI;CAGb,OAAO,MACL;EAAE;EAAa,KAAK,IAAI;CAAM,GAC9B,oDACF;CAEA,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,MAAM,OAA4B,CAAC;CAEnC,MAAM,aAAa,iBAAiB,SAAS,WAAW;CACxD,IAAI,CAAC,YACH,OAAO;CAGT,IACE,WAAW,IAAI,YAAY,WAC3B,YAAY,WAAW,GAAG,WAAW,OAAO,GAC5C;EACA,MAAM,MAAMA,SACV,WAAW,GAAG,WAAW,QAAQ,QAAQ,eAAe,EAAE,GAC1D,MACA,OAAO,eACT;EACA,OAAO,MACL;GACE,SAAS,IAAI;GACb,cAAc,IAAI;GAClB,eAAe,IAAI;EACrB,GACA,iCACF;EAEA,KAAK,KAAK;GAAE,GAAG;GAAK,oBAAoB;EAAsB,CAAC;CACjE;CAEA,IACE,WAAW,IAAI,YAAY,SAC3B,QAAQ,WAAW,GAAG,WAAW,KAAK,GAEjC;OAAA,MAAM,SAAS,WAAW,GAAG,WAAW,OAC3C,IAAI,iBAAiB,KAAK,KAAK,YAAY,MAAM,GAAG,GAAG;GACrD,MAAM,MAAMA,SACV,MAAM,IAAI,QAAQ,eAAe,EAAE,GACnC,MACA,OAAO,eACT;GACA,OAAO,MACL;IACE,SAAS,IAAI;IACb,cAAc,IAAI;IAClB,eAAe,IAAI;GACrB,GACA,wBACF;GAEA,KAAK,KAAK,GAAG;EACf,OAAO,IAAI,iBAAiB,KAAK,KAAK,uBAAuB,MAAM,GAAG,GAAG;GACvE,MAAM,MAAM,OAAO,MAAM,IAAI,QAAQ,2BAA2B,EAAE,CAAC;GACnE,IAAI,KACF,KAAK,KAAK,GAAG;EAEjB,OAAO,IAAI,kBAAkB,KAAK,GAAG;GACnC,MAAM,UAAU,MAAM;GAEtB,IAAI,SAAS;IACX,MAAM,MAAyB;KAC7B,YAAY,6BAA6B;KACzC,cAAc;KACd,aAAa,MAAM;IACrB;IACA,KAAK,KAAK,GAAG;GACf;EACF;;CAIJ,IAAI,CAAC,KAAK,QACR,OAAO;CAET,OAAO,EAAE,KAAK;AAChB;AAEA,SAAgB,OAAO,aAA+C;CACpE,IAAI,YAAY,SAAS,GAAG,GAAG;EAC7B,MAAM,MAAyB;GAC7B,YAAY,6BAA6B;GACzC,aAAa,YAAY,MAAM,GAAG,CAAC,CAAC;GACpC,2BACE;EACJ;EAEA,IAAI,eADY,YAAY,MAAM,GAAG,CAAC,CAAC;EAEvC,OAAO;CACT;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"extract.js","names":["getDockerDep"],"sources":["../../../../lib/modules/manager/buildpacks/extract.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { BuildpacksRegistryDatasource } from '../../datasource/buildpacks-registry/index.ts';\nimport { isVersion } from '../../versioning/semver/index.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport {\n type ProjectDescriptor,\n ProjectDescriptorToml,\n isBuildpackByName,\n isBuildpackByURI,\n} from './schema.ts';\n\nexport const DOCKER_PREFIX = regEx(/^docker:\\/?\\//);\nconst dockerRef = regEx(\n /^(?:(?:(?:[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?(?:\\.[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?)*)(?::\\d{2,5}\\/)?)?[a-z\\d]+(?:(?:\\.|_|__|-+)[a-z\\d]+)*(?:\\/[a-z\\d]+(?:(?:\\.|_|__|-+)[a-z\\d]+)*)*(?::(?:\\w[\\w.-]{0,127})(?:@sha256:[A-Fa-f\\d]{32,})?|@sha256:[A-Fa-f\\d]{32,}))$/,\n);\n\nexport function isDockerRef(ref: string): boolean {\n if (ref.startsWith('docker:/') || dockerRef.test(ref)) {\n return true;\n }\n return false;\n}\nexport const BUILDPACK_REGISTRY_PREFIX = 'urn:cnb:registry:';\nconst buildpackRegistryId = regEx(\n /^[a-z0-9\\-.]+\\/[a-z0-9\\-.]+(?:@(?<version>.+))?$/,\n);\n\nfunction isBuildpackRegistryId(ref: string): boolean {\n const bpRegistryMatch = buildpackRegistryId.exec(ref);\n if (!bpRegistryMatch) {\n return false;\n }\n if (!bpRegistryMatch.groups?.version) {\n return true;\n }\n return isVersion(bpRegistryMatch.groups.version);\n}\n\nexport function isBuildpackRegistryRef(ref: string): boolean {\n return (\n isBuildpackRegistryId(ref) || ref.startsWith(BUILDPACK_REGISTRY_PREFIX)\n );\n}\n\nfunction parseProjectToml(\n content: string,\n packageFile: string,\n): ProjectDescriptor | null {\n const res = ProjectDescriptorToml.safeParse(content);\n if (res.success) {\n return res.data;\n }\n\n logger.debug(\n { packageFile, err: res.error },\n 'Failed to parse buildpacks project descriptor TOML',\n );\n\n return null;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const deps: PackageDependency[] = [];\n\n const descriptor = parseProjectToml(content, packageFile);\n if (!descriptor) {\n return null;\n }\n\n if (\n descriptor.io?.buildpacks?.builder &&\n isDockerRef(descriptor.io.buildpacks.builder)\n ) {\n const dep = getDockerDep(\n descriptor.io.buildpacks.builder.replace(DOCKER_PREFIX, ''),\n { registryAliases: config.registryAliases },\n );\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Cloud Native Buildpacks builder',\n );\n\n deps.push({ ...dep, commitMessageTopic: 'builder {{depName}}' });\n }\n\n if (\n descriptor.io?.buildpacks?.group &&\n isArray(descriptor.io.buildpacks.group)\n ) {\n for (const group of descriptor.io.buildpacks.group) {\n if (isBuildpackByURI(group) && isDockerRef(group.uri)) {\n const dep = getDockerDep(group.uri.replace(DOCKER_PREFIX, ''), {\n registryAliases: config.registryAliases,\n });\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Cloud Native Buildpack',\n );\n\n deps.push(dep);\n } else if (isBuildpackByURI(group) && isBuildpackRegistryRef(group.uri)) {\n const dep = getDep(group.uri.replace(BUILDPACK_REGISTRY_PREFIX, ''));\n if (dep) {\n deps.push(dep);\n }\n } else if (isBuildpackByName(group)) {\n const version = group.version;\n\n if (version) {\n const dep: PackageDependency = {\n datasource: BuildpacksRegistryDatasource.id,\n currentValue: version,\n packageName: group.id,\n };\n deps.push(dep);\n }\n }\n }\n }\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n\nexport function getDep(currentFrom: string): PackageDependency | null {\n if (currentFrom.includes('@')) {\n const dep: PackageDependency = {\n datasource: BuildpacksRegistryDatasource.id,\n packageName: currentFrom.split('@')[0],\n autoReplaceStringTemplate:\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',\n };\n const version = currentFrom.split('@')[1];\n dep.currentValue = version;\n return dep;\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;AAkBA,MAAa,gBAAgB,MAAM,eAAe;AAClD,MAAM,YAAY,MAChB,kQACF;AAEA,SAAgB,YAAY,KAAsB;CAChD,IAAI,IAAI,WAAW,UAAU,KAAK,UAAU,KAAK,GAAG,GAClD,OAAO;CAET,OAAO;AACT;AACA,MAAa,4BAA4B;AACzC,MAAM,sBAAsB,MAC1B,kDACF;AAEA,SAAS,sBAAsB,KAAsB;CACnD,MAAM,kBAAkB,oBAAoB,KAAK,GAAG;CACpD,IAAI,CAAC,iBACH,OAAO;CAET,IAAI,CAAC,gBAAgB,QAAQ,SAC3B,OAAO;CAET,OAAO,UAAU,gBAAgB,OAAO,OAAO;AACjD;AAEA,SAAgB,uBAAuB,KAAsB;CAC3D,OACE,sBAAsB,GAAG,KAAK,IAAI,WAAA,mBAAoC;AAE1E;AAEA,SAAS,iBACP,SACA,aAC0B;CAC1B,MAAM,MAAM,sBAAsB,UAAU,OAAO;CACnD,IAAI,IAAI,SACN,OAAO,IAAI;CAGb,OAAO,MACL;EAAE;EAAa,KAAK,IAAI;CAAM,GAC9B,oDACF;CAEA,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,MAAM,OAA4B,CAAC;CAEnC,MAAM,aAAa,iBAAiB,SAAS,WAAW;CACxD,IAAI,CAAC,YACH,OAAO;CAGT,IACE,WAAW,IAAI,YAAY,WAC3B,YAAY,WAAW,GAAG,WAAW,OAAO,GAC5C;EACA,MAAM,MAAMA,SACV,WAAW,GAAG,WAAW,QAAQ,QAAQ,eAAe,EAAE,GAC1D,EAAE,iBAAiB,OAAO,gBAAgB,CAC5C;EACA,OAAO,MACL;GACE,SAAS,IAAI;GACb,cAAc,IAAI;GAClB,eAAe,IAAI;EACrB,GACA,iCACF;EAEA,KAAK,KAAK;GAAE,GAAG;GAAK,oBAAoB;EAAsB,CAAC;CACjE;CAEA,IACE,WAAW,IAAI,YAAY,SAC3B,QAAQ,WAAW,GAAG,WAAW,KAAK,GAEjC;OAAA,MAAM,SAAS,WAAW,GAAG,WAAW,OAC3C,IAAI,iBAAiB,KAAK,KAAK,YAAY,MAAM,GAAG,GAAG;GACrD,MAAM,MAAMA,SAAa,MAAM,IAAI,QAAQ,eAAe,EAAE,GAAG,EAC7D,iBAAiB,OAAO,gBAC1B,CAAC;GACD,OAAO,MACL;IACE,SAAS,IAAI;IACb,cAAc,IAAI;IAClB,eAAe,IAAI;GACrB,GACA,wBACF;GAEA,KAAK,KAAK,GAAG;EACf,OAAO,IAAI,iBAAiB,KAAK,KAAK,uBAAuB,MAAM,GAAG,GAAG;GACvE,MAAM,MAAM,OAAO,MAAM,IAAI,QAAQ,2BAA2B,EAAE,CAAC;GACnE,IAAI,KACF,KAAK,KAAK,GAAG;EAEjB,OAAO,IAAI,kBAAkB,KAAK,GAAG;GACnC,MAAM,UAAU,MAAM;GAEtB,IAAI,SAAS;IACX,MAAM,MAAyB;KAC7B,YAAY,6BAA6B;KACzC,cAAc;KACd,aAAa,MAAM;IACrB;IACA,KAAK,KAAK,GAAG;GACf;EACF;;CAIJ,IAAI,CAAC,KAAK,QACR,OAAO;CAET,OAAO,EAAE,KAAK;AAChB;AAEA,SAAgB,OAAO,aAA+C;CACpE,IAAI,YAAY,SAAS,GAAG,GAAG;EAC7B,MAAM,MAAyB;GAC7B,YAAY,6BAA6B;GACzC,aAAa,YAAY,MAAM,GAAG,CAAC,CAAC;GACpC,2BACE;EACJ;EAEA,IAAI,eADY,YAAY,MAAM,GAAG,CAAC,CAAC;EAEvC,OAAO;CACT;CAEA,OAAO;AACT"}
@@ -21,10 +21,10 @@ function extractDefinition(deps, definition, registryAliases) {
21
21
  });
22
22
  } else extractDefinition(deps, orb, registryAliases);
23
23
  const environments = [...definition.executors, ...definition.jobs];
24
- for (const dockerImage of environments) deps.push({
25
- ...getDep(dockerImage, true, registryAliases),
24
+ for (const dockerImage of environments) deps.push(getDep(dockerImage, {
25
+ registryAliases,
26
26
  depType: "docker"
27
- });
27
+ }));
28
28
  }
29
29
  function extractPackageFile(content, packageFile, config) {
30
30
  const { val: parsed, err } = Result.wrap(() => CircleCiFile.parse(parseSingleYaml(content, { version: "1.1" }))).unwrap();
@@ -38,10 +38,10 @@ function extractPackageFile(content, packageFile, config) {
38
38
  const registryAliases = coerceObject(config?.registryAliases);
39
39
  const deps = [];
40
40
  extractDefinition(deps, parsed, registryAliases);
41
- for (const alias of parsed.aliases) deps.push({
42
- ...getDep(alias, true, registryAliases),
41
+ for (const alias of parsed.aliases) deps.push(getDep(alias, {
42
+ registryAliases,
43
43
  depType: "docker"
44
- });
44
+ }));
45
45
  if (!deps.length) return null;
46
46
  return { deps };
47
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/circleci/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { Result } from '../../../util/result.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { OrbDatasource } from '../../datasource/orb/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { CircleCiFile, type CircleCiOrb } from './schema.ts';\n\nfunction extractDefinition(\n deps: PackageDependency[],\n definition: CircleCiOrb | CircleCiFile,\n registryAliases: Record<string, string>,\n): void {\n for (const [key, orb] of Object.entries(definition.orbs)) {\n if (isString(orb)) {\n const [packageName, currentValue] = orb.split('@');\n\n deps.push({\n depName: key,\n packageName,\n depType: 'orb',\n currentValue,\n versioning: npmVersioning.id,\n datasource: OrbDatasource.id,\n });\n } else {\n extractDefinition(deps, orb, registryAliases);\n }\n }\n\n // extract environments\n const environments = [...definition.executors, ...definition.jobs];\n for (const dockerImage of environments) {\n deps.push({\n ...getDep(dockerImage, true, registryAliases),\n depType: 'docker',\n });\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile?: string,\n config?: ExtractConfig,\n): PackageFileContent | null {\n const { val: parsed, err } = Result.wrap(() =>\n // Parse as YAML 1.1 so anchor merge keys (`<<`) work, matching CircleCI's\n // own behavior. Under YAML 1.2 a mapping with multiple `<<` keys is\n // rejected as a duplicate key, which causes the whole file to be skipped.\n CircleCiFile.parse(parseSingleYaml(content, { version: '1.1' })),\n ).unwrap();\n\n if (err) {\n logger.debug({ err, packageFile }, 'Error extracting circleci images');\n return null;\n }\n\n const registryAliases = coerceObject(config?.registryAliases);\n const deps: PackageDependency[] = [];\n extractDefinition(deps, parsed, registryAliases);\n\n for (const alias of parsed.aliases) {\n deps.push({\n ...getDep(alias, true, registryAliases),\n depType: 'docker',\n });\n }\n\n if (!deps.length) {\n return null;\n }\n\n return { deps };\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAS,kBACP,MACA,YACA,iBACM;CACN,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,WAAW,IAAI,GACrD,IAAI,SAAS,GAAG,GAAG;EACjB,MAAM,CAAC,aAAa,gBAAgB,IAAI,MAAM,GAAG;EAEjD,KAAK,KAAK;GACR,SAAS;GACT;GACA,SAAS;GACT;GACA,YAAY;GACZ,YAAY,cAAc;EAC5B,CAAC;CACH,OACE,kBAAkB,MAAM,KAAK,eAAe;CAKhD,MAAM,eAAe,CAAC,GAAG,WAAW,WAAW,GAAG,WAAW,IAAI;CACjE,KAAK,MAAM,eAAe,cACxB,KAAK,KAAK;EACR,GAAG,OAAO,aAAa,MAAM,eAAe;EAC5C,SAAS;CACX,CAAC;AAEL;AAEA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,MAAM,EAAE,KAAK,QAAQ,QAAQ,OAAO,WAIlC,aAAa,MAAM,gBAAgB,SAAS,EAAE,SAAS,MAAM,CAAC,CAAC,CACjE,CAAC,CAAC,OAAO;CAET,IAAI,KAAK;EACP,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,kCAAkC;EACrE,OAAO;CACT;CAEA,MAAM,kBAAkB,aAAa,QAAQ,eAAe;CAC5D,MAAM,OAA4B,CAAC;CACnC,kBAAkB,MAAM,QAAQ,eAAe;CAE/C,KAAK,MAAM,SAAS,OAAO,SACzB,KAAK,KAAK;EACR,GAAG,OAAO,OAAO,MAAM,eAAe;EACtC,SAAS;CACX,CAAC;CAGH,IAAI,CAAC,KAAK,QACR,OAAO;CAGT,OAAO,EAAE,KAAK;AAChB"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/circleci/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { Result } from '../../../util/result.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { OrbDatasource } from '../../datasource/orb/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { CircleCiFile, type CircleCiOrb } from './schema.ts';\n\nfunction extractDefinition(\n deps: PackageDependency[],\n definition: CircleCiOrb | CircleCiFile,\n registryAliases: Record<string, string>,\n): void {\n for (const [key, orb] of Object.entries(definition.orbs)) {\n if (isString(orb)) {\n const [packageName, currentValue] = orb.split('@');\n\n deps.push({\n depName: key,\n packageName,\n depType: 'orb',\n currentValue,\n versioning: npmVersioning.id,\n datasource: OrbDatasource.id,\n });\n } else {\n extractDefinition(deps, orb, registryAliases);\n }\n }\n\n // extract environments\n const environments = [...definition.executors, ...definition.jobs];\n for (const dockerImage of environments) {\n deps.push(getDep(dockerImage, { registryAliases, depType: 'docker' }));\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile?: string,\n config?: ExtractConfig,\n): PackageFileContent | null {\n const { val: parsed, err } = Result.wrap(() =>\n // Parse as YAML 1.1 so anchor merge keys (`<<`) work, matching CircleCI's\n // own behavior. Under YAML 1.2 a mapping with multiple `<<` keys is\n // rejected as a duplicate key, which causes the whole file to be skipped.\n CircleCiFile.parse(parseSingleYaml(content, { version: '1.1' })),\n ).unwrap();\n\n if (err) {\n logger.debug({ err, packageFile }, 'Error extracting circleci images');\n return null;\n }\n\n const registryAliases = coerceObject(config?.registryAliases);\n const deps: PackageDependency[] = [];\n extractDefinition(deps, parsed, registryAliases);\n\n for (const alias of parsed.aliases) {\n deps.push(getDep(alias, { registryAliases, depType: 'docker' }));\n }\n\n if (!deps.length) {\n return null;\n }\n\n return { deps };\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAS,kBACP,MACA,YACA,iBACM;CACN,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,WAAW,IAAI,GACrD,IAAI,SAAS,GAAG,GAAG;EACjB,MAAM,CAAC,aAAa,gBAAgB,IAAI,MAAM,GAAG;EAEjD,KAAK,KAAK;GACR,SAAS;GACT;GACA,SAAS;GACT;GACA,YAAY;GACZ,YAAY,cAAc;EAC5B,CAAC;CACH,OACE,kBAAkB,MAAM,KAAK,eAAe;CAKhD,MAAM,eAAe,CAAC,GAAG,WAAW,WAAW,GAAG,WAAW,IAAI;CACjE,KAAK,MAAM,eAAe,cACxB,KAAK,KAAK,OAAO,aAAa;EAAE;EAAiB,SAAS;CAAS,CAAC,CAAC;AAEzE;AAEA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,MAAM,EAAE,KAAK,QAAQ,QAAQ,OAAO,WAIlC,aAAa,MAAM,gBAAgB,SAAS,EAAE,SAAS,MAAM,CAAC,CAAC,CACjE,CAAC,CAAC,OAAO;CAET,IAAI,KAAK;EACP,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,kCAAkC;EACrE,OAAO;CACT;CAEA,MAAM,kBAAkB,aAAa,QAAQ,eAAe;CAC5D,MAAM,OAA4B,CAAC;CACnC,kBAAkB,MAAM,QAAQ,eAAe;CAE/C,KAAK,MAAM,SAAS,OAAO,SACzB,KAAK,KAAK,OAAO,OAAO;EAAE;EAAiB,SAAS;CAAS,CAAC,CAAC;CAGjE,IAAI,CAAC,KAAK,QACR,OAAO;CAGT,OAAO,EAAE,KAAK;AAChB"}
@@ -15,7 +15,7 @@ function extractPackageFile(content, packageFile, extractConfig) {
15
15
  });
16
16
  const deps = [];
17
17
  for (const xpkg of list) {
18
- const dep = getDep(xpkg.spec.package, true, extractConfig?.registryAliases);
18
+ const dep = getDep(xpkg.spec.package, { registryAliases: extractConfig?.registryAliases });
19
19
  dep.depType = xpkg.kind.toLowerCase();
20
20
  deps.push(dep);
21
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/crossplane/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { XPKG } from './schema.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig?: ExtractConfig,\n): PackageFileContent | null {\n // avoid parsing the whole file if it doesn't contain any resource having any pkg.crossplane.io/v*\n if (\n !regEx(/apiVersion:\\s+[\"']?pkg\\.crossplane\\.io\\/v.+[\"']?/).test(content)\n ) {\n logger.trace({ packageFile }, 'No Crossplane package found in file.');\n return null;\n }\n\n // not try and catching this as failureBehaviour is set to filter and therefore it will not throw\n const list = parseYaml(content, {\n customSchema: XPKG,\n failureBehaviour: 'filter',\n });\n\n const deps: PackageDependency[] = [];\n for (const xpkg of list) {\n const dep = getDep(xpkg.spec.package, true, extractConfig?.registryAliases);\n dep.depType = xpkg.kind.toLowerCase();\n deps.push(dep);\n }\n\n return deps.length ? { deps } : null;\n}\n"],"mappings":";;;;;;AAWA,SAAgB,mBACd,SACA,aACA,eAC2B;CAE3B,IACE,CAAC,MAAM,kDAAkD,CAAC,CAAC,KAAK,OAAO,GACvE;EACA,OAAO,MAAM,EAAE,YAAY,GAAG,sCAAsC;EACpE,OAAO;CACT;CAGA,MAAM,OAAO,UAAU,SAAS;EAC9B,cAAc;EACd,kBAAkB;CACpB,CAAC;CAED,MAAM,OAA4B,CAAC;CACnC,KAAK,MAAM,QAAQ,MAAM;EACvB,MAAM,MAAM,OAAO,KAAK,KAAK,SAAS,MAAM,eAAe,eAAe;EAC1E,IAAI,UAAU,KAAK,KAAK,YAAY;EACpC,KAAK,KAAK,GAAG;CACf;CAEA,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/crossplane/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { XPKG } from './schema.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig?: ExtractConfig,\n): PackageFileContent | null {\n // avoid parsing the whole file if it doesn't contain any resource having any pkg.crossplane.io/v*\n if (\n !regEx(/apiVersion:\\s+[\"']?pkg\\.crossplane\\.io\\/v.+[\"']?/).test(content)\n ) {\n logger.trace({ packageFile }, 'No Crossplane package found in file.');\n return null;\n }\n\n // not try and catching this as failureBehaviour is set to filter and therefore it will not throw\n const list = parseYaml(content, {\n customSchema: XPKG,\n failureBehaviour: 'filter',\n });\n\n const deps: PackageDependency[] = [];\n for (const xpkg of list) {\n const dep = getDep(xpkg.spec.package, {\n registryAliases: extractConfig?.registryAliases,\n });\n dep.depType = xpkg.kind.toLowerCase();\n deps.push(dep);\n }\n\n return deps.length ? { deps } : null;\n}\n"],"mappings":";;;;;;AAWA,SAAgB,mBACd,SACA,aACA,eAC2B;CAE3B,IACE,CAAC,MAAM,kDAAkD,CAAC,CAAC,KAAK,OAAO,GACvE;EACA,OAAO,MAAM,EAAE,YAAY,GAAG,sCAAsC;EACpE,OAAO;CACT;CAGA,MAAM,OAAO,UAAU,SAAS;EAC9B,cAAc;EACd,kBAAkB;CACpB,CAAC;CAED,MAAM,OAA4B,CAAC;CACnC,KAAK,MAAM,QAAQ,MAAM;EACvB,MAAM,MAAM,OAAO,KAAK,KAAK,SAAS,EACpC,iBAAiB,eAAe,gBAClC,CAAC;EACD,IAAI,UAAU,KAAK,KAAK,YAAY;EACpC,KAAK,KAAK,GAAG;CACf;CAEA,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC"}
@@ -31,7 +31,7 @@ function extractPackageFile(content, packageFile, extractConfig) {
31
31
  }
32
32
  const deps = pipelineKeys.flatMap((pipelineKey) => {
33
33
  const pipelineValue = config[pipelineKey];
34
- return (Array.isArray(pipelineValue) ? pipelineValue : Object.values(coerceObject(pipelineValue))).filter((step) => isString(step?.image)).map((step) => getDep(step.image, true, extractConfig.registryAliases));
34
+ return (Array.isArray(pipelineValue) ? pipelineValue : Object.values(coerceObject(pipelineValue))).filter((step) => isString(step?.image)).map((step) => getDep(step.image, { registryAliases: extractConfig.registryAliases }));
35
35
  });
36
36
  logger.trace({ deps }, "Crow Configuration image");
37
37
  return deps.length ? { deps } : null;
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/crow/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type { ExtractConfig, PackageFileContent } from '../types.ts';\nimport { CrowConfig } from './schema.ts';\n\nfunction crowVersionDecider(config: CrowConfig): (keyof CrowConfig)[] {\n const keys = ['clone', 'steps', 'pipeline', 'services'];\n return Object.keys(config).filter((key) =>\n keys.includes(key),\n ) as (keyof CrowConfig)[];\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig: ExtractConfig,\n): PackageFileContent | null {\n logger.debug('crow .extractPackageFile()');\n const result = CrowConfig.safeParse(content);\n if (!result.success) {\n logger.debug(\n { packageFile, err: result.error },\n 'Invalid Crow Configuration schema',\n );\n return null;\n }\n\n const config = result.data;\n const pipelineKeys = crowVersionDecider(config);\n\n if (pipelineKeys.length === 0) {\n logger.debug({ packageFile }, \"Couldn't identify dependencies\");\n return null;\n }\n\n // Image name/tags for services are only eligible for update if they don't\n // use variables and if the image is not built locally\n const deps = pipelineKeys.flatMap((pipelineKey) => {\n const pipelineValue = config[pipelineKey];\n // Handle both object and array formats\n const steps = Array.isArray(pipelineValue)\n ? pipelineValue\n : Object.values(coerceObject(pipelineValue));\n return steps\n .filter((step) => isString(step?.image))\n .map((step) => getDep(step.image, true, extractConfig.registryAliases));\n });\n\n logger.trace({ deps }, 'Crow Configuration image');\n return deps.length ? { deps } : null;\n}\n"],"mappings":";;;;;;AAOA,SAAS,mBAAmB,QAA0C;CACpE,MAAM,OAAO;EAAC;EAAS;EAAS;EAAY;CAAU;CACtD,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,QAAQ,QACjC,KAAK,SAAS,GAAG,CACnB;AACF;AAEA,SAAgB,mBACd,SACA,aACA,eAC2B;CAC3B,OAAO,MAAM,6BAA6B;CAC1C,MAAM,SAAS,WAAW,UAAU,OAAO;CAC3C,IAAI,CAAC,OAAO,SAAS;EACnB,OAAO,MACL;GAAE;GAAa,KAAK,OAAO;EAAM,GACjC,mCACF;EACA,OAAO;CACT;CAEA,MAAM,SAAS,OAAO;CACtB,MAAM,eAAe,mBAAmB,MAAM;CAE9C,IAAI,aAAa,WAAW,GAAG;EAC7B,OAAO,MAAM,EAAE,YAAY,GAAG,gCAAgC;EAC9D,OAAO;CACT;CAIA,MAAM,OAAO,aAAa,SAAS,gBAAgB;EACjD,MAAM,gBAAgB,OAAO;EAK7B,QAHc,MAAM,QAAQ,aAAa,IACrC,gBACA,OAAO,OAAO,aAAa,aAAa,CAAC,EAAA,CAE1C,QAAQ,SAAS,SAAS,MAAM,KAAK,CAAC,CAAC,CACvC,KAAK,SAAS,OAAO,KAAK,OAAO,MAAM,cAAc,eAAe,CAAC;CAC1E,CAAC;CAED,OAAO,MAAM,EAAE,KAAK,GAAG,0BAA0B;CACjD,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/crow/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type { ExtractConfig, PackageFileContent } from '../types.ts';\nimport { CrowConfig } from './schema.ts';\n\nfunction crowVersionDecider(config: CrowConfig): (keyof CrowConfig)[] {\n const keys = ['clone', 'steps', 'pipeline', 'services'];\n return Object.keys(config).filter((key) =>\n keys.includes(key),\n ) as (keyof CrowConfig)[];\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig: ExtractConfig,\n): PackageFileContent | null {\n logger.debug('crow .extractPackageFile()');\n const result = CrowConfig.safeParse(content);\n if (!result.success) {\n logger.debug(\n { packageFile, err: result.error },\n 'Invalid Crow Configuration schema',\n );\n return null;\n }\n\n const config = result.data;\n const pipelineKeys = crowVersionDecider(config);\n\n if (pipelineKeys.length === 0) {\n logger.debug({ packageFile }, \"Couldn't identify dependencies\");\n return null;\n }\n\n // Image name/tags for services are only eligible for update if they don't\n // use variables and if the image is not built locally\n const deps = pipelineKeys.flatMap((pipelineKey) => {\n const pipelineValue = config[pipelineKey];\n // Handle both object and array formats\n const steps = Array.isArray(pipelineValue)\n ? pipelineValue\n : Object.values(coerceObject(pipelineValue));\n return steps\n .filter((step) => isString(step?.image))\n .map((step) =>\n getDep(step.image, { registryAliases: extractConfig.registryAliases }),\n );\n });\n\n logger.trace({ deps }, 'Crow Configuration image');\n return deps.length ? { deps } : null;\n}\n"],"mappings":";;;;;;AAOA,SAAS,mBAAmB,QAA0C;CACpE,MAAM,OAAO;EAAC;EAAS;EAAS;EAAY;CAAU;CACtD,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,QAAQ,QACjC,KAAK,SAAS,GAAG,CACnB;AACF;AAEA,SAAgB,mBACd,SACA,aACA,eAC2B;CAC3B,OAAO,MAAM,6BAA6B;CAC1C,MAAM,SAAS,WAAW,UAAU,OAAO;CAC3C,IAAI,CAAC,OAAO,SAAS;EACnB,OAAO,MACL;GAAE;GAAa,KAAK,OAAO;EAAM,GACjC,mCACF;EACA,OAAO;CACT;CAEA,MAAM,SAAS,OAAO;CACtB,MAAM,eAAe,mBAAmB,MAAM;CAE9C,IAAI,aAAa,WAAW,GAAG;EAC7B,OAAO,MAAM,EAAE,YAAY,GAAG,gCAAgC;EAC9D,OAAO;CACT;CAIA,MAAM,OAAO,aAAa,SAAS,gBAAgB;EACjD,MAAM,gBAAgB,OAAO;EAK7B,QAHc,MAAM,QAAQ,aAAa,IACrC,gBACA,OAAO,OAAO,aAAa,aAAa,CAAC,EAAA,CAE1C,QAAQ,SAAS,SAAS,MAAM,KAAK,CAAC,CAAC,CACvC,KAAK,SACJ,OAAO,KAAK,OAAO,EAAE,iBAAiB,cAAc,gBAAgB,CAAC,CACvE;CACJ,CAAC;CAED,OAAO,MAAM,EAAE,KAAK,GAAG,0BAA0B;CACjD,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC"}
@@ -79,7 +79,7 @@ function extractPackageFile(content, packageFile, extractConfig) {
79
79
  }
80
80
  function getDep(subject, packageFile, registryAliases) {
81
81
  if (!subject) return null;
82
- const dep = getDep$1(subject, true, registryAliases);
82
+ const dep = getDep$1(subject, { registryAliases });
83
83
  if (!isValidDependency(dep)) {
84
84
  logger.trace({
85
85
  subject,
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["getDockerDep"],"sources":["../../../../lib/modules/manager/devcontainer/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { GolangVersionDatasource } from '../../datasource/golang-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { PythonVersionDatasource } from '../../datasource/python-version/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { isValidDependency } from '../custom/utils.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { DevContainerFile } from './schema.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig: ExtractConfig,\n): PackageFileContent | null {\n try {\n const file = DevContainerFile.parse(content);\n const deps: PackageDependency[] = [];\n\n const image = file?.image ?? null;\n const imageDep = getDep(image, packageFile, extractConfig.registryAliases);\n\n if (imageDep) {\n imageDep.depType = 'image';\n deps.push(imageDep);\n } else {\n logger.trace(\n { packageFile },\n 'No image defined in dev container JSON file.',\n );\n }\n\n const features = file.features;\n\n if (features) {\n for (const [feature, value] of Object.entries(features)) {\n const featureDep = getDep(\n feature,\n packageFile,\n extractConfig.registryAliases,\n );\n if (featureDep) {\n featureDep.depType = 'feature';\n featureDep.pinDigests = false;\n deps.push(featureDep);\n\n let dep: PackageDependency;\n switch (featureDep.depName) {\n case 'ghcr.io/devcontainers/features/node':\n dep = {\n depName: 'node',\n datasource: NodeVersionDatasource.id,\n currentValue: value.version,\n };\n break;\n case 'ghcr.io/devcontainers/features/go':\n dep = {\n depName: 'go',\n datasource: GolangVersionDatasource.id,\n currentValue: value.version,\n };\n break;\n case 'ghcr.io/devcontainers/features/python':\n dep = {\n depName: 'python',\n datasource: PythonVersionDatasource.id,\n currentValue: value.version,\n };\n break;\n case 'ghcr.io/devcontainers/features/ruby':\n dep = {\n depName: 'ruby',\n datasource: RubyVersionDatasource.id,\n currentValue: value.version,\n };\n break;\n default:\n // skip additional checks if not a known feature\n continue;\n }\n if (!value.version) {\n dep.skipReason = 'unspecified-version';\n }\n deps.push(dep);\n continue;\n }\n logger.trace(\n { feature, packageFile },\n 'Skipping invalid dependency in dev container JSON file.',\n );\n }\n }\n\n if (deps.length < 1) {\n logger.trace(\n { packageFile },\n 'No dependencies to process for dev container JSON file.',\n );\n return null;\n }\n\n return { deps };\n } catch (err) {\n logger.debug(\n { err, packageFile },\n 'Error extracting dev container JSON file.',\n );\n return null;\n }\n}\n\nfunction getDep(\n subject: string | null,\n packageFile: string,\n registryAliases?: Record<string, string>,\n): PackageDependency | null {\n if (!subject) {\n return null;\n }\n const dep = getDockerDep(subject, true, registryAliases);\n if (!isValidDependency(dep)) {\n logger.trace(\n { subject, packageFile },\n 'Skipping invalid docker dependency in dev container JSON file.',\n );\n return null;\n }\n return dep;\n}\n"],"mappings":";;;;;;;;;AAcA,SAAgB,mBACd,SACA,aACA,eAC2B;CAC3B,IAAI;EACF,MAAM,OAAO,iBAAiB,MAAM,OAAO;EAC3C,MAAM,OAA4B,CAAC;EAGnC,MAAM,WAAW,OADH,MAAM,SAAS,MACE,aAAa,cAAc,eAAe;EAEzE,IAAI,UAAU;GACZ,SAAS,UAAU;GACnB,KAAK,KAAK,QAAQ;EACpB,OACE,OAAO,MACL,EAAE,YAAY,GACd,8CACF;EAGF,MAAM,WAAW,KAAK;EAEtB,IAAI,UACF,KAAK,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,QAAQ,GAAG;GACvD,MAAM,aAAa,OACjB,SACA,aACA,cAAc,eAChB;GACA,IAAI,YAAY;IACd,WAAW,UAAU;IACrB,WAAW,aAAa;IACxB,KAAK,KAAK,UAAU;IAEpB,IAAI;IACJ,QAAQ,WAAW,SAAnB;KACE,KAAK;MACH,MAAM;OACJ,SAAS;OACT,YAAY,sBAAsB;OAClC,cAAc,MAAM;MACtB;MACA;KACF,KAAK;MACH,MAAM;OACJ,SAAS;OACT,YAAY,wBAAwB;OACpC,cAAc,MAAM;MACtB;MACA;KACF,KAAK;MACH,MAAM;OACJ,SAAS;OACT,YAAY,wBAAwB;OACpC,cAAc,MAAM;MACtB;MACA;KACF,KAAK;MACH,MAAM;OACJ,SAAS;OACT,YAAY,sBAAsB;OAClC,cAAc,MAAM;MACtB;MACA;KACF,SAEE;IACJ;IACA,IAAI,CAAC,MAAM,SACT,IAAI,aAAa;IAEnB,KAAK,KAAK,GAAG;IACb;GACF;GACA,OAAO,MACL;IAAE;IAAS;GAAY,GACvB,yDACF;EACF;EAGF,IAAI,KAAK,SAAS,GAAG;GACnB,OAAO,MACL,EAAE,YAAY,GACd,yDACF;GACA,OAAO;EACT;EAEA,OAAO,EAAE,KAAK;CAChB,SAAS,KAAK;EACZ,OAAO,MACL;GAAE;GAAK;EAAY,GACnB,2CACF;EACA,OAAO;CACT;AACF;AAEA,SAAS,OACP,SACA,aACA,iBAC0B;CAC1B,IAAI,CAAC,SACH,OAAO;CAET,MAAM,MAAMA,SAAa,SAAS,MAAM,eAAe;CACvD,IAAI,CAAC,kBAAkB,GAAG,GAAG;EAC3B,OAAO,MACL;GAAE;GAAS;EAAY,GACvB,gEACF;EACA,OAAO;CACT;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"extract.js","names":["getDockerDep"],"sources":["../../../../lib/modules/manager/devcontainer/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { GolangVersionDatasource } from '../../datasource/golang-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { PythonVersionDatasource } from '../../datasource/python-version/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { isValidDependency } from '../custom/utils.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { DevContainerFile } from './schema.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig: ExtractConfig,\n): PackageFileContent | null {\n try {\n const file = DevContainerFile.parse(content);\n const deps: PackageDependency[] = [];\n\n const image = file?.image ?? null;\n const imageDep = getDep(image, packageFile, extractConfig.registryAliases);\n\n if (imageDep) {\n imageDep.depType = 'image';\n deps.push(imageDep);\n } else {\n logger.trace(\n { packageFile },\n 'No image defined in dev container JSON file.',\n );\n }\n\n const features = file.features;\n\n if (features) {\n for (const [feature, value] of Object.entries(features)) {\n const featureDep = getDep(\n feature,\n packageFile,\n extractConfig.registryAliases,\n );\n if (featureDep) {\n featureDep.depType = 'feature';\n featureDep.pinDigests = false;\n deps.push(featureDep);\n\n let dep: PackageDependency;\n switch (featureDep.depName) {\n case 'ghcr.io/devcontainers/features/node':\n dep = {\n depName: 'node',\n datasource: NodeVersionDatasource.id,\n currentValue: value.version,\n };\n break;\n case 'ghcr.io/devcontainers/features/go':\n dep = {\n depName: 'go',\n datasource: GolangVersionDatasource.id,\n currentValue: value.version,\n };\n break;\n case 'ghcr.io/devcontainers/features/python':\n dep = {\n depName: 'python',\n datasource: PythonVersionDatasource.id,\n currentValue: value.version,\n };\n break;\n case 'ghcr.io/devcontainers/features/ruby':\n dep = {\n depName: 'ruby',\n datasource: RubyVersionDatasource.id,\n currentValue: value.version,\n };\n break;\n default:\n // skip additional checks if not a known feature\n continue;\n }\n if (!value.version) {\n dep.skipReason = 'unspecified-version';\n }\n deps.push(dep);\n continue;\n }\n logger.trace(\n { feature, packageFile },\n 'Skipping invalid dependency in dev container JSON file.',\n );\n }\n }\n\n if (deps.length < 1) {\n logger.trace(\n { packageFile },\n 'No dependencies to process for dev container JSON file.',\n );\n return null;\n }\n\n return { deps };\n } catch (err) {\n logger.debug(\n { err, packageFile },\n 'Error extracting dev container JSON file.',\n );\n return null;\n }\n}\n\nfunction getDep(\n subject: string | null,\n packageFile: string,\n registryAliases?: Record<string, string>,\n): PackageDependency | null {\n if (!subject) {\n return null;\n }\n const dep = getDockerDep(subject, { registryAliases });\n if (!isValidDependency(dep)) {\n logger.trace(\n { subject, packageFile },\n 'Skipping invalid docker dependency in dev container JSON file.',\n );\n return null;\n }\n return dep;\n}\n"],"mappings":";;;;;;;;;AAcA,SAAgB,mBACd,SACA,aACA,eAC2B;CAC3B,IAAI;EACF,MAAM,OAAO,iBAAiB,MAAM,OAAO;EAC3C,MAAM,OAA4B,CAAC;EAGnC,MAAM,WAAW,OADH,MAAM,SAAS,MACE,aAAa,cAAc,eAAe;EAEzE,IAAI,UAAU;GACZ,SAAS,UAAU;GACnB,KAAK,KAAK,QAAQ;EACpB,OACE,OAAO,MACL,EAAE,YAAY,GACd,8CACF;EAGF,MAAM,WAAW,KAAK;EAEtB,IAAI,UACF,KAAK,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,QAAQ,GAAG;GACvD,MAAM,aAAa,OACjB,SACA,aACA,cAAc,eAChB;GACA,IAAI,YAAY;IACd,WAAW,UAAU;IACrB,WAAW,aAAa;IACxB,KAAK,KAAK,UAAU;IAEpB,IAAI;IACJ,QAAQ,WAAW,SAAnB;KACE,KAAK;MACH,MAAM;OACJ,SAAS;OACT,YAAY,sBAAsB;OAClC,cAAc,MAAM;MACtB;MACA;KACF,KAAK;MACH,MAAM;OACJ,SAAS;OACT,YAAY,wBAAwB;OACpC,cAAc,MAAM;MACtB;MACA;KACF,KAAK;MACH,MAAM;OACJ,SAAS;OACT,YAAY,wBAAwB;OACpC,cAAc,MAAM;MACtB;MACA;KACF,KAAK;MACH,MAAM;OACJ,SAAS;OACT,YAAY,sBAAsB;OAClC,cAAc,MAAM;MACtB;MACA;KACF,SAEE;IACJ;IACA,IAAI,CAAC,MAAM,SACT,IAAI,aAAa;IAEnB,KAAK,KAAK,GAAG;IACb;GACF;GACA,OAAO,MACL;IAAE;IAAS;GAAY,GACvB,yDACF;EACF;EAGF,IAAI,KAAK,SAAS,GAAG;GACnB,OAAO,MACL,EAAE,YAAY,GACd,yDACF;GACA,OAAO;EACT;EAEA,OAAO,EAAE,KAAK;CAChB,SAAS,KAAK;EACZ,OAAO,MACL;GAAE;GAAK;EAAY,GACnB,2CACF;EACA,OAAO;CACT;AACF;AAEA,SAAS,OACP,SACA,aACA,iBAC0B;CAC1B,IAAI,CAAC,SACH,OAAO;CAET,MAAM,MAAMA,SAAa,SAAS,EAAE,gBAAgB,CAAC;CACrD,IAAI,CAAC,kBAAkB,GAAG,GAAG;EAC3B,OAAO,MACL;GAAE;GAAS;EAAY,GACvB,gEACF;EACA,OAAO;CACT;CACA,OAAO;AACT"}
@@ -43,7 +43,7 @@ function extractPackageFile(content, packageFile, extractConfig) {
43
43
  const services = config.services ?? config;
44
44
  const extensions = coerceObject(config.extensions);
45
45
  const deps = Object.values(services).concat(Object.values(extensions)).filter((service) => isString(service?.image) && !service?.build).map((service) => {
46
- const dep = getDep(service.image, true, extractConfig.registryAliases);
46
+ const dep = getDep(service.image, { registryAliases: extractConfig.registryAliases });
47
47
  // istanbul ignore if
48
48
  if (!lineMapper.pluckLineNumber(service.image)) return null;
49
49
  return dep;
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/docker-compose/extract.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type { ExtractConfig, PackageFileContent } from '../types.ts';\nimport { DockerComposeFile } from './schema.ts';\n\nclass LineMapper {\n private imageLines: { line: string; lineNumber: number; used: boolean }[];\n\n constructor(content: string, filter: RegExp) {\n this.imageLines = [...content.split(newlineRegex).entries()]\n .filter((entry) => filter.test(entry[1]))\n .map(([lineNumber, line]) => ({ lineNumber, line, used: false }));\n }\n\n pluckLineNumber(imageName: string | undefined): number | null {\n const lineMeta = this.imageLines.find(\n ({ line, used }) => !used && imageName && line.includes(imageName),\n );\n // istanbul ignore if\n if (!lineMeta) {\n return null;\n }\n lineMeta.used = true; // unset plucked lines so duplicates are skipped\n return lineMeta.lineNumber;\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig: ExtractConfig,\n): PackageFileContent | null {\n logger.debug(`docker-compose.extractPackageFile(${packageFile})`);\n let config: DockerComposeFile;\n try {\n config = parseSingleYaml(content, {\n customSchema: DockerComposeFile,\n removeTemplates: true,\n });\n } catch (err) {\n logger.debug(\n { err, packageFile },\n `Parsing Docker Compose config YAML failed`,\n );\n return null;\n }\n try {\n const lineMapper = new LineMapper(content, regEx(/^\\s*image:/));\n\n // docker-compose v1 places the services at the top level,\n // docker-compose v2+ places the services within a 'services' key\n // since docker-compose spec version 1.27, the 'version' key has\n // become optional and can no longer be used to differentiate\n // between v1 and v2.\n const services = config.services ?? config;\n const extensions = coerceObject(config.extensions);\n\n // Image name/tags for services are only eligible for update if they don't\n // use variables and if the image is not built locally\n const deps = Object.values(services)\n .concat(Object.values(extensions))\n .filter((service) => isString(service?.image) && !service?.build)\n .map((service) => {\n const dep = getDep(service.image, true, extractConfig.registryAliases);\n const lineNumber = lineMapper.pluckLineNumber(service.image);\n // istanbul ignore if\n if (!lineNumber) {\n return null;\n }\n return dep;\n })\n .filter(isTruthy);\n\n logger.trace({ deps }, 'Docker Compose image');\n return { deps };\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ packageFile, err }, 'Error extracting Docker Compose file');\n return null;\n }\n}\n"],"mappings":";;;;;;;;AASA,IAAM,aAAN,MAAiB;CACf;CAEA,YAAY,SAAiB,QAAgB;EAC3C,KAAK,aAAa,CAAC,GAAG,QAAQ,MAAM,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,CACzD,QAAQ,UAAU,OAAO,KAAK,MAAM,EAAE,CAAC,CAAC,CACxC,KAAK,CAAC,YAAY,WAAW;GAAE;GAAY;GAAM,MAAM;EAAM,EAAE;CACpE;CAEA,gBAAgB,WAA8C;EAC5D,MAAM,WAAW,KAAK,WAAW,MAC9B,EAAE,MAAM,WAAW,CAAC,QAAQ,aAAa,KAAK,SAAS,SAAS,CACnE;;EAEA,IAAI,CAAC,UACH,OAAO;EAET,SAAS,OAAO;EAChB,OAAO,SAAS;CAClB;AACF;AAEA,SAAgB,mBACd,SACA,aACA,eAC2B;CAC3B,OAAO,MAAM,qCAAqC,YAAY,EAAE;CAChE,IAAI;CACJ,IAAI;EACF,SAAS,gBAAgB,SAAS;GAChC,cAAc;GACd,iBAAiB;EACnB,CAAC;CACH,SAAS,KAAK;EACZ,OAAO,MACL;GAAE;GAAK;EAAY,GACnB,2CACF;EACA,OAAO;CACT;CACA,IAAI;EACF,MAAM,aAAa,IAAI,WAAW,SAAS,MAAM,YAAY,CAAC;EAO9D,MAAM,WAAW,OAAO,YAAY;EACpC,MAAM,aAAa,aAAa,OAAO,UAAU;EAIjD,MAAM,OAAO,OAAO,OAAO,QAAQ,CAAC,CACjC,OAAO,OAAO,OAAO,UAAU,CAAC,CAAC,CACjC,QAAQ,YAAY,SAAS,SAAS,KAAK,KAAK,CAAC,SAAS,KAAK,CAAC,CAChE,KAAK,YAAY;GAChB,MAAM,MAAM,OAAO,QAAQ,OAAO,MAAM,cAAc,eAAe;;GAGrE,IAAI,CAFe,WAAW,gBAAgB,QAAQ,KAExC,GACZ,OAAO;GAET,OAAO;EACT,CAAC,CAAC,CACD,OAAO,QAAQ;EAElB,OAAO,MAAM,EAAE,KAAK,GAAG,sBAAsB;EAC7C,OAAO,EAAE,KAAK;CAChB,SAAS,gCAAgC;EACvC,OAAO,MAAM;GAAE;GAAa;EAAI,GAAG,sCAAsC;EACzE,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/docker-compose/extract.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type { ExtractConfig, PackageFileContent } from '../types.ts';\nimport { DockerComposeFile } from './schema.ts';\n\nclass LineMapper {\n private imageLines: { line: string; lineNumber: number; used: boolean }[];\n\n constructor(content: string, filter: RegExp) {\n this.imageLines = [...content.split(newlineRegex).entries()]\n .filter((entry) => filter.test(entry[1]))\n .map(([lineNumber, line]) => ({ lineNumber, line, used: false }));\n }\n\n pluckLineNumber(imageName: string | undefined): number | null {\n const lineMeta = this.imageLines.find(\n ({ line, used }) => !used && imageName && line.includes(imageName),\n );\n // istanbul ignore if\n if (!lineMeta) {\n return null;\n }\n lineMeta.used = true; // unset plucked lines so duplicates are skipped\n return lineMeta.lineNumber;\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n extractConfig: ExtractConfig,\n): PackageFileContent | null {\n logger.debug(`docker-compose.extractPackageFile(${packageFile})`);\n let config: DockerComposeFile;\n try {\n config = parseSingleYaml(content, {\n customSchema: DockerComposeFile,\n removeTemplates: true,\n });\n } catch (err) {\n logger.debug(\n { err, packageFile },\n `Parsing Docker Compose config YAML failed`,\n );\n return null;\n }\n try {\n const lineMapper = new LineMapper(content, regEx(/^\\s*image:/));\n\n // docker-compose v1 places the services at the top level,\n // docker-compose v2+ places the services within a 'services' key\n // since docker-compose spec version 1.27, the 'version' key has\n // become optional and can no longer be used to differentiate\n // between v1 and v2.\n const services = config.services ?? config;\n const extensions = coerceObject(config.extensions);\n\n // Image name/tags for services are only eligible for update if they don't\n // use variables and if the image is not built locally\n const deps = Object.values(services)\n .concat(Object.values(extensions))\n .filter((service) => isString(service?.image) && !service?.build)\n .map((service) => {\n const dep = getDep(service.image, {\n registryAliases: extractConfig.registryAliases,\n });\n const lineNumber = lineMapper.pluckLineNumber(service.image);\n // istanbul ignore if\n if (!lineNumber) {\n return null;\n }\n return dep;\n })\n .filter(isTruthy);\n\n logger.trace({ deps }, 'Docker Compose image');\n return { deps };\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ packageFile, err }, 'Error extracting Docker Compose file');\n return null;\n }\n}\n"],"mappings":";;;;;;;;AASA,IAAM,aAAN,MAAiB;CACf;CAEA,YAAY,SAAiB,QAAgB;EAC3C,KAAK,aAAa,CAAC,GAAG,QAAQ,MAAM,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,CACzD,QAAQ,UAAU,OAAO,KAAK,MAAM,EAAE,CAAC,CAAC,CACxC,KAAK,CAAC,YAAY,WAAW;GAAE;GAAY;GAAM,MAAM;EAAM,EAAE;CACpE;CAEA,gBAAgB,WAA8C;EAC5D,MAAM,WAAW,KAAK,WAAW,MAC9B,EAAE,MAAM,WAAW,CAAC,QAAQ,aAAa,KAAK,SAAS,SAAS,CACnE;;EAEA,IAAI,CAAC,UACH,OAAO;EAET,SAAS,OAAO;EAChB,OAAO,SAAS;CAClB;AACF;AAEA,SAAgB,mBACd,SACA,aACA,eAC2B;CAC3B,OAAO,MAAM,qCAAqC,YAAY,EAAE;CAChE,IAAI;CACJ,IAAI;EACF,SAAS,gBAAgB,SAAS;GAChC,cAAc;GACd,iBAAiB;EACnB,CAAC;CACH,SAAS,KAAK;EACZ,OAAO,MACL;GAAE;GAAK;EAAY,GACnB,2CACF;EACA,OAAO;CACT;CACA,IAAI;EACF,MAAM,aAAa,IAAI,WAAW,SAAS,MAAM,YAAY,CAAC;EAO9D,MAAM,WAAW,OAAO,YAAY;EACpC,MAAM,aAAa,aAAa,OAAO,UAAU;EAIjD,MAAM,OAAO,OAAO,OAAO,QAAQ,CAAC,CACjC,OAAO,OAAO,OAAO,UAAU,CAAC,CAAC,CACjC,QAAQ,YAAY,SAAS,SAAS,KAAK,KAAK,CAAC,SAAS,KAAK,CAAC,CAChE,KAAK,YAAY;GAChB,MAAM,MAAM,OAAO,QAAQ,OAAO,EAChC,iBAAiB,cAAc,gBACjC,CAAC;;GAGD,IAAI,CAFe,WAAW,gBAAgB,QAAQ,KAExC,GACZ,OAAO;GAET,OAAO;EACT,CAAC,CAAC,CACD,OAAO,QAAQ;EAElB,OAAO,MAAM,EAAE,KAAK,GAAG,sBAAsB;EAC7C,OAAO,EAAE,KAAK;CAChB,SAAS,gCAAgC;EACvC,OAAO,MAAM;GAAE;GAAa;EAAI,GAAG,sCAAsC;EACzE,OAAO;CACT;AACF"}
@@ -77,7 +77,15 @@ function splitImageParts(currentFrom) {
77
77
  return dep;
78
78
  }
79
79
  const quayRegex = regEx(/^quay\.io(?::[1-9][0-9]{0,4})?/i);
80
- function getDep(currentFrom, specifyReplaceString = true, registryAliases) {
80
+ /**
81
+ * Extract a Docker dependency from an image reference.
82
+ */
83
+ function getDep(currentFrom, options = {}) {
84
+ const dep = getDepFromImageRef(currentFrom, options.specifyReplaceString ?? true, options.registryAliases);
85
+ if (options.depType) dep.depType = options.depType;
86
+ return dep;
87
+ }
88
+ function getDepFromImageRef(currentFrom, specifyReplaceString, registryAliases) {
81
89
  if (!isString(currentFrom) || !isNonEmptyStringAndNotWhitespace(currentFrom)) return { skipReason: "invalid-value" };
82
90
  for (const [name, value] of Object.entries(coerceObject(registryAliases))) {
83
91
  const matchedWithSlash = currentFrom.startsWith(`${name}/`);
@@ -85,7 +93,7 @@ function getDep(currentFrom, specifyReplaceString = true, registryAliases) {
85
93
  if (!matchedWithSlash && !matchedAtBoundary) continue;
86
94
  const depName = currentFrom.slice(matchedWithSlash ? name.length + 1 : name.length);
87
95
  const valueWithSlash = value ? ensureTrailingSlash(value) : "";
88
- const dep = getDep(`${valueWithSlash}${depName}`, false);
96
+ const dep = getDepFromImageRef(`${valueWithSlash}${depName}`, false, void 0);
89
97
  if (dep.depName?.startsWith(valueWithSlash)) {
90
98
  dep.packageName = dep.depName;
91
99
  const [imageAndTag] = currentFrom.split("@");
@@ -152,7 +160,7 @@ function extractPackageFile(content, _packageFile, config) {
152
160
  if (syntaxMatch?.groups?.image) {
153
161
  const syntaxImage = syntaxMatch.groups.image;
154
162
  const lineNumberRanges = [[lineNumberInstrStart, lineNumber]];
155
- const dep = getDep(syntaxImage, true, config.registryAliases);
163
+ const dep = getDep(syntaxImage, { registryAliases: config.registryAliases });
156
164
  dep.depType = "syntax";
157
165
  processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);
158
166
  logger.trace({
@@ -199,7 +207,7 @@ function extractPackageFile(content, _packageFile, config) {
199
207
  if (fromImage === "scratch") logger.debug("Skipping scratch");
200
208
  else if (fromImage && stageNames.includes(fromImage)) logger.debug(`Skipping alias FROM image:${fromImage}`);
201
209
  else {
202
- const dep = getDep(fromImage, true, config.registryAliases);
210
+ const dep = getDep(fromImage, { registryAliases: config.registryAliases });
203
211
  processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);
204
212
  logger.trace({
205
213
  depName: dep.depName,
@@ -215,7 +223,7 @@ function extractPackageFile(content, _packageFile, config) {
215
223
  if (stageNames.includes(copyFromMatch.groups.image)) logger.debug({ image: copyFromMatch.groups.image }, "Skipping alias COPY --from");
216
224
  else if (isNumericString(copyFromMatch.groups.image)) logger.debug({ image: copyFromMatch.groups.image }, "Skipping index reference COPY --from");
217
225
  else {
218
- const dep = getDep(copyFromMatch.groups.image, true, config.registryAliases);
226
+ const dep = getDep(copyFromMatch.groups.image, { registryAliases: config.registryAliases });
219
227
  processDepForAutoReplace(dep, [[lineNumberInstrStart, lineNumber]], lines, lineFeed);
220
228
  logger.debug({
221
229
  depName: dep.depName,
@@ -230,7 +238,7 @@ function extractPackageFile(content, _packageFile, config) {
230
238
  if (runMountFromMatch?.groups?.image) {
231
239
  if (stageNames.includes(runMountFromMatch.groups.image)) logger.debug({ image: runMountFromMatch.groups.image }, "Skipping alias RUN --mount=from");
232
240
  else {
233
- const dep = getDep(runMountFromMatch.groups.image, true, config.registryAliases);
241
+ const dep = getDep(runMountFromMatch.groups.image, { registryAliases: config.registryAliases });
234
242
  processDepForAutoReplace(dep, [[lineNumberInstrStart, lineNumber]], lines, lineFeed);
235
243
  logger.debug({
236
244
  depName: dep.depName,