renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
119 lines (118 loc) • 3.48 kB
JavaScript
import { logger } from "../../../logger/index.js";
import { ensureTrailingSlash, isHttpUrl, joinUrlParts } from "../../../util/url.js";
import { coerceArray } from "../../../util/array.js";
import { getSiblingFileName, localPathExists } from "../../../util/fs/index.js";
import { Result } from "../../../util/result.js";
import { defaultRegistryUrl } from "../../datasource/conda/common.js";
import { PixiFile, PixiPyProject } from "./schema.js";
import { isString } from "@sindresorhus/is";
import { z } from "zod/v4";
//#region lib/modules/manager/pixi/extract.ts
function getUserPixiConfig(content, packageFile) {
if (packageFile === "pyproject.toml" || packageFile.endsWith("/pyproject.toml")) {
const { val, err } = Result.parse(content, PixiPyProject).unwrap();
if (err) {
logger.debug({
packageFile,
err
}, `error parsing ${packageFile}`);
return null;
}
return val.tool?.pixi ?? null;
}
if (packageFile === "pixi.toml" || packageFile.endsWith("/pixi.toml")) {
const { val, err } = Result.parse(content, PixiFile).unwrap();
if (err) {
logger.debug({
packageFile,
err
}, `error parsing ${packageFile}`);
return null;
}
return val;
}
const { val, err } = Result.parse(content, z.union([PixiFile, PixiPyProject.transform((p) => p.tool?.pixi)])).unwrap();
if (err) {
logger.debug({
packageFile,
err
}, `error parsing ${packageFile}`);
return null;
}
return val ?? null;
}
async function extractPackageFile(content, packageFile) {
logger.trace(`pixi.extractPackageFile(${packageFile})`);
const val = getUserPixiConfig(content, packageFile);
if (!val) return null;
const lockfileName = getSiblingFileName(packageFile, "pixi.lock");
const lockFiles = [];
if (await localPathExists(lockfileName)) lockFiles.push(lockfileName);
const project = val.project;
const channelPriority = project["channel-priority"];
let registryStrategy;
if (channelPriority === "disabled") registryStrategy = "merge";
const conda = [];
for (const item of val.conda) conda.push(addRegistryUrls({
...item,
channels: project.channels,
registryStrategy
}));
for (const item of val.feature.conda) conda.push(addRegistryUrls({
...item,
registryStrategy,
channels: [...coerceArray(item.channels), ...project.channels]
}));
return {
lockFiles,
deps: [
conda,
val.pypi,
val.feature.pypi
].flat()
};
}
function addRegistryUrls(item) {
const channels = orderChannels(item.channels);
if (item.channel) return {
...item,
channels,
registryUrls: [channelToRegistryUrl(item.channel)]
};
if (channels.length === 0) return {
...item,
channels,
skipStage: "extract",
skipReason: "unknown-registry"
};
const registryUrls = [];
for (const channel of channels) registryUrls.push(channelToRegistryUrl(channel));
return {
...item,
channels,
registryUrls
};
}
function channelToRegistryUrl(channel) {
if (isHttpUrl(channel)) return ensureTrailingSlash(channel);
return ensureTrailingSlash(joinUrlParts(defaultRegistryUrl, channel));
}
function orderChannels(channels = []) {
return channels.map((channel, index) => {
if (isString(channel)) return {
channel,
priority: 0,
index
};
return {
...channel,
index: 0
};
}).toSorted((a, b) => {
if (a.priority !== b.priority) return b.priority - a.priority;
return a.index - b.index;
}).map((c) => c.channel);
}
//#endregion
export { extractPackageFile, getUserPixiConfig };
//# sourceMappingURL=extract.js.map