Skip to content
Snippets Groups Projects
Unverified Commit d37a3723 authored by Sergei Zharinov's avatar Sergei Zharinov Committed by GitHub
Browse files

fix(packagist): Support both objects and minified arrays in v2 (#20720)

parent 5249759b
No related branches found
No related tags found
No related merge requests found
...@@ -141,6 +141,14 @@ describe('modules/datasource/packagist/schema', () => { ...@@ -141,6 +141,14 @@ describe('modules/datasource/packagist/schema', () => {
}, },
}) })
).toEqual([{ version: '1.2.3' }]); ).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', () => { it('expands minified fields', () => {
......
import is from '@sindresorhus/is'; import is from '@sindresorhus/is';
import { z } from 'zod'; import { z } from 'zod';
import { logger } from '../../../logger'; 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'; import type { Release, ReleaseResult } from '../types';
export const MinifiedArray = z.array(z.record(z.unknown())).transform((xs) => { export const MinifiedArray = z.array(z.record(z.unknown())).transform((xs) => {
...@@ -54,30 +59,37 @@ export const ComposerRelease = z ...@@ -54,30 +59,37 @@ export const ComposerRelease = z
); );
export type ComposerRelease = z.infer<typeof ComposerRelease>; export type ComposerRelease = z.infer<typeof ComposerRelease>;
const ComposerReleasesLooseArray = looseArray(ComposerRelease);
type ComposerReleasesLooseArray = z.infer<typeof ComposerReleasesLooseArray>;
export const ComposerReleases = z export const ComposerReleases = z
.union([ .union([
z MinifiedArray.transform((xs) => ComposerReleasesLooseArray.parse(xs)),
.record(looseValue(ComposerRelease)) looseRecord(ComposerRelease).transform((map) => Object.values(map)),
.transform((map) => Object.values(map)),
z.array(looseValue(ComposerRelease)),
]) ])
.catch([]) .catch([]);
.transform((xs) => xs.filter((x): x is ComposerRelease => x !== null));
export type ComposerReleases = z.infer<typeof ComposerReleases>; export type ComposerReleases = z.infer<typeof ComposerReleases>;
export const ComposerPackagesResponse = z.object({ export const ComposerPackagesResponse = z
.object({
packageName: z.string(),
packagesResponse: z.object({
packages: z.record(z.unknown()), 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( export function parsePackagesResponse(
packageName: string, packageName: string,
packagesResponse: unknown packagesResponse: unknown
): ComposerReleases { ): ComposerReleases {
try { try {
const { packages } = ComposerPackagesResponse.parse(packagesResponse); return ComposerPackagesResponse.parse({ packageName, packagesResponse });
const array = MinifiedArray.parse(packages[packageName]);
const releases = ComposerReleases.parse(array);
return releases;
} catch (err) { } catch (err) {
logger.debug( logger.debug(
{ packageName, err }, { packageName, err },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment