import type { RangeStrategy } from '../../../types/versioning.ts'; import { TYPE_QUALIFIER, autoExtendMavenRange, isSubversion, tokenize, } from '../maven/compare.ts'; import maven from '../maven/index.ts'; import type { NewValueConfig, VersioningApi } from '../types.ts'; import { LATEST_REGEX, REV_TYPE_LATEST, REV_TYPE_SUBREV, parseDynamicRevision, } from './parse.ts'; export const id = 'ivy'; export const displayName = 'Ivy'; export const urls = ['[Apache Ivy](https://ant.apache.org/ivy/)']; export const supportsRanges = true; export const supportedRangeStrategies: RangeStrategy[] = [ 'bump', 'widen', 'replace', ]; /* oxlint-disable typescript/unbound-method */ const { equals, getMajor, getMinor, getPatch, isGreaterThan, isStable, matches: mavenMatches, sortVersions, } = maven; /* oxlint-enable typescript/unbound-method */ function isValid(str: string): boolean { if (!str) { return false; } if (LATEST_REGEX.test(str)) { return true; } return isVersion(str) || !!parseDynamicRevision(str); } function isVersion(str: string): boolean { if (!str) { return false; } if (LATEST_REGEX.test(str)) { return false; } if (str.includes('+')) { return false; } return maven.isVersion(str); } function matches(a: string, b: string): boolean { if (!a || !b) { return false; } const dynamicRevision = parseDynamicRevision(b); if (!dynamicRevision) { return equals(a, b); } const { type, value } = dynamicRevision; if (type === REV_TYPE_LATEST) { if (!value) { return true; } const tokens = tokenize(a); if (tokens.length) { const token = tokens.at(-1)!; if (token.type === TYPE_QUALIFIER) { return token.val.toLowerCase() === value; } } return false; } if (type === REV_TYPE_SUBREV) { return isSubversion(value, a); } return mavenMatches(a, value); } function getSatisfyingVersion( versions: string[], range: string, ): string | null { return versions.reduce((result: string | null, version) => { if (matches(version, range)) { if (!result) { return version; } if (isGreaterThan(version, result)) { return version; } } return result; }, null); } function getNewValue({ currentValue, newVersion, }: NewValueConfig): string | null { if (isVersion(currentValue)) { return newVersion; } return autoExtendMavenRange(currentValue, newVersion); } function isCompatible(version: string): boolean { return isVersion(version); } function isSingleVersion(version: string): boolean { return isVersion(version); } export const api: VersioningApi = { equals, getMajor, getMinor, getPatch, isCompatible, isGreaterThan, isSingleVersion, isStable, isValid, isVersion, matches, getSatisfyingVersion, minSatisfyingVersion: getSatisfyingVersion, getNewValue, sortVersions, }; export default api;