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 2fa05036392..9fdeb61933c 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 @@ -700,7 +700,7 @@ abstract class AbstractKotlin2JsGradlePluginIT(protected val irBackend: Boolean) build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") { val mapFilePath = subProject("app").projectPath .resolve("build/kotlin2js/app.js.map") - assertFileContains(mapFilePath,"\"../../src/main/kotlin/main.kt\"") + assertFileContains(mapFilePath, "\"../../src/main/kotlin/main.kt\"") if (irBackend) { // The IR BE generates correct paths for dependencies assertFileContains(mapFilePath, "\"../../../lib/src/main/kotlin/foo.kt\"") @@ -1713,4 +1713,175 @@ class GeneralKotlin2JsGradlePluginIT : KGPBaseTest() { } } } + + @DisplayName("Kotlin/JS DOM API extracting automatically added as dependency") + @GradleTest + fun testKotlinJsBuiltins(gradleVersion: GradleVersion) { + project("kotlin-js-dom-api-compat", gradleVersion) { + build("assemble") { + assertTasksExecuted(":compileKotlinJs") + } + + var added: String? = null + + buildGradleKts.modify { + it + "\n" + + """ + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-js") + } + """.trimIndent().also { added = it } + } + + build("assemble") { + assertTasksUpToDate(":compileKotlinJs") + } + + buildGradleKts.modify { + val replaced = it.replace(added!!, "") + replaced + "\n" + + """ + dependencies { + implementation("org.jetbrains.kotlin:kotlin-dom-api-compat") + } + """.trimIndent().also { added = it } + } + + build("assemble") { + assertTasksUpToDate(":compileKotlinJs") + } + + buildGradleKts.modify { + val replaced = it.replace(added!!, "") + replaced + "\n" + + """ + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-js") + implementation("org.jetbrains.kotlin:kotlin-dom-api-compat") + } + """.trimIndent().also { added = it } + } + + build("assemble") { + assertTasksUpToDate(":compileKotlinJs") + } + + buildGradleKts.modify { + val replaced = it.replace(added!!, "") + replaced + } + + gradleProperties.modify { + it + "\n" + + """ + kotlin.stdlib.default.dependency=false + """.trimIndent() + } + + buildAndFail("assemble") { + assertTasksFailed(":compileKotlinJs") + } + + buildGradleKts.modify { + it + "\n" + + """ + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-js") + } + """.trimIndent().also { added = it } + } + + buildAndFail("assemble") { + assertTasksFailed(":compileKotlinJs") + } + + buildGradleKts.modify { + val replaced = it.replace(added!!, "") + replaced + "\n" + + """ + dependencies { + implementation("org.jetbrains.kotlin:kotlin-dom-api-compat") + } + """.trimIndent().also { added = it } + } + + build("assemble") { + assertTasksExecuted(":compileKotlinJs") + } + + buildGradleKts.modify { + val replaced = it.replace(added!!, "") + replaced + "\n" + + """ + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-js") + implementation("org.jetbrains.kotlin:kotlin-dom-api-compat") + } + """.trimIndent().also { added = it } + } + + build("assemble") { + assertTasksUpToDate(":compileKotlinJs") + } + + buildGradleKts.modify { + val replaced = it.replace(added!!, "") + replaced + } + + gradleProperties.modify { + val replaced = it.replace( + "kotlin.stdlib.default.dependency=false", + "kotlin.js.stdlib.dom.api.included=false" + ) + replaced + } + + buildAndFail("assemble") { + assertTasksFailed(":compileKotlinJs") + } + + buildGradleKts.modify { + it + "\n" + + """ + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-js") + } + """.trimIndent().also { added = it } + } + + buildAndFail("assemble") { + assertTasksFailed(":compileKotlinJs") + } + + buildGradleKts.modify { + val replaced = it.replace(added!!, "") + replaced + "\n" + + """ + dependencies { + implementation("org.jetbrains.kotlin:kotlin-dom-api-compat") + } + """.trimIndent().also { added = it } + } + + build("assemble") { + assertTasksUpToDate(":compileKotlinJs") + } + + buildGradleKts.modify { + val replaced = it.replace(added!!, "") + replaced + "\n" + + """ + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-js") + implementation("org.jetbrains.kotlin:kotlin-dom-api-compat") + } + """.trimIndent().also { added = it } + } + + build("assemble") { + assertTasksUpToDate(":compileKotlinJs") + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-dom-api-compat/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-dom-api-compat/build.gradle.kts new file mode 100644 index 00000000000..4b8dc0085b4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-dom-api-compat/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + kotlin("js") +} + +repositories { + mavenCentral() + mavenLocal() +} + +kotlin { + js { + browser { + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-dom-api-compat/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-dom-api-compat/settings.gradle new file mode 100644 index 00000000000..e55d48c595a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-dom-api-compat/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "kotlin-js-browser" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-dom-api-compat/src/main/kotlin/App.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-dom-api-compat/src/main/kotlin/App.kt new file mode 100644 index 00000000000..75e83ecff53 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-dom-api-compat/src/main/kotlin/App.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package com.example + +fun main() { + org.w3c.performance.Performance::class.js + org.khronos.webgl.WebGLContextEvent + kotlinx.browser.window +} \ No newline at end of file