[Manager] Compatibility Detection Logic (#4348)

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Jin Yi
2025-07-08 06:44:53 +09:00
parent 6ffba22663
commit 4b6739c6fb
8 changed files with 2809 additions and 61 deletions

80
src/utils/versionUtil.ts Normal file
View File

@@ -0,0 +1,80 @@
import * as semver from 'semver'
/**
* Cleans a version string by removing common prefixes and normalizing format
* @param version Raw version string (e.g., "v1.2.3", "1.2.3-alpha")
* @returns Cleaned version string or original if cleaning fails
*/
export function cleanVersion(version: string): string {
return semver.clean(version) || version
}
/**
* Checks if a version satisfies a version range
* @param version Current version
* @param range Version range (e.g., ">=1.0.0", "^1.2.0", "1.0.0 - 2.0.0")
* @returns true if version satisfies the range
*/
export function satisfiesVersion(version: string, range: string): boolean {
try {
const cleanedVersion = cleanVersion(version)
return semver.satisfies(cleanedVersion, range)
} catch {
return false
}
}
/**
* Compares two versions and returns the difference type
* @param version1 First version
* @param version2 Second version
* @returns Difference type or null if comparison fails
*/
export function getVersionDifference(
version1: string,
version2: string
): semver.ReleaseType | null {
try {
const clean1 = cleanVersion(version1)
const clean2 = cleanVersion(version2)
return semver.diff(clean1, clean2)
} catch {
return null
}
}
/**
* Checks if a version is valid according to semver
* @param version Version string to validate
* @returns true if version is valid
*/
export function isValidVersion(version: string): boolean {
return semver.valid(version) !== null
}
/**
* Gets a human-readable description of a version range
* @param range Version range string
* @returns Description of what the range means
*/
export function describeVersionRange(range: string): string {
if (range.startsWith('>=')) {
return `version ${range.substring(2)} or higher`
} else if (range.startsWith('>')) {
return `version higher than ${range.substring(1)}`
} else if (range.startsWith('<=')) {
return `version ${range.substring(2)} or lower`
} else if (range.startsWith('<')) {
return `version lower than ${range.substring(1)}`
} else if (range.startsWith('^')) {
return `compatible with version ${range.substring(1)}`
} else if (range.startsWith('~')) {
return `approximately version ${range.substring(1)}`
} else if (range.includes(' - ')) {
const [min, max] = range.split(' - ')
return `version between ${min} and ${max}`
} else if (range.includes('||')) {
return `one of multiple version ranges: ${range}`
}
return `version ${range}`
}