renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
91 lines (90 loc) • 4.24 kB
JavaScript
import { newlineRegex, regEx } from "../../../util/regex.js";
import { logger } from "../../../logger/index.js";
import { findLocalSiblingOrParent, readLocalFile } from "../../../util/fs/index.js";
import { GitTagsDatasource } from "../../datasource/git-tags/index.js";
import { GithubTagsDatasource } from "../../datasource/github-tags/index.js";
import { HexDatasource } from "../../datasource/hex/index.js";
//#region lib/modules/manager/mix/extract.ts
const depSectionRegExp = regEx(/defp\s+deps.*do/g);
const depMatchRegExp = regEx(/{:(?<app>\w+)(\s*,\s*"(?<requirement>[^"]+)")?(\s*,\s*(?<opts>[^}]+))?}/gm);
const gitRegexp = regEx(/git:\s*"(?<value>[^"]+)"/);
const githubRegexp = regEx(/github:\s*"(?<value>[^"]+)"/);
const refRegexp = regEx(/ref:\s*"(?<value>[^"]+)"/);
const branchOrTagRegexp = regEx(/(?:branch|tag):\s*"(?<value>[^"]+)"/);
const organizationRegexp = regEx(/organization:\s*"(?<value>[^"]+)"/);
const commentMatchRegExp = regEx(/#.*$/);
const lockedVersionRegExp = regEx(/^\s+"(?<app>\w+)".*?"(?<lockedVersion>\d+\.\d+\.\d+)"/);
const hexRegexp = regEx(/hex:\s*(?:"(?<strValue>[^"]+)"|:(?<atomValue>\w+))/);
const onlyValueRegexp = regEx(/only:\s*(?<only>\[[^\]]*\]|:\w+)/);
const onlyEnvironmentsRegexp = regEx(/:(\w+)/gm);
async function extractPackageFile(content, packageFile) {
logger.trace(`mix.extractPackageFile(${packageFile})`);
const deps = /* @__PURE__ */ new Map();
const contentArr = content.split(newlineRegex).map((line) => line.replace(commentMatchRegExp, ""));
for (let lineNumber = 0; lineNumber < contentArr.length; lineNumber += 1) if (contentArr[lineNumber].match(depSectionRegExp)) {
let depBuffer = "";
do {
depBuffer += `${contentArr[lineNumber]}\n`;
lineNumber += 1;
} while (contentArr[lineNumber].trim() !== "end");
let depMatchGroups = depMatchRegExp.exec(depBuffer)?.groups;
while (depMatchGroups) {
const { app, requirement, opts } = depMatchGroups;
const github = githubRegexp.exec(opts)?.groups?.value;
const git = gitRegexp.exec(opts)?.groups?.value;
const ref = refRegexp.exec(opts)?.groups?.value;
const branchOrTag = branchOrTagRegexp.exec(opts)?.groups?.value;
const organization = organizationRegexp.exec(opts)?.groups?.value;
const hexGroups = hexRegexp.exec(opts)?.groups;
const hex = hexGroups?.strValue ?? hexGroups?.atomValue;
const onlyValue = onlyValueRegexp.exec(opts)?.groups?.only;
const onlyEnvironments = [];
let match;
if (onlyValue) while ((match = onlyEnvironmentsRegexp.exec(onlyValue)) !== null) onlyEnvironments.push(match[1]);
const dep = {
depName: app,
depType: "prod"
};
if (git ?? github) {
dep.currentDigest = ref;
dep.currentValue = branchOrTag;
dep.datasource = git ? GitTagsDatasource.id : GithubTagsDatasource.id;
dep.packageName = git ?? github;
} else {
dep.currentValue = requirement;
dep.datasource = HexDatasource.id;
if (organization) dep.packageName = `${app}:${organization}`;
else if (hex) dep.packageName = hex;
else dep.packageName = app;
if (requirement?.startsWith("==")) dep.currentVersion = requirement.replace(regEx(/^==\s*/), "");
}
if (onlyValue !== void 0 && !onlyEnvironments.includes("prod")) dep.depType = "dev";
deps.set(app, dep);
logger.trace({ dep }, `setting ${app}`);
depMatchGroups = depMatchRegExp.exec(depBuffer)?.groups;
}
}
const lockFileName = await findLocalSiblingOrParent(packageFile, "mix.lock") ?? "mix.lock";
const lockFileContent = await readLocalFile(lockFileName, "utf8");
if (lockFileContent) {
const lockFileLines = lockFileContent.split(newlineRegex).slice(1, -1);
for (const line of lockFileLines) {
const groups = lockedVersionRegExp.exec(line)?.groups;
if (groups?.app && groups?.lockedVersion) {
const dep = deps.get(groups.app);
if (!dep) continue;
dep.lockedVersion = groups.lockedVersion;
logger.trace(`Found ${groups.lockedVersion} for ${groups.app}`);
}
}
}
const depsArray = Array.from(deps.values());
if (depsArray.length === 0) return null;
return {
deps: depsArray,
lockFiles: lockFileContent ? [lockFileName] : void 0
};
}
//#endregion
export { extractPackageFile };
//# sourceMappingURL=extract.js.map