diff --git a/lib/modules/manager/bazel/extract.ts b/lib/modules/manager/bazel/extract.ts index aca6894f1936304fbaa4aa9cbc93b7c3a4f43d86..7fa7c4d41dc89b11eb9b595bb11a2187a1841038 100644 --- a/lib/modules/manager/bazel/extract.ts +++ b/lib/modules/manager/bazel/extract.ts @@ -1,6 +1,6 @@ import type { PackageDependency, PackageFile } from '../types'; import { parse } from './parser'; -import { extractDepFromFragment } from './rules'; +import { extractDepsFromFragment } from './rules'; import type { RecordFragment } from './types'; export function extractPackageFile( @@ -16,15 +16,11 @@ export function extractPackageFile( for (let idx = 0; idx < fragments.length; idx += 1) { const fragment = fragments[idx]; - - const dep = extractDepFromFragment(fragment); - if (!dep) { - continue; + for (const dep of extractDepsFromFragment(fragment)) { + dep.replaceString = fragment.value; + dep.managerData = { idx }; + deps.push(dep); } - - dep.replaceString = fragment.value; - dep.managerData = { idx }; - deps.push(dep); } return deps.length ? { deps } : null; diff --git a/lib/modules/manager/bazel/rules/docker.ts b/lib/modules/manager/bazel/rules/docker.ts index 233487c5e8091156f19a7ceedcb5fbee3ae7e229..4ccc83d62694c69d1e1312cc988d7068d5720147 100644 --- a/lib/modules/manager/bazel/rules/docker.ts +++ b/lib/modules/manager/bazel/rules/docker.ts @@ -15,14 +15,23 @@ export const DockerTarget = z registry: z.string(), }) .transform( - ({ rule, name, repository, tag, digest, registry }): PackageDependency => ({ - datasource: DockerDatasource.id, - versioning: dockerVersioning, - depType: rule, - depName: name, - packageName: repository, - currentValue: tag, - currentDigest: digest, - registryUrls: [registry], - }) + ({ + rule, + name, + repository, + tag, + digest, + registry, + }): PackageDependency[] => [ + { + datasource: DockerDatasource.id, + versioning: dockerVersioning, + depType: rule, + depName: name, + packageName: repository, + currentValue: tag, + currentDigest: digest, + registryUrls: [registry], + }, + ] ); diff --git a/lib/modules/manager/bazel/rules/git.ts b/lib/modules/manager/bazel/rules/git.ts index bdf52e6f5b91be9f8ad835ec1e87d460a0d29620..5f215932583471586c4c035e8437faa633909117 100644 --- a/lib/modules/manager/bazel/rules/git.ts +++ b/lib/modules/manager/bazel/rules/git.ts @@ -23,7 +23,7 @@ export const GitTarget = z remote: z.string(), }) .refine(({ tag, commit }) => !!tag || !!commit) - .transform(({ rule, name, tag, commit, remote }): PackageDependency => { + .transform(({ rule, name, tag, commit, remote }): PackageDependency[] => { const dep: PackageDependency = { depType: rule, depName: name, @@ -47,5 +47,5 @@ export const GitTarget = z dep.skipReason = 'unsupported-datasource'; } - return dep; + return [dep]; }); diff --git a/lib/modules/manager/bazel/rules/go.ts b/lib/modules/manager/bazel/rules/go.ts index ef68c1c93194f019af9e1ad35d48c00427906c35..5bbf35302e2896163ceab2391f876978298dd69f 100644 --- a/lib/modules/manager/bazel/rules/go.ts +++ b/lib/modules/manager/bazel/rules/go.ts @@ -16,7 +16,7 @@ export const GoTarget = z }) .refine(({ tag, commit }) => !!tag || !!commit) .transform( - ({ rule, name, tag, commit, importpath, remote }): PackageDependency => { + ({ rule, name, tag, commit, importpath, remote }): PackageDependency[] => { const dep: PackageDependency = { datasource: GoDatasource.id, depType: rule, @@ -46,6 +46,6 @@ export const GoTarget = z } } - return dep; + return [dep]; } ); diff --git a/lib/modules/manager/bazel/rules/http.ts b/lib/modules/manager/bazel/rules/http.ts index 4fc3e4bc9b14d61e4e3376b8e9d3620b5218edff..7f773b97fabb350dc8fe4d6f0170081e788f76f4 100644 --- a/lib/modules/manager/bazel/rules/http.ts +++ b/lib/modules/manager/bazel/rules/http.ts @@ -62,10 +62,10 @@ export const HttpTarget = z sha256: z.string(), }) .refine(({ url, urls }) => !!url || !!urls) - .transform(({ rule, name, url, urls = [] }): PackageDependency | null => { + .transform(({ rule, name, url, urls = [] }): PackageDependency[] => { const parsedUrl = [url, ...urls].map(parseArchiveUrl).find(is.truthy); if (!parsedUrl) { - return null; + return []; } const dep: PackageDependency = { @@ -81,5 +81,5 @@ export const HttpTarget = z dep.currentValue = parsedUrl.currentValue; } - return dep; + return [dep]; }); diff --git a/lib/modules/manager/bazel/rules/index.spec.ts b/lib/modules/manager/bazel/rules/index.spec.ts index df3043127b550e6ace4405934a46ea6577d05932..c133e7a4f869eca633cb3276a68fd620757a63b5 100644 --- a/lib/modules/manager/bazel/rules/index.spec.ts +++ b/lib/modules/manager/bazel/rules/index.spec.ts @@ -1,5 +1,5 @@ import { parseArchiveUrl } from './http'; -import { extractDepFromFragmentData } from '.'; +import { extractDepsFromFragmentData } from '.'; describe('modules/manager/bazel/rules/index', () => { it('parses archiveUrl', () => { @@ -46,186 +46,202 @@ describe('modules/manager/bazel/rules/index', () => { describe('git', () => { it('extracts git dependencies', () => { expect( - extractDepFromFragmentData({ rule: 'foo_bar', name: 'foo_bar' }) - ).toBeNull(); + extractDepsFromFragmentData({ rule: 'foo_bar', name: 'foo_bar' }) + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ rule: 'git_repository', name: 'foo_bar' }) - ).toBeNull(); + extractDepsFromFragmentData({ rule: 'git_repository', name: 'foo_bar' }) + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'git_repository', name: 'foo_bar', tag: '1.2.3', }) - ).toBeNull(); + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'git_repository', name: 'foo_bar', tag: '1.2.3', remote: 'https://github.com/foo/bar', }) - ).toEqual({ - datasource: 'github-releases', - depType: 'git_repository', - depName: 'foo_bar', - packageName: 'foo/bar', - currentValue: '1.2.3', - }); + ).toEqual([ + { + datasource: 'github-releases', + depType: 'git_repository', + depName: 'foo_bar', + packageName: 'foo/bar', + currentValue: '1.2.3', + }, + ]); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'git_repository', name: 'foo_bar', commit: 'abcdef0123abcdef0123abcdef0123abcdef0123', remote: 'https://github.com/foo/bar', }) - ).toEqual({ - datasource: 'github-releases', - depType: 'git_repository', - depName: 'foo_bar', - packageName: 'foo/bar', - currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', - }); + ).toEqual([ + { + datasource: 'github-releases', + depType: 'git_repository', + depName: 'foo_bar', + packageName: 'foo/bar', + currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', + }, + ]); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'git_repository', name: 'foo_bar', tag: '1.2.3', remote: 'https://gitlab.com/foo/bar', }) - ).toMatchObject({ - currentValue: '1.2.3', - depName: 'foo_bar', - depType: 'git_repository', - skipReason: 'unsupported-datasource', - }); + ).toMatchObject([ + { + currentValue: '1.2.3', + depName: 'foo_bar', + depType: 'git_repository', + skipReason: 'unsupported-datasource', + }, + ]); }); }); describe('go', () => { it('extracts go dependencies', () => { expect( - extractDepFromFragmentData({ rule: 'foo_bar', name: 'foo_bar' }) - ).toBeNull(); + extractDepsFromFragmentData({ rule: 'foo_bar', name: 'foo_bar' }) + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ rule: 'go_repository', name: 'foo_bar' }) - ).toBeNull(); + extractDepsFromFragmentData({ rule: 'go_repository', name: 'foo_bar' }) + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'go_repository', name: 'foo_bar', tag: '1.2.3', }) - ).toBeNull(); + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'go_repository', name: 'foo_bar', tag: '1.2.3', importpath: 'foo/bar/baz', }) - ).toEqual({ - datasource: 'go', - depType: 'go_repository', - depName: 'foo_bar', - packageName: 'foo/bar/baz', - currentValue: '1.2.3', - }); + ).toEqual([ + { + datasource: 'go', + depType: 'go_repository', + depName: 'foo_bar', + packageName: 'foo/bar/baz', + currentValue: '1.2.3', + }, + ]); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'go_repository', name: 'foo_bar', commit: 'abcdef0123abcdef0123abcdef0123abcdef0123', importpath: 'foo/bar/baz', }) - ).toEqual({ - datasource: 'go', - depType: 'go_repository', - depName: 'foo_bar', - packageName: 'foo/bar/baz', - currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', - digestOneAndOnly: true, - }); + ).toEqual([ + { + datasource: 'go', + depType: 'go_repository', + depName: 'foo_bar', + packageName: 'foo/bar/baz', + currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', + digestOneAndOnly: true, + }, + ]); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'go_repository', name: 'foo_bar', tag: '1.2.3', importpath: 'foo/bar/baz', remote: 'https://github.com/foo/bar', }) - ).toEqual({ - datasource: 'go', - depType: 'go_repository', - depName: 'foo_bar', - packageName: 'github.com/foo/bar', - currentValue: '1.2.3', - }); + ).toEqual([ + { + datasource: 'go', + depType: 'go_repository', + depName: 'foo_bar', + packageName: 'github.com/foo/bar', + currentValue: '1.2.3', + }, + ]); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'go_repository', name: 'foo_bar', tag: '1.2.3', importpath: 'foo/bar/baz', remote: 'https://example.com/foo/bar', }) - ).toEqual({ - datasource: 'go', - depType: 'go_repository', - depName: 'foo_bar', - packageName: 'foo/bar/baz', - currentValue: '1.2.3', - skipReason: 'unsupported-remote', - }); + ).toEqual([ + { + datasource: 'go', + depType: 'go_repository', + depName: 'foo_bar', + packageName: 'foo/bar/baz', + currentValue: '1.2.3', + skipReason: 'unsupported-remote', + }, + ]); }); }); describe('http', () => { it('extracts http dependencies', () => { expect( - extractDepFromFragmentData({ rule: 'foo_bar', name: 'foo_bar' }) - ).toBeNull(); + extractDepsFromFragmentData({ rule: 'foo_bar', name: 'foo_bar' }) + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ rule: 'http_archive', name: 'foo_bar' }) - ).toBeNull(); + extractDepsFromFragmentData({ rule: 'http_archive', name: 'foo_bar' }) + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'http_archive', name: 'foo_bar', sha256: 'abcdef0123abcdef0123abcdef0123abcdef0123', }) - ).toBeNull(); + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'http_archive', name: 'foo_bar', sha256: 'abcdef0123abcdef0123abcdef0123abcdef0123', url: 'https://github.com/foo/bar/archive/abcdef0123abcdef0123abcdef0123abcdef0123.tar.gz', }) - ).toEqual({ - currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', - datasource: 'github-tags', - depName: 'foo_bar', - depType: 'http_archive', - packageName: 'foo/bar', - }); + ).toEqual([ + { + currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', + datasource: 'github-tags', + depName: 'foo_bar', + depType: 'http_archive', + packageName: 'foo/bar', + }, + ]); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'http_archive', name: 'foo_bar', sha256: 'abcdef0123abcdef0123abcdef0123abcdef0123', @@ -234,31 +250,35 @@ describe('modules/manager/bazel/rules/index', () => { 'https://github.com/foo/bar/archive/abcdef0123abcdef0123abcdef0123abcdef0123.tar.gz', ], }) - ).toEqual({ - currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', - datasource: 'github-tags', - depName: 'foo_bar', - depType: 'http_archive', - packageName: 'foo/bar', - }); + ).toEqual([ + { + currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', + datasource: 'github-tags', + depName: 'foo_bar', + depType: 'http_archive', + packageName: 'foo/bar', + }, + ]); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'http_archive', name: 'foo_bar', sha256: 'abcdef0123abcdef0123abcdef0123abcdef0123', url: 'https://github.com/foo/bar/releases/download/1.2.3/foobar-1.2.3.tar.gz', }) - ).toEqual({ - currentValue: '1.2.3', - datasource: 'github-releases', - depName: 'foo_bar', - depType: 'http_archive', - packageName: 'foo/bar', - }); + ).toEqual([ + { + currentValue: '1.2.3', + datasource: 'github-releases', + depName: 'foo_bar', + depType: 'http_archive', + packageName: 'foo/bar', + }, + ]); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'http_archive', name: 'foo_bar', sha256: 'abcdef0123abcdef0123abcdef0123abcdef0123', @@ -267,16 +287,18 @@ describe('modules/manager/bazel/rules/index', () => { 'https://github.com/foo/bar/releases/download/1.2.3/foobar-1.2.3.tar.gz', ], }) - ).toEqual({ - currentValue: '1.2.3', - datasource: 'github-releases', - depName: 'foo_bar', - depType: 'http_archive', - packageName: 'foo/bar', - }); + ).toEqual([ + { + currentValue: '1.2.3', + datasource: 'github-releases', + depName: 'foo_bar', + depType: 'http_archive', + packageName: 'foo/bar', + }, + ]); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'http_archive', name: 'aspect_rules_js', sha256: @@ -285,24 +307,26 @@ describe('modules/manager/bazel/rules/index', () => { 'https://github.com/aspect-build/rules_js/archive/refs/tags/v1.1.2.tar.gz', ], }) - ).toEqual({ - currentValue: 'v1.1.2', - datasource: 'github-tags', - depName: 'aspect_rules_js', - depType: 'http_archive', - packageName: 'aspect-build/rules_js', - }); + ).toEqual([ + { + currentValue: 'v1.1.2', + datasource: 'github-tags', + depName: 'aspect_rules_js', + depType: 'http_archive', + packageName: 'aspect-build/rules_js', + }, + ]); }); }); describe('docker', () => { it('extracts docker dependencies', () => { expect( - extractDepFromFragmentData({ rule: 'foo_bar', name: 'foo_bar' }) - ).toBeNull(); + extractDepsFromFragmentData({ rule: 'foo_bar', name: 'foo_bar' }) + ).toBeEmptyArray(); expect( - extractDepFromFragmentData({ + extractDepsFromFragmentData({ rule: 'container_pull', name: 'foo_bar', tag: '1.2.3', @@ -310,16 +334,18 @@ describe('modules/manager/bazel/rules/index', () => { repository: 'example.com/foo/bar', registry: 'https://example.com', }) - ).toEqual({ - currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', - currentValue: '1.2.3', - datasource: 'docker', - depName: 'foo_bar', - depType: 'container_pull', - packageName: 'example.com/foo/bar', - registryUrls: ['https://example.com'], - versioning: 'docker', - }); + ).toEqual([ + { + currentDigest: 'abcdef0123abcdef0123abcdef0123abcdef0123', + currentValue: '1.2.3', + datasource: 'docker', + depName: 'foo_bar', + depType: 'container_pull', + packageName: 'example.com/foo/bar', + registryUrls: ['https://example.com'], + versioning: 'docker', + }, + ]); }); }); }); diff --git a/lib/modules/manager/bazel/rules/index.ts b/lib/modules/manager/bazel/rules/index.ts index deafa4d077048c8fe308324aa4d97cd7a7074f97..149ff09e742ce57672609bb24ba70f685204f178 100644 --- a/lib/modules/manager/bazel/rules/index.ts +++ b/lib/modules/manager/bazel/rules/index.ts @@ -16,21 +16,21 @@ const Target = z.union([DockerTarget, GitTarget, GoTarget, HttpTarget]); const supportedRules = [...dockerRules, ...gitRules, ...goRules, ...httpRules]; export const supportedRulesRegex = regEx(`^${supportedRules.join('|')}$`); -export function extractDepFromFragmentData( +export function extractDepsFromFragmentData( fragmentData: FragmentData -): PackageDependency | null { +): PackageDependency[] { const res = Target.safeParse(fragmentData); if (!res.success) { - return null; + return []; } return res.data; } -export function extractDepFromFragment( +export function extractDepsFromFragment( fragment: Fragment -): PackageDependency | null { +): PackageDependency[] { const fragmentData = extract(fragment); - return extractDepFromFragmentData(fragmentData); + return extractDepsFromFragmentData(fragmentData); } export function extract(fragment: Fragment): FragmentData {