[Gradle, JS] Require version use caret

^KT-41054 fixed
This commit is contained in:
Ilya Goncharov
2020-08-05 19:57:30 +03:00
parent 3ed42d394b
commit d4c0d62eeb
3 changed files with 34 additions and 2 deletions
@@ -31,7 +31,11 @@ class NpmVersionConstraint(
)
}
return buildNpmVersion(listOf(requiredVersion), rejectedVersions)
return buildNpmVersion(
listOf(requiredVersion),
rejectedVersions,
true
)
}
}
@@ -21,11 +21,13 @@ fun versionToNpmRanges(version: String): List<NpmRange> {
fun buildNpmVersion(
includedVersions: List<String>,
excludedVersions: List<String>
excludedVersions: List<String>,
includedWithCaret: Boolean = false
): String {
val includedRange: NpmRange? = try {
includedVersions
.flatMap { versionToNpmRanges(it) }
.map { if (includedWithCaret) it.caretizeSingleVersion() else it }
.reduce { acc: NpmRange, next: NpmRange ->
val intersection = acc intersect next
requireNotNull(intersection) {
@@ -39,6 +41,8 @@ fun buildNpmVersion(
includedRange!!
if (excludedVersions.isEmpty()) return includedRange.toString()
val excludedRanges: List<NpmRange> = try {
excludedVersions
.flatMap { versionToNpmRanges(it) }
@@ -55,4 +59,19 @@ fun buildNpmVersion(
.mapNotNull { it intersect includedRange }
.sortedBy { it.startVersion }
.joinToString(NpmRangeVisitor.OR)
}
private fun NpmRange.caretizeSingleVersion(): NpmRange {
if (startVersion?.toVersion() != endVersion?.toVersion() || !(startInclusive || endInclusive)) {
return this
}
return NpmRange(
startVersion = startVersion,
startInclusive = startInclusive,
endVersion = startVersion
?.toVersion()
?.incrementMajor()
?.toSemVer()
)
}
@@ -182,6 +182,15 @@ fun Version.toSemVer(): SemVer =
build = buildIdentifiers.joinToString(".").let { if (it.isNotEmpty()) it else null }
)
fun SemVer.toVersion(): Version =
Version.builder()
.major(major.toInt())
.minor(minor.toInt())
.patch(patch.toInt())
.preReleaseIdentifiers(preRelease?.split(".")?.map { Version.Identifier.fromString(it) } ?: emptyList())
.buildIdentifiers(build?.split(".")?.map { Version.Identifier.fromString(it) } ?: emptyList())
.build()
fun min(a: SemVer, b: SemVer): SemVer =
if (a < b) a else b