Files
renovate/lib/modules/datasource/crate/schema.ts
Tobias Bieniek b84a54cda7 fix(datasource/crate): tolerate null metadata fields (#44227)
* fix(datasource/crate): tolerate null metadata fields

crates.io returns `null` for unset crate metadata fields. `z.string().optional()`
rejects `null`, so a single null field (e.g. `documentation` on the `sentry` crate)
failed the whole metadata parse and discarded the valid `repository`, leaving
`sourceUrl` unset and breaking monorepo grouping. Use `.nullish()` so null fields
are tolerated.

* datasource/crate: Use `Nullish()` for metadata

* datasource/crate: Use `sentry` for null metadata test

* datasource/crate: Use `DeepNullish()` for metadata
2026-06-25 15:21:39 +00:00

35 lines
951 B
TypeScript

import { z } from 'zod/v4';
import { DeepNullish } from '../../../util/schema-utils/index.ts';
import { MaybeTimestamp } from '../../../util/timestamp.ts';
export const RegistryConfig = z.object({
dl: z.string(),
api: z.string().optional(),
});
export type RegistryConfig = z.infer<typeof RegistryConfig>;
export const ReleaseTimestamp = z
.object({
version: z.object({
created_at: MaybeTimestamp,
}),
})
.transform(({ version: { created_at } }) => created_at)
.nullable()
.catch(null);
export const CrateMetadata = DeepNullish(
z.object({
description: z.string().optional(),
documentation: z.string().optional(),
homepage: z.string().optional(),
repository: z.string().optional(),
}),
);
export type CrateMetadata = z.infer<typeof CrateMetadata>;
export const CrateMetadataResponse = z.object({
crate: CrateMetadata,
});
export type CrateMetadataResponse = z.infer<typeof CrateMetadataResponse>;