Skip to content

Commit

Permalink
refactor(schema): Remove looseObject helper (#21164)
Browse files Browse the repository at this point in the history
  • Loading branch information
zharinov committed Mar 27, 2023
1 parent a1bb7c7 commit e66b93a
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 75 deletions.
155 changes: 138 additions & 17 deletions lib/modules/datasource/packagist/schema.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,34 +80,78 @@ describe('modules/datasource/packagist/schema', () => {
});

it('parses ComposerRelease', () => {
expect(ComposerRelease.parse({ version: '' })).toEqual({ version: '' });
expect(ComposerRelease.parse({ version: '' })).toEqual({
version: '',
homepage: null,
source: null,
time: null,
require: null,
});
expect(ComposerRelease.parse({ version: 'dev-main' })).toEqual({
version: 'dev-main',
homepage: null,
source: null,
time: null,
require: null,
});

expect(ComposerRelease.parse({ version: '1.2.3' })).toEqual({
version: '1.2.3',
homepage: null,
source: null,
time: null,
require: null,
});

expect(ComposerRelease.parse({ version: '1.2.3', homepage: 42 })).toEqual(
{ version: '1.2.3', homepage: null }
{
version: '1.2.3',
homepage: null,
source: null,
time: null,
require: null,
}
);

expect(
ComposerRelease.parse({ version: '1.2.3', homepage: 'example.com' })
).toEqual({ version: '1.2.3', homepage: 'example.com' });
).toEqual({
version: '1.2.3',
homepage: 'example.com',
source: null,
time: null,
require: null,
});

expect(
ComposerRelease.parse({ version: '1.2.3', source: 'nonsense' })
).toEqual({ version: '1.2.3', source: null });
).toEqual({
version: '1.2.3',
homepage: null,
source: null,
time: null,
require: null,
});

expect(
ComposerRelease.parse({ version: '1.2.3', source: { url: 'foobar' } })
).toEqual({ version: '1.2.3', source: { url: 'foobar' } });
).toEqual({
version: '1.2.3',
source: { url: 'foobar' },
homepage: null,
time: null,
require: null,
});

expect(
ComposerRelease.parse({ version: '1.2.3', time: '12345' })
).toEqual({ version: '1.2.3', time: '12345' });
).toEqual({
version: '1.2.3',
time: '12345',
homepage: null,
source: null,
require: null,
});
});
});

Expand All @@ -123,7 +167,22 @@ describe('modules/datasource/packagist/schema', () => {
expect(ComposerReleases.parse(['foobar'])).toBeEmptyArray();
expect(
ComposerReleases.parse([{ version: '1.2.3' }, { version: 'dev-main' }])
).toEqual([{ version: '1.2.3' }, { version: 'dev-main' }]);
).toEqual([
{
version: '1.2.3',
homepage: null,
source: null,
time: null,
require: null,
},
{
version: 'dev-main',
homepage: null,
source: null,
time: null,
require: null,
},
]);
});
});

Expand All @@ -133,22 +192,40 @@ describe('modules/datasource/packagist/schema', () => {
expect(parsePackagesResponse('foo/bar', {})).toEqual([]);
expect(parsePackagesResponse('foo/bar', { packages: '123' })).toEqual([]);
expect(parsePackagesResponse('foo/bar', { packages: {} })).toEqual([]);

expect(
parsePackagesResponse('foo/bar', {
packages: {
'foo/bar': [{ version: '1.2.3' }],
'baz/qux': [{ version: '4.5.6' }],
},
})
).toEqual([{ version: '1.2.3' }]);
).toEqual([
{
version: '1.2.3',
homepage: null,
source: null,
time: null,
require: null,
},
]);

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' }]);
).toEqual([
{
version: '1.2.3',
homepage: null,
source: null,
time: null,
require: null,
},
]);
});

it('expands minified fields', () => {
Expand All @@ -167,14 +244,56 @@ describe('modules/datasource/packagist/schema', () => {
},
})
).toEqual([
{ version: '3.3.3', require: { php: '^8.0' } },
{ version: '2.2.2', require: { php: '^8.0' } },
{ version: '1.1.1', require: { php: '^8.0' } },
{ version: '0.0.4', require: { php: '^7.0' } },
{ version: '0.0.3', require: { php: '^7.0' } },
{ version: '0.0.2' },
{ version: '0.0.1' },
] satisfies ComposerRelease[]);
{
version: '3.3.3',
require: { php: '^8.0' },
homepage: null,
source: null,
time: null,
},
{
version: '2.2.2',
require: { php: '^8.0' },
homepage: null,
source: null,
time: null,
},
{
version: '1.1.1',
require: { php: '^8.0' },
homepage: null,
source: null,
time: null,
},
{
version: '0.0.4',
require: { php: '^7.0' },
homepage: null,
source: null,
time: null,
},
{
version: '0.0.3',
require: { php: '^7.0' },
homepage: null,
source: null,
time: null,
},
{
version: '0.0.2',
homepage: null,
source: null,
time: null,
require: null,
},
{
version: '0.0.1',
homepage: null,
source: null,
time: null,
require: null,
},
]);
});
});

Expand Down Expand Up @@ -205,6 +324,7 @@ describe('modules/datasource/packagist/schema', () => {
time: '222',
homepage: 'https://example.com/2',
source: { url: 'git@example.com:baz/qux-2' },
require: null,
},
],
},
Expand All @@ -226,6 +346,7 @@ describe('modules/datasource/packagist/schema', () => {
time: '444',
homepage: 'https://example.com/4',
source: { url: 'git@example.com:baz/qux-3' },
require: null,
},
],
},
Expand Down
26 changes: 8 additions & 18 deletions lib/modules/datasource/packagist/schema.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
import is from '@sindresorhus/is';
import { z } from 'zod';
import { logger } from '../../../logger';
import {
looseArray,
looseObject,
looseRecord,
looseValue,
} from '../../../util/schema';
import { looseArray, looseRecord, looseValue } from '../../../util/schema';
import type { Release, ReleaseResult } from '../types';

export const MinifiedArray = z.array(z.record(z.unknown())).transform((xs) => {
Expand Down Expand Up @@ -45,18 +40,13 @@ export const MinifiedArray = z.array(z.record(z.unknown())).transform((xs) => {
});
export type MinifiedArray = z.infer<typeof MinifiedArray>;

export const ComposerRelease = z
.object({
version: z.string(),
})
.merge(
looseObject({
homepage: z.string(),
source: z.object({ url: z.string() }),
time: z.string(),
require: z.object({ php: z.string() }),
})
);
export const ComposerRelease = z.object({
version: z.string(),
homepage: looseValue(z.string()),
source: looseValue(z.object({ url: z.string() })),
time: looseValue(z.string()),
require: looseValue(z.object({ php: z.string() })),
});
export type ComposerRelease = z.infer<typeof ComposerRelease>;

const ComposerReleasesLooseArray = looseArray(ComposerRelease);
Expand Down
25 changes: 0 additions & 25 deletions lib/util/schema.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,29 +172,4 @@ describe('util/schema', () => {
expect(called).toBeTrue();
});
});

describe('looseObject', () => {
it('parses object', () => {
const s = schema.looseObject({
foo: z.string(),
bar: z.number(),
});
expect(s.parse({ foo: 'foo', bar: 123 })).toEqual({
foo: 'foo',
bar: 123,
});
});

it('drops wrong items', () => {
const s = schema.looseObject({
foo: z.string(),
bar: z.number(),
baz: z.string(),
});
expect(s.parse({ foo: 'foo', bar: 'bar' })).toEqual({
foo: 'foo',
bar: null,
});
});
});
});
15 changes: 0 additions & 15 deletions lib/util/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,18 +157,3 @@ export function looseValue<T, U extends z.ZodTypeDef, V>(
: nullableSchema.catch(null);
return schemaWithFallback;
}

export function looseObject<T extends z.ZodRawShape>(
shape: T
): z.ZodObject<{
[k in keyof T]: z.ZodOptional<z.ZodCatch<z.ZodNullable<T[k]>>>;
}> {
const newShape: Record<keyof T, z.ZodTypeAny> = { ...shape };
const keys: (keyof T)[] = Object.keys(shape);
for (const k of keys) {
const v = looseValue(shape[k]);
newShape[k] = v;
}

return z.object(newShape).partial() as never;
}

0 comments on commit e66b93a

Please sign in to comment.