renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
84 lines (83 loc) • 2.81 kB
JavaScript
import { regEx } from "../../../util/regex.js";
import { logger } from "../../../logger/index.js";
import { satisfies } from "@renovatebot/ruby-semver";
import { parse } from "@renovatebot/ruby-semver/dist/ruby/requirement.js";
import { create } from "@renovatebot/ruby-semver/dist/ruby/version.js";
//#region lib/modules/versioning/ruby/range.ts
const parse$1 = (range) => {
const regExp = regEx(/^(?<operator>[^\d\s]+)?(?<delimiter>\s*)(?<version>[0-9a-zA-Z-.]+)$/);
const value = (range || "").trim();
const match = regExp.exec(value);
if (match?.groups) {
const { version, operator = "", delimiter } = match.groups;
return {
version,
operator,
delimiter
};
}
return {
version: "",
operator: "",
delimiter: " "
};
};
/** Wrapper for {@link satisfies} for {@link Range} record. */
function satisfiesRange(ver, range) {
if (range.companion) return satisfies(ver, `${range.operator}${range.version}`) && satisfiesRange(ver, range.companion);
else return satisfies(ver, `${range.operator}${range.version}`);
}
/**
* Parses a comma-delimited list of range parts,
* with special treatment for a pair of `~>` and `>=` parts.
*/
function parseRanges(range) {
const originalRanges = range.split(",").map(parse$1);
const ranges = [];
for (let i = 0; i < originalRanges.length;) if (i + 1 < originalRanges.length && originalRanges[i].operator === "~>" && originalRanges[i + 1].operator === ">=") {
ranges.push({
...originalRanges[i],
companion: originalRanges[i + 1]
});
i += 2;
} else {
ranges.push(originalRanges[i]);
i++;
}
return ranges;
}
/**
* Stringifies a list of range parts into a comma-separated string,
* with special treatment for a pair of `~>` and `>=` parts.
*/
function stringifyRanges(ranges) {
return ranges.map((r) => {
if (r.companion) return `${r.operator}${r.delimiter}${r.version}, ${r.companion.operator}${r.companion.delimiter}${r.companion.version}`;
else return `${r.operator}${r.delimiter}${r.version}`;
}).join(", ");
}
const ltr = (version, range) => {
const gemVersion = create(version);
if (!gemVersion) {
logger.warn({ version }, `Invalid ruby version`);
return false;
}
return range.split(",").map(parse).map(([operator, ver]) => {
switch (operator) {
case ">":
case "<": return gemVersion.compare(ver) <= 0;
case ">=":
case "<=":
case "=":
case "!=": return gemVersion.compare(ver) < 0;
case "~>": return gemVersion.compare(ver) < 0 && gemVersion.release().compare(ver.bump()) <= 0;
// istanbul ignore next
default:
logger.warn({ operator }, `Unsupported operator`);
return false;
}
}).reduce((accumulator, value) => accumulator && value, true);
};
//#endregion
export { ltr, parse$1 as parse, parseRanges, satisfiesRange, stringifyRanges };
//# sourceMappingURL=range.js.map