renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
120 lines (119 loc) • 4.61 kB
JavaScript
import { LooseArray, LooseRecord, Toml } from "../../../util/schema-utils/index.js";
import { normalizePythonDepName } from "../../datasource/pypi/common.js";
import { PypiDatasource } from "../../datasource/pypi/index.js";
import { depTypes, pep508ToPackageDependency } from "./utils.js";
import { z } from "zod/v4";
//#region lib/modules/manager/pep621/schema.ts
function Pep508Dependency(depType) {
return z.string().transform((x, ctx) => {
const res = pep508ToPackageDependency(depType, x);
if (!res) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "should be a valid PEP508 dependency",
fatal: true
});
return z.NEVER;
}
return res;
});
}
function DependencyGroup(depType) {
return LooseRecord(LooseArray(Pep508Dependency(depType))).transform((depGroups) => {
const deps = [];
for (const [depGroup, groupDeps] of Object.entries(depGroups)) for (const dep of groupDeps) {
if (dep.packageName) dep.depName = dep.packageName;
dep.managerData = { depGroup };
deps.push(dep);
}
return deps;
});
}
const PdmConfig = z.object({
"dev-dependencies": DependencyGroup(depTypes.pdmDevDependencies).catch([]),
source: LooseArray(z.object({
url: z.string(),
name: z.string()
})).transform((pdmSource) => {
const registryUrls = [];
let containsPyPiUrl = false;
for (const source of pdmSource) {
if (source.name === "pypi") containsPyPiUrl = true;
registryUrls.push(source.url);
}
if (!containsPyPiUrl) registryUrls.unshift(PypiDatasource.defaultURL);
return registryUrls;
}).optional().catch(void 0)
}).transform(({ "dev-dependencies": devDependencies, source: registryUrls }) => ({
devDependencies,
registryUrls
}));
const HatchConfig = z.object({ envs: LooseRecord(z.string(), z.object({
dependencies: z.unknown().optional(),
"extra-dependencies": z.unknown().optional()
})) }).catch({ envs: {} }).transform(({ envs }) => {
const deps = [];
for (const [envName, { dependencies, "extra-dependencies": extraDependencies }] of Object.entries(envs)) {
const HatchDependency = LooseArray(Pep508Dependency(`tool.hatch.envs.${envName}`)).catch([]);
deps.push(...HatchDependency.parse(dependencies), ...HatchDependency.parse(extraDependencies));
}
return { deps };
});
const UvIndexSource = z.object({ index: z.string() });
const UvGitSource = z.object({
git: z.string(),
rev: z.string().optional(),
tag: z.string().optional(),
branch: z.string().optional()
});
const UvUrlSource = z.object({ url: z.string() });
const UvPathSource = z.object({ path: z.string() });
const UvWorkspaceSource = z.object({ workspace: z.literal(true) });
const UvSource = z.union([
UvIndexSource,
UvGitSource,
UvUrlSource,
UvPathSource,
UvWorkspaceSource
]);
const UvConfig = z.object({
"dev-dependencies": LooseArray(Pep508Dependency(depTypes.uvDevDependencies)).catch([]),
"required-version": z.string().optional(),
sources: LooseRecord(z.string().transform((source) => normalizePythonDepName(source)), UvSource).optional(),
index: z.array(z.object({
name: z.string().optional(),
url: z.string(),
default: z.boolean().default(false),
explicit: z.boolean().default(false)
})).optional()
});
const ProjectSection = z.object({
version: z.string().optional().catch(void 0),
"requires-python": z.string().optional().catch(void 0),
dependencies: LooseArray(Pep508Dependency(depTypes.dependencies)).catch([]),
"optional-dependencies": DependencyGroup(depTypes.optionalDependencies).catch([])
});
const PyProject = z.object({
project: ProjectSection.optional().catch(void 0),
"build-system": z.object({
requires: LooseArray(Pep508Dependency(depTypes.buildSystemRequires)).catch([]),
"build-backend": z.string().optional().catch(void 0)
}).optional().catch(void 0),
"dependency-groups": DependencyGroup(depTypes.dependencyGroups).catch([]),
tool: z.object({
pdm: PdmConfig.optional().catch(void 0),
hatch: HatchConfig.optional().catch(void 0),
uv: UvConfig.optional().catch(void 0)
}).optional().catch(void 0)
});
const PdmLockfile = Toml.pipe(z.object({ package: LooseArray(z.object({
name: z.string(),
version: z.string()
})) })).transform(({ package: pkg }) => Object.fromEntries(pkg.map(({ name, version }) => [name, version]))).transform((lock) => ({ lock }));
const UvLockfile = Toml.pipe(z.object({ package: LooseArray(z.object({
name: z.string(),
version: z.string()
})) })).transform(({ package: pkg }) => Object.fromEntries(pkg.map(({ name, version }) => [name, version])));
//#endregion
export { DependencyGroup, PdmLockfile, ProjectSection, PyProject, UvLockfile };
//# sourceMappingURL=schema.js.map