[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( fun buildNpmVersion(
includedVersions: List<String>, includedVersions: List<String>,
excludedVersions: List<String> excludedVersions: List<String>,
includedWithCaret: Boolean = false
): String { ): String {
val includedRange: NpmRange? = try { val includedRange: NpmRange? = try {
includedVersions includedVersions
.flatMap { versionToNpmRanges(it) } .flatMap { versionToNpmRanges(it) }
.map { if (includedWithCaret) it.caretizeSingleVersion() else it }
.reduce { acc: NpmRange, next: NpmRange -> .reduce { acc: NpmRange, next: NpmRange ->
val intersection = acc intersect next val intersection = acc intersect next
requireNotNull(intersection) { requireNotNull(intersection) {
@@ -39,6 +41,8 @@ fun buildNpmVersion(
includedRange!! includedRange!!
if (excludedVersions.isEmpty()) return includedRange.toString()
val excludedRanges: List<NpmRange> = try { val excludedRanges: List<NpmRange> = try {
excludedVersions excludedVersions
.flatMap { versionToNpmRanges(it) } .flatMap { versionToNpmRanges(it) }
@@ -56,3 +60,18 @@ fun buildNpmVersion(
.sortedBy { it.startVersion } .sortedBy { it.startVersion }
.joinToString(NpmRangeVisitor.OR) .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 } 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 = fun min(a: SemVer, b: SemVer): SemVer =
if (a < b) a else b if (a < b) a else b