diff --git a/lib/modules/datasource/packagist/schema.spec.ts b/lib/modules/datasource/packagist/schema.spec.ts index 035a8a1660cb21a6132544f016cf2231193c3979..ee0f6bbe93ae9ae9f682722b7044a1fc4bc6d766 100644 --- a/lib/modules/datasource/packagist/schema.spec.ts +++ b/lib/modules/datasource/packagist/schema.spec.ts @@ -141,6 +141,14 @@ describe('modules/datasource/packagist/schema', () => { }, }) ).toEqual([{ version: '1.2.3' }]); + expect( + parsePackagesResponse('foo/bar', { + packages: { + 'foo/bar': { '1.2.3': { version: '1.2.3' } }, + 'baz/qux': { '4.5.6': { version: '4.5.6' } }, + }, + }) + ).toEqual([{ version: '1.2.3' }]); }); it('expands minified fields', () => { diff --git a/lib/modules/datasource/packagist/schema.ts b/lib/modules/datasource/packagist/schema.ts index 0205605fb9aca2d2a91e33e8c2616d52d27f9b66..2dca13a950e0f8eab9c6bb7a52212fb88f246a5c 100644 --- a/lib/modules/datasource/packagist/schema.ts +++ b/lib/modules/datasource/packagist/schema.ts @@ -1,7 +1,12 @@ import is from '@sindresorhus/is'; import { z } from 'zod'; import { logger } from '../../../logger'; -import { looseObject, looseRecord, looseValue } from '../../../util/schema'; +import { + looseArray, + looseObject, + looseRecord, + looseValue, +} from '../../../util/schema'; import type { Release, ReleaseResult } from '../types'; export const MinifiedArray = z.array(z.record(z.unknown())).transform((xs) => { @@ -54,30 +59,37 @@ export const ComposerRelease = z ); export type ComposerRelease = z.infer<typeof ComposerRelease>; +const ComposerReleasesLooseArray = looseArray(ComposerRelease); +type ComposerReleasesLooseArray = z.infer<typeof ComposerReleasesLooseArray>; + export const ComposerReleases = z .union([ - z - .record(looseValue(ComposerRelease)) - .transform((map) => Object.values(map)), - z.array(looseValue(ComposerRelease)), + MinifiedArray.transform((xs) => ComposerReleasesLooseArray.parse(xs)), + looseRecord(ComposerRelease).transform((map) => Object.values(map)), ]) - .catch([]) - .transform((xs) => xs.filter((x): x is ComposerRelease => x !== null)); + .catch([]); export type ComposerReleases = z.infer<typeof ComposerReleases>; -export const ComposerPackagesResponse = z.object({ - packages: z.record(z.unknown()), -}); +export const ComposerPackagesResponse = z + .object({ + packageName: z.string(), + packagesResponse: z.object({ + packages: z.record(z.unknown()), + }), + }) + .transform( + ({ packageName, packagesResponse }) => + packagesResponse.packages[packageName] + ) + .transform((xs) => ComposerReleases.parse(xs)); +export type ComposerPackagesResponse = z.infer<typeof ComposerPackagesResponse>; export function parsePackagesResponse( packageName: string, packagesResponse: unknown ): ComposerReleases { try { - const { packages } = ComposerPackagesResponse.parse(packagesResponse); - const array = MinifiedArray.parse(packages[packageName]); - const releases = ComposerReleases.parse(array); - return releases; + return ComposerPackagesResponse.parse({ packageName, packagesResponse }); } catch (err) { logger.debug( { packageName, err },