diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index 19bd18f53f0..16efe2bd67d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -748,4 +748,34 @@ abstract class AbstractKotlin2JsGradlePluginIT(private val irBackend: Boolean) : assertFileVersion(libPackageJson, dependency) } } + + @Test + fun testYarnResolution() = with(Project("kotlin-js-yarn-resolutions")) { + setupWorkingDir() + gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + + fun assertYarnResolutions( + packageJson: PackageJson + ) { + val name = "lodash" + val version = packageJson.resolutions?.get(name) + val requiredVersion = ">=1.0.0 <1.2.1 || >1.4.0 <2.0.0" + assertTrue("Root package.json must have resolution $name with version $requiredVersion, but $version found") { + version == requiredVersion + } + } + + build("packageJson", "rootPackageJson", "kotlinNpmInstall") { + assertSuccessful() + + fun getPackageJson() = + fileInWorkingDir("build/js") + .resolve(NpmProject.PACKAGE_JSON) + .let { + Gson().fromJson(it.readText(), PackageJson::class.java) + } + + assertYarnResolutions(getPackageJson()) + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-yarn-resolutions/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-yarn-resolutions/build.gradle.kts new file mode 100644 index 00000000000..41602fe3972 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-yarn-resolutions/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + kotlin("js").version("") +} + +group = "com.example" +version = "1.0" + +repositories { + mavenLocal() + jcenter() +} + +dependencies { + constraints { + implementation(org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependencyConstraint(project, "lodash", "^1.0.0")) { + version { + reject("~1.2.1", "1.3.0 - 1.4.0") + } + } + } +} + +kotlin { + js { + useCommonJs() + nodejs { + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-yarn-resolutions/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-yarn-resolutions/settings.gradle.kts new file mode 100644 index 00000000000..2efc39ffb72 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-yarn-resolutions/settings.gradle.kts @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + } +} + +rootProject.name = "kotlin-js-dependencies-clash" + +include("base") +include("lib") \ No newline at end of file