UNPKG

renovate

Version:

Automated dependency updates. Flexible so you don't need to be.

115 lines (114 loc) 4.88 kB
import { logger } from "../../../logger/index.js"; import { LooseArray, LooseRecord } from "../../../util/schema-utils/index.js"; import { MaybeTimestamp } from "../../../util/timestamp.js"; import { isUndefined } from "@sindresorhus/is"; import { z } from "zod/v4"; //#region lib/modules/datasource/packagist/schema.ts const MinifiedArray = z.array(z.record(z.string(), z.unknown())).transform((xs) => { if (xs.length === 0) return xs; const prevVals = {}; for (const x of xs) { for (const key of Object.keys(x)) prevVals[key] ??= void 0; for (const key of Object.keys(prevVals)) { const val = x[key]; if (val === "__unset") { delete x[key]; prevVals[key] = void 0; continue; } if (!isUndefined(val)) { prevVals[key] = val; continue; } if (!isUndefined(prevVals[key])) { x[key] = prevVals[key]; continue; } } } return xs; }); const ComposerRelease = z.object({ version: z.union([z.string(), z.number().transform((v) => v.toString())]), homepage: z.string().nullable().catch(null), source: z.object({ url: z.string() }).nullable().catch(null), time: MaybeTimestamp, require: z.object({ php: z.string() }).nullable().catch(null) }); const ComposerReleases = z.union([MinifiedArray.pipe(LooseArray(ComposerRelease)), LooseRecord(ComposerRelease).transform((map) => Object.values(map))]).catch([]); const ComposerPackagesResponse = z.object({ packageName: z.string(), packagesResponse: z.object({ packages: z.record(z.string(), z.unknown()) }) }).transform(({ packageName, packagesResponse }) => packagesResponse.packages[packageName]).transform((xs) => ComposerReleases.parse(xs)); function parsePackagesResponse(packageName, packagesResponse) { try { return ComposerPackagesResponse.parse({ packageName, packagesResponse }); } catch (err) { logger.debug({ packageName, err }, `Error parsing packagist response for ${packageName}`); return []; } } function extractReleaseResult(...composerReleasesArrays) { const releases = []; let homepage; let sourceUrl; for (const composerReleasesArray of composerReleasesArrays) for (const composerRelease of composerReleasesArray) { const dep = { version: composerRelease.version.replace(/^v/, ""), gitRef: composerRelease.version }; if (composerRelease.time) dep.releaseTimestamp = composerRelease.time; if (composerRelease.require?.php) dep.constraints = { php: [composerRelease.require.php] }; releases.push(dep); if (!homepage && composerRelease.homepage) homepage = composerRelease.homepage; if (!sourceUrl && composerRelease.source?.url) sourceUrl = composerRelease.source.url; } if (releases.length === 0) return null; const result = { releases }; if (homepage) result.homepage = homepage; if (sourceUrl) result.sourceUrl = sourceUrl; return result; } function extractDepReleases(composerReleases) { return extractReleaseResult(ComposerReleases.parse(composerReleases)); } function parsePackagesResponses(packageName, packagesResponses) { return extractReleaseResult(...packagesResponses.map((pkgResp) => parsePackagesResponse(packageName, pkgResp))); } const HashSpec = z.union([z.object({ sha256: z.string().nullable() }).transform(({ sha256 }) => ({ hash: sha256 })), z.object({ sha1: z.string().nullable() }).transform(({ sha1 }) => ({ hash: sha1 }))]); z.intersection(HashSpec, z.object({ key: z.string() })); const PackagesResponse = z.object({ packages: LooseRecord(ComposerReleases).catch({}) }); const PackagistFile = PackagesResponse.merge(z.object({ providers: LooseRecord(HashSpec).transform((x) => Object.fromEntries(Object.entries(x).map(([key, { hash }]) => [key, hash]))).catch({}) })); const RegistryMeta = z.record(z.string(), z.unknown()).catch({}).pipe(PackagistFile.merge(z.object({ ["includes"]: LooseRecord(HashSpec).transform((x) => Object.entries(x).map(([name, { hash }]) => ({ key: name, hash }))).catch([]), ["provider-includes"]: LooseRecord(HashSpec).transform((x) => Object.entries(x).map(([key, { hash }]) => ({ key, hash }))).catch([]), ["providers-lazy-url"]: z.string().nullable().catch(null), ["providers-url"]: z.string().nullable().catch(null), ["metadata-url"]: z.string().nullable().catch(null), ["available-packages"]: z.array(z.string()).nullable().catch(null) }))).transform(({ ["includes"]: includesFiles, ["packages"]: packages, ["provider-includes"]: files, ["providers"]: providerPackages, ["providers-lazy-url"]: providersLazyUrl, ["providers-url"]: providersUrl, ["metadata-url"]: metadataUrl, ["available-packages"]: availablePackages }) => ({ packages, includesFiles, providerPackages, files, providersUrl, providersLazyUrl, metadataUrl, includesPackages: {}, availablePackages })); //#endregion export { PackagesResponse, PackagistFile, RegistryMeta, extractDepReleases, parsePackagesResponses }; //# sourceMappingURL=schema.js.map