From d4c0d62eebeaa74ea2aac8d1b45079a4f0a1bc11 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 5 Aug 2020 19:57:30 +0300 Subject: [PATCH] [Gradle, JS] Require version use caret ^KT-41054 fixed --- .../targets/js/npm/NpmVersionConstraint.kt | 6 +++++- .../gradle/targets/js/npm/NpmVersions.kt | 21 ++++++++++++++++++- .../kotlin/gradle/targets/js/npm/semver.kt | 9 ++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionConstraint.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionConstraint.kt index aba2905051c..e12f98d9f6a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionConstraint.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionConstraint.kt @@ -31,7 +31,11 @@ class NpmVersionConstraint( ) } - return buildNpmVersion(listOf(requiredVersion), rejectedVersions) + return buildNpmVersion( + listOf(requiredVersion), + rejectedVersions, + true + ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersions.kt index 63b9cc99382..3bdac971c11 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersions.kt @@ -21,11 +21,13 @@ fun versionToNpmRanges(version: String): List { fun buildNpmVersion( includedVersions: List, - excludedVersions: List + excludedVersions: List, + 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 = 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() + ) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/semver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/semver.kt index 28b39073653..cee961e6edf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/semver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/semver.kt @@ -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