UNPKG

renovate

Version:

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

227 lines (226 loc) • 6.73 kB
import { parseVersion } from "../nuget/parser.js"; import { compare, sameReleaseParts } from "./version.js"; import { adaptToPrecision, bumpAtPrecision, ensurePrereleaseMatches, intervalOf, isLessThanLowerBound, matches as matches$1, parseRange, rangeToString, releaseParts, twiddle } from "./range.js"; //#region lib/modules/versioning/paket/index.ts const id = "paket"; function isVersion(input) { return !!input && parseVersion(input) !== null; } function isValid(input) { return parseRange(input) !== null; } function isSingleVersionRange(range) { if (range.constraints.length !== 1 || range.prereleaseTags.length > 0) return false; const { operator } = range.constraints[0]; return operator === "" || operator === "=" || operator === "=="; } function isSingleVersion(input) { const range = parseRange(input); return !!range && isSingleVersionRange(range); } function isStable(input) { const version = parseVersion(input); if (version) return !version.prerelease; const range = parseRange(input); return !!range && isSingleVersionRange(range) && !range.constraints[0].version.prerelease; } function isCompatible(version) { return isVersion(version); } function getMajor(version) { return parseVersion(version)?.major ?? null; } function getMinor(version) { return parseVersion(version)?.minor ?? null; } function getPatch(version) { return parseVersion(version)?.patch ?? null; } function compareVersions(version, other) { const x = parseVersion(version); const y = parseVersion(other); return x && y ? compare(x, y) : null; } function equals(version, other) { return compareVersions(version, other) === 0; } function isGreaterThan(version, other) { const cmp = compareVersions(version, other); return cmp !== null && cmp > 0; } function sortVersions(version, other) { return compareVersions(version, other) ?? 0; } function matches(version, range) { const v = parseVersion(version); const r = parseRange(range); return !!v && !!r && matches$1(v, r); } function isLessThanRange(version, range) { const v = parseVersion(version); const r = parseRange(range); return !!v && !!r && isLessThanLowerBound(v, r); } function satisfyingVersions(versions, range) { return versions.filter((v) => matches(v, range)).sort(sortVersions); } function getSatisfyingVersion(versions, range) { return satisfyingVersions(versions, range).pop() ?? null; } function minSatisfyingVersion(versions, range) { return satisfyingVersions(versions, range).shift() ?? null; } function getPinnedValue(newVersion) { return newVersion; } function replaceConstraint(constraint, v) { const { operator, version } = constraint; switch (operator) { case "": case "=": case "==": return { operator, version: v }; case ">": case ">=": return constraint; case "<=": return compare(v, version) > 0 ? { operator, version: v } : constraint; case "<": return compare(v, version) >= 0 || sameReleaseParts(v, version) ? { operator, version: bumpAtPrecision(v, releaseParts(version).length) } : constraint; case "~>": { const cap = twiddle(version); return compare(v, cap) >= 0 || sameReleaseParts(v, cap) ? { operator, version: adaptToPrecision(v, releaseParts(version).length) } : constraint; } } } /** * Rewrite `~> band` optionally followed by a `>=`/`>` floor: the band follows * the new version at its old precision, and the floor sticks to the exact new * version unless it becomes redundant. */ function pessimisticWithFloor(range, v) { const [pessimistic] = range.constraints; const band = adaptToPrecision(v, releaseParts(pessimistic.version).length); const constraints = compare(band, v) === 0 ? [{ operator: "~>", version: band }] : [{ operator: "~>", version: band }, { operator: ">=", version: v }]; return { ...range, constraints }; } function replaceRange(range, v) { const [first, second] = range.constraints; if (first.operator === "~>" && (second?.operator === ">" || second?.operator === ">=")) return pessimisticWithFloor(range, v); return { ...range, constraints: range.constraints.map((c) => replaceConstraint(c, v)) }; } function bumpConstraint(constraint, v) { const { operator, version } = constraint; switch (operator) { case ">=": return compare(v, version) > 0 ? { operator, version: v } : constraint; case ">": return { operator: ">=", version: v }; case "~>": { const adapted = adaptToPrecision(v, releaseParts(version).length); return compare(adapted, version) > 0 ? { operator, version: adapted } : constraint; } default: return replaceConstraint(constraint, v); } } function bumpRange(range, v) { const [first, second] = range.constraints; if (first.operator === "~>" && second?.operator !== "<" && second?.operator !== "<=") return pessimisticWithFloor(range, v); return { ...range, constraints: range.constraints.map((c) => bumpConstraint(c, v)) }; } function widenRange(range, v) { const interval = intervalOf(range.constraints); const [first] = range.constraints; if (interval.kind !== "range" || first.operator !== "~>") return { ...range, constraints: range.constraints.map((c) => replaceConstraint(c, v)) }; const { from, fromInclusive, to, toInclusive } = interval; if (!(toInclusive ? compare(v, to) > 0 : compare(v, to) >= 0 || sameReleaseParts(v, to))) return range; const lower = { operator: fromInclusive ? ">=" : ">", version: from }; const upper = toInclusive ? { operator: "<=", version: v } : { operator: "<", version: bumpAtPrecision(v, releaseParts(to).length) }; return { ...range, constraints: [lower, upper] }; } function getNewValue({ currentValue, rangeStrategy, newVersion }) { const v = parseVersion(newVersion); if (!v) return null; if (isVersion(currentValue)) return newVersion; const range = parseRange(currentValue); if (!range) return null; if (rangeStrategy === "pin") return `${range.strategy ?? ""}${newVersion}`; if (isLessThanLowerBound(v, range)) return currentValue; let result; if (rangeStrategy === "bump") result = bumpRange(range, v); else if (matches$1(v, range)) return currentValue; else if (rangeStrategy === "widen") result = widenRange(range, v); else result = replaceRange(range, v); const newValue = rangeToString(ensurePrereleaseMatches(result, v)); return newValue === rangeToString(range) ? currentValue : newValue; } const api = { equals, getMajor, getMinor, getPatch, getNewValue, getPinnedValue, getSatisfyingVersion, minSatisfyingVersion, isCompatible, isGreaterThan, isLessThanRange, isSingleVersion, isStable, isValid, isVersion, matches, sortVersions }; //#endregion export { api, api as default, id }; //# sourceMappingURL=index.js.map