diff --git a/libraries/kotlin.test/wasm/build.gradle.kts b/libraries/kotlin.test/wasm/build.gradle.kts index 747cb7fbbed..0975de6bbd6 100644 --- a/libraries/kotlin.test/wasm/build.gradle.kts +++ b/libraries/kotlin.test/wasm/build.gradle.kts @@ -13,8 +13,9 @@ val commonMainSources by task { } kotlin { + @Suppress("DEPRECATION") @OptIn(org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl::class) - wasm { + wasm("wasm") { nodejs() } diff --git a/libraries/stdlib/wasm/build.gradle.kts b/libraries/stdlib/wasm/build.gradle.kts index de5c72e5dae..bf4541514d4 100644 --- a/libraries/stdlib/wasm/build.gradle.kts +++ b/libraries/stdlib/wasm/build.gradle.kts @@ -78,8 +78,9 @@ val commonTestSources by task { D8RootPlugin.apply(rootProject).version = v8Version kotlin { + @Suppress("DEPRECATION") @OptIn(org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl::class) - wasm { + wasm("wasm") { d8() } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt new file mode 100644 index 00000000000..e0a59c93a23 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2020 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 org.jetbrains.kotlin.gradle + +import com.google.gson.Gson +import com.google.gson.JsonNull +import com.google.gson.JsonObject +import org.gradle.testkit.runner.BuildResult +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution +import org.jetbrains.kotlin.gradle.targets.js.ir.KLIB_TYPE +import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject +import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson +import org.jetbrains.kotlin.gradle.targets.js.npm.fromSrcPackageJson +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.STORE_YARN_LOCK_NAME +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.UPGRADE_YARN_LOCK +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.YARN_LOCK_MISMATCH_MESSAGE +import org.jetbrains.kotlin.gradle.tasks.USING_JS_IR_BACKEND_MESSAGE +import org.jetbrains.kotlin.gradle.testbase.* +import org.jetbrains.kotlin.gradle.testbase.TestVersions.Gradle.G_7_6 +import org.jetbrains.kotlin.gradle.util.modify +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.condition.DisabledIf +import java.nio.file.Files +import java.util.zip.ZipFile +import kotlin.io.path.* +import kotlin.streams.toList +import kotlin.test.* + +@MppGradlePluginTests +class KotlinWasmGradlePluginIT : KGPBaseTest() { + + @DisplayName("Check wasi target") + @GradleTest + fun wasiTarget(gradleVersion: GradleVersion) { + project("new-mpp-wasm-wasi-test", gradleVersion) { + buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) + + buildAndFail(":wasmWasiTest") { + assertTasksExecuted(":compileKotlinWasmWasi") + assertTasksFailed(":wasmWasiNodeTest") + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index fb91902177b..84287c24bee 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -1426,7 +1426,7 @@ open class NewMultiplatformIT : BaseGradleIT() { } val expectedDefaultSourceSets = listOf( - "jvm6", "nodeJs", "mingw64", "linux64", "macos64", "wasm" + "jvm6", "nodeJs", "mingw64", "linux64", "macos64", "wasmJs" ).flatMapTo(mutableSetOf()) { target -> listOf("main", "test").map { compilation -> Triple( @@ -1805,7 +1805,7 @@ open class NewMultiplatformIT : BaseGradleIT() { build("build") { assertSuccessful() assertTasksExecuted(":compileKotlinJs") - assertTasksExecuted(":compileKotlinWasm") + assertTasksExecuted(":compileKotlinWasmJs") val outputPrefix = "build/js/packages/" @@ -1827,17 +1827,17 @@ open class NewMultiplatformIT : BaseGradleIT() { .replace("", engine) .replace("", if (useBinaryen) "applyBinaryen()" else "") } - build(":wasm${name}Test") { - assertTasksExecuted(":compileKotlinWasm") + build(":wasmJs${name}Test") { + assertTasksExecuted(":compileKotlinWasmJs") if (useBinaryen) { - assertTasksExecuted(":compileTestDevelopmentExecutableKotlinWasmOptimize") + assertTasksExecuted(":compileTestDevelopmentExecutableKotlinWasmJsOptimize") } else { - assertTasksNotExecuted(":compileTestDevelopmentExecutableKotlinWasmOptimize") + assertTasksNotExecuted(":compileTestDevelopmentExecutableKotlinWasmJsOptimize") } - assertTasksFailed(":wasm${name}Test") + assertTasksFailed(":wasmJs${name}Test") assertTestResults( "testProject/new-mpp-wasm-test/TEST-${engine}.xml", - "wasm${name}Test" + "wasmJs${name}Test" ) } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/WasmConfigurationCacheIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/WasmConfigurationCacheIT.kt index f1f3e9effee..82be2be29d0 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/WasmConfigurationCacheIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/WasmConfigurationCacheIT.kt @@ -23,7 +23,7 @@ class WasmConfigurationCacheIT : KGPBaseTest() { assertSimpleConfigurationCacheScenarioWorks( "assemble", buildOptions = defaultBuildOptions, - executedTaskNames = listOf(":compileKotlinWasm") + executedTaskNames = listOf(":compileKotlinWasmJs") ) } } @@ -33,10 +33,10 @@ class WasmConfigurationCacheIT : KGPBaseTest() { @GradleTestVersions(minVersion = TestVersions.Gradle.G_7_6) fun testD8Run(gradleVersion: GradleVersion) { project("wasm-d8-simple-project", gradleVersion) { - build("wasmD8Run", buildOptions = buildOptions) { - assertTasksExecuted(":wasmD8Run") + build("wasmJsD8Run", buildOptions = buildOptions) { + assertTasksExecuted(":wasmJsD8Run") assertOutputContains( - "Calculating task graph as no configuration cache is available for tasks: wasmD8Run" + "Calculating task graph as no configuration cache is available for tasks: wasmJsD8Run" ) assertConfigurationCacheStored() @@ -45,8 +45,8 @@ class WasmConfigurationCacheIT : KGPBaseTest() { build("clean", buildOptions = buildOptions) // Then run a build where tasks states are deserialized to check that they work correctly in this mode - build("wasmD8Run", buildOptions = buildOptions) { - assertTasksExecuted(":wasmD8Run") + build("wasmJsD8Run", buildOptions = buildOptions) { + assertTasksExecuted(":wasmJsD8Run") assertConfigurationCacheReused() } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/experimental/TryK2IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/experimental/TryK2IT.kt index 75503f514f8..7c3a9314e31 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/experimental/TryK2IT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/experimental/TryK2IT.kt @@ -155,10 +155,10 @@ class TryK2IT : KGPBaseTest() { assertCompilerArgument(":compileKotlinJs", "-language-version 2.0") } - build(":compileKotlinWasm") { - assertTasksExecuted(":compileKotlinWasm") + build(":compileKotlinWasmJs") { + assertTasksExecuted(":compileKotlinWasmJs") - assertCompilerArgument(":compileKotlinWasm", "-language-version 2.0") + assertCompilerArgument(":compileKotlinWasmJs", "-language-version 2.0") } build(":compileKotlinLinuxX64") { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/build.gradle.kts index eafbff67615..e063aa85fdf 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/build.gradle.kts @@ -24,7 +24,7 @@ kotlin { } val linux64 = linuxX64("linux64") - wasm { + wasmJs { } configure(listOf(linux64)) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/src/wasm/kotlin/KotlinWasmUsage.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/src/wasmJs/kotlin/KotlinWasmUsage.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/src/wasm/kotlin/KotlinWasmUsage.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app-gradle-kotlin-dsl/src/wasmJs/kotlin/KotlinWasmUsage.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/build.gradle index 94786e60141..dfb274c0755 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/build.gradle @@ -52,7 +52,7 @@ kotlin { } } - wasm() + wasmJs() targets { fromPreset(presets.jvm, 'jvm6') { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/src/wasm/kotlin/KotlinWasmUsage.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/src/wasmJs/kotlin/KotlinWasmUsage.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/src/wasm/kotlin/KotlinWasmUsage.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-app/src/wasmJs/kotlin/KotlinWasmUsage.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/build.gradle index 1137d824c3c..567d7fbbbf4 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/build.gradle @@ -22,7 +22,7 @@ kotlin { // Check the new preset functions: jvm('jvm6') { } js('nodeJs') - wasm() + wasmJs() targetFromPreset(presets.jvm, 'jvm6') { println targetName } // access existing target targets { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmJsMain/kotlin/Main.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/kotlin/Main.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmJsMain/kotlin/Main.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/resources/wasmMainResource.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmJsMain/resources/wasmMainResource.txt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmMain/resources/wasmMainResource.txt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-external-lib/src/wasmJsMain/resources/wasmMainResource.txt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/build.gradle.kts index 61596812abd..ff37c8d8880 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/build.gradle.kts @@ -21,7 +21,7 @@ kotlin { } else null linuxX64("linux64") if (shouldBeJs) - wasm() + wasmJs() targets.all { mavenPublication(Action { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmJsMain/kotlin/Main.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/kotlin/Main.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmJsMain/kotlin/Main.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/resources/wasmMainResource.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmJsMain/resources/wasmMainResource.txt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmMain/resources/wasmMainResource.txt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib-gradle-kotlin-dsl/src/wasmJsMain/resources/wasmMainResource.txt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/build.gradle index 6f583904819..27d1cf00e8d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/build.gradle @@ -29,7 +29,7 @@ kotlin { } } - wasm() + wasmJs() } targetFromPreset(presets.jvm, 'jvm6') { println targetName } // access existing target diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmJsMain/kotlin/Main.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/kotlin/Main.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmJsMain/kotlin/Main.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/resources/wasmMainResource.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmJsMain/resources/wasmMainResource.txt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmMain/resources/wasmMainResource.txt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-lib/src/wasmJsMain/resources/wasmMainResource.txt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-published/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-published/build.gradle.kts index 4ce5dab77d6..a9160650b8a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-published/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-published/build.gradle.kts @@ -16,7 +16,7 @@ kotlin { jvm() js() linuxX64() - wasm() + wasmJs() sourceSets { val commonMain by getting { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/build.gradle.kts index 084b0fca95f..35355ec7d5a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/build.gradle.kts @@ -8,7 +8,7 @@ repositories { } kotlin { - wasm { + wasmJs { moduleName = "redefined-wasm-module-name" d8 { } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/wasmMain/kotlin/foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/wasmJsMain/kotlin/foo.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/wasmMain/kotlin/foo.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-js/src/wasmJsMain/kotlin/foo.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/TEST-d8.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/TEST-d8.xml index de27e87dead..5b4215bf55e 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/TEST-d8.xml +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/TEST-d8.xml @@ -2,13 +2,13 @@ - + ... - + - + ... @@ -16,13 +16,13 @@ - + - + - + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/TEST-nodejs.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/TEST-nodejs.xml index 3255a20757d..dc0bebbc374 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/TEST-nodejs.xml +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/TEST-nodejs.xml @@ -2,13 +2,13 @@ - + ... - + - + ... @@ -16,13 +16,13 @@ - + - + - + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/build.gradle.kts index 88ad74e8da5..12026b101a1 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/build.gradle.kts @@ -29,7 +29,7 @@ tasks.named("kotli } kotlin { - wasm { + wasmJs { { testTask { filter.apply { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/src/wasmMain/kotlin/foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/src/wasmJsMain/kotlin/foo.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/src/wasmMain/kotlin/foo.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/src/wasmJsMain/kotlin/foo.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/src/wasmTest/kotlin/Test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/src/wasmJsTest/kotlin/Test.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/src/wasmTest/kotlin/Test.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-test/src/wasmJsTest/kotlin/Test.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/build.gradle.kts new file mode 100644 index 00000000000..285f5185dc2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + kotlin("multiplatform").version("") +} + +with(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.apply(rootProject)) { + nodeVersion = "20.2.0" +} + +with(org.jetbrains.kotlin.gradle.targets.js.d8.D8RootPlugin.apply(rootProject)) { + // Test that we can set the version and it is a String. + // But use the default version since update this place every time anyway. + version = (version as String) +} + +allprojects.forEach { + it.tasks.withType().configureEach { + args.add("--ignore-engines") + } +} + +tasks.named("kotlinStoreYarnLock") { + //A little hacky way to make yarn results + inputFile.fileValue(projectDir.resolve("yarnLockStub")) +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + + wasmWasi { + nodejs {} + } + + sourceSets { + commonTest { + dependencies { + implementation("org.jetbrains.kotlin:kotlin-test") + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/gradle.properties new file mode 100644 index 00000000000..cc1416ef297 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/gradle.properties @@ -0,0 +1 @@ +kotlin.tests.individualTaskReports=true diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiMain/kotlin/foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiMain/kotlin/foo.kt new file mode 100644 index 00000000000..73880e2f2b0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiMain/kotlin/foo.kt @@ -0,0 +1,3 @@ +package my.pack.name + +fun foo(): Int = 2 \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiTest/kotlin/Test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiTest/kotlin/Test.kt new file mode 100644 index 00000000000..6c141257f96 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiTest/kotlin/Test.kt @@ -0,0 +1,30 @@ +package my.pack.name + +import kotlin.test.Ignore +import kotlin.test.Test +import kotlin.test.assertEquals + +class WasmTest { + @Test + fun test1() = assertEquals(foo(), 1) + + @Test + @Ignore + fun test2() = assertEquals(foo(), 2) + + @Test + fun test3() = assertEquals(foo(), 3) + + @Ignore + class InnerIgnored { + @Test + fun test4() = assertEquals(foo(), 1) + + @Test + @Ignore + fun test5() = assertEquals(foo(), 2) + + @Test + fun test6() = assertEquals(foo(), 3) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/yarnLockStub b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/yarnLockStub new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/build.gradle.kts index d70aa20233d..8a689bca091 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/build.gradle.kts @@ -8,7 +8,7 @@ repositories { } kotlin { - wasm { + wasmJs { binaries.executable() d8 { } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/src/wasmMain/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/src/wasmJsMain/kotlin/A.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/src/wasmMain/kotlin/A.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/src/wasmJsMain/kotlin/A.kt diff --git a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api index efa79372edb..e90b5df8121 100644 --- a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api +++ b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api @@ -188,16 +188,26 @@ public abstract class org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtensi public fun tvosX64 (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinNativeTargetWithSimulatorTests; public fun tvosX64 (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinNativeTargetWithSimulatorTests; public fun tvosX64 (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinNativeTargetWithSimulatorTests; - public fun wasm ()Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; - public fun wasm (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; - public fun wasm (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; - public fun wasm (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; - public fun wasm (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; + public fun wasm ()Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasm (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasm (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasm (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasm (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; public fun wasm32 ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinNativeTarget; public fun wasm32 (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinNativeTarget; public fun wasm32 (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinNativeTarget; public fun wasm32 (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinNativeTarget; public fun wasm32 (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinNativeTarget; + public fun wasmJs ()Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasmJs (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasmJs (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasmJs (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasmJs (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasmWasi ()Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public fun wasmWasi (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl; + public fun wasmWasi (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl; + public fun wasmWasi (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl; + public fun wasmWasi (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl; public fun watchos ()V public fun watchos (Ljava/lang/String;)V public fun watchos (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V @@ -459,11 +469,21 @@ public abstract interface class org/jetbrains/kotlin/gradle/dsl/KotlinTargetCont } public abstract interface class org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithWasmPresetFunctions : org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions { - public abstract fun wasm ()Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; - public abstract fun wasm (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; - public abstract fun wasm (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; - public abstract fun wasm (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; - public abstract fun wasm (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl; + public abstract fun wasm ()Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasm (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasm (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasm (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasm (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasmJs ()Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasmJs (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasmJs (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasmJs (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasmJs (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasmWasi ()Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl; + public abstract fun wasmWasi (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl; + public abstract fun wasmWasi (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl; + public abstract fun wasmWasi (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl; + public abstract fun wasmWasi (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl; } public abstract interface class org/jetbrains/kotlin/gradle/dsl/TargetsFromPresetExtension : org/gradle/api/NamedDomainObjectCollection { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithWasmPresetFunctions.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithWasmPresetFunctions.kt index 24382f01666..e0bc853f4ea 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithWasmPresetFunctions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithWasmPresetFunctions.kt @@ -7,33 +7,80 @@ package org.jetbrains.kotlin.gradle.dsl import org.gradle.api.Action import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl -import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl -import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinWasmTargetDsl +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinWasmJsTargetDsl +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinWasmWasiTargetDsl import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinWasmTargetPreset @KotlinGradlePluginDsl interface KotlinTargetContainerWithWasmPresetFunctions : KotlinTargetContainerWithPresetFunctions { @ExperimentalWasmDsl - fun wasm( - name: String = "wasm", - configure: KotlinWasmTargetDsl.() -> Unit = { } - ): KotlinJsTargetDsl = + fun wasmJs( + name: String = "wasmJs", + configure: KotlinWasmJsTargetDsl.() -> Unit = { }, + ): KotlinWasmJsTargetDsl = configureOrCreate( name, @Suppress("DEPRECATION") - presets.getByName("wasm") as KotlinWasmTargetPreset, + presets.getByName("wasmJs") as KotlinWasmTargetPreset, configure ) @ExperimentalWasmDsl - fun wasm() = wasm("wasm") { } + fun wasmJs() = wasmJs("wasmJs") { } @ExperimentalWasmDsl - fun wasm(name: String) = wasm(name) { } + fun wasmJs(name: String) = wasmJs(name) { } @ExperimentalWasmDsl - fun wasm(name: String, configure: Action) = wasm(name) { configure.execute(this) } + fun wasmJs(name: String, configure: Action) = wasmJs(name) { configure.execute(this) } @ExperimentalWasmDsl - fun wasm(configure: Action) = wasm { configure.execute(this) } + fun wasmJs(configure: Action) = wasmJs { configure.execute(this) } + + @ExperimentalWasmDsl + fun wasmWasi( + name: String = "wasmWasi", + configure: KotlinWasmWasiTargetDsl.() -> Unit = { }, + ): KotlinWasmWasiTargetDsl = + configureOrCreate( + name, + @Suppress("DEPRECATION") + presets.getByName("wasmWasi") as KotlinWasmTargetPreset, + configure + ) + + @ExperimentalWasmDsl + fun wasmWasi() = wasmJs("wasmWasi") { } + + @ExperimentalWasmDsl + fun wasmWasi(name: String) = wasmWasi(name) { } + + @ExperimentalWasmDsl + fun wasmWasi(name: String, configure: Action) = wasmWasi(name) { configure.execute(this) } + + @ExperimentalWasmDsl + fun wasmWasi(configure: Action) = wasmWasi { configure.execute(this) } + + @Deprecated("Use wasmJs instead", replaceWith = ReplaceWith("wasmJs(name, configure)")) + @ExperimentalWasmDsl + fun wasm( + name: String = "wasmJs", + configure: KotlinWasmJsTargetDsl.() -> Unit = { }, + ): KotlinWasmJsTargetDsl = wasmJs(name, configure) + + @Deprecated("Use wasmJs instead", replaceWith = ReplaceWith("wasmJs()")) + @ExperimentalWasmDsl + fun wasm() = wasmJs() + + @Deprecated("Use wasmJs instead", replaceWith = ReplaceWith("wasmJs(name)")) + @ExperimentalWasmDsl + fun wasm(name: String) = wasmJs(name) + + @Deprecated("Use wasmJs instead", replaceWith = ReplaceWith("wasmJs(name, configure)")) + @ExperimentalWasmDsl + fun wasm(name: String, configure: Action) = wasmJs(name, configure) + + @Deprecated("Use wasmJs instead", replaceWith = ReplaceWith("wasmJs(configure)")) + @ExperimentalWasmDsl + fun wasm(configure: Action) = wasmJs(configure) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index 08c2c8a03be..01457996090 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetAttribute import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget +import org.jetbrains.kotlin.gradle.targets.js.toAttribute import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.registerTask @@ -314,6 +315,10 @@ abstract class KotlinOnlyTargetConfigurator + it.archiveAppendix.set(classifier.toLowerCaseAsciiOnly()) + } } } @@ -324,12 +329,6 @@ abstract class KotlinOnlyTargetConfigurator - task.configure { taskInstance -> - taskInstance.archiveAppendix.set(classifier.toLowerCaseAsciiOnly()) - } - } - // Workaround: adding the artifact during configuration seems to interfere with the Java plugin, which results into missing // task dependency 'assemble -> jar' if the Java plugin is applied after this steps project.afterEvaluate { @@ -440,7 +439,7 @@ fun Configuration.usesPlatformOf(target: KotlinTarget): Configuration { if (target.platformType == KotlinPlatformType.js) { attributes.attribute(KotlinJsCompilerAttribute.jsCompilerAttribute, KotlinJsCompilerAttribute.ir) } else { - attributes.attribute(KotlinWasmTargetAttribute.wasmTargetAttribute, KotlinWasmTargetAttribute.js) + attributes.attribute(KotlinWasmTargetAttribute.wasmTargetAttribute, target.wasmTargetType!!.toAttribute()) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index a80cc197ee4..f67273e6f62 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.gradle.plugin.sources.awaitPlatformCompilations import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinWasmTargetPreset import org.jetbrains.kotlin.gradle.targets.native.createFatFrameworks @@ -136,7 +137,8 @@ class KotlinMultiplatformPlugin : Plugin { irPreset = KotlinJsIrTargetPreset(project).apply { mixedMode = true } } ) - add(KotlinWasmTargetPreset(project)) + add(KotlinWasmTargetPreset(project, KotlinWasmTargetType.JS)) + add(KotlinWasmTargetPreset(project, KotlinWasmTargetType.WASI)) add(project.objects.newInstance(KotlinAndroidTargetPreset::class.java, project)) add(KotlinJvmWithJavaTargetPreset(project)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinTargetWithBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinTargetWithBinaries.kt index 435ed228ac0..477f4d78568 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinTargetWithBinaries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinTargetWithBinaries.kt @@ -12,12 +12,14 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import javax.inject.Inject +interface HasBinaries> { + val binaries: T +} + abstract class KotlinTargetWithBinaries, out R : DomainObjectSet<*>> @Inject constructor( project: Project, platformType: KotlinPlatformType -) : KotlinOnlyTarget(project, platformType) { - abstract val binaries: R - +) : KotlinOnlyTarget(project, platformType), HasBinaries { fun binaries(configure: R.() -> Unit) { binaries.configure() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinWasmCompilerAttribute.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinWasmCompilerAttribute.kt index 9cd5652f3b1..d48d2144c5d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinWasmCompilerAttribute.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinWasmCompilerAttribute.kt @@ -12,7 +12,8 @@ import java.io.Serializable // For Gradle attributes @Suppress("EnumEntryName") enum class KotlinWasmTargetAttribute : Named, Serializable { - js, wasi; + wasi, + js; override fun getName(): String = name diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinWasmTargetType.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinWasmTargetType.kt new file mode 100644 index 00000000000..04277a29556 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinWasmTargetType.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2020 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 org.jetbrains.kotlin.gradle.targets.js + +enum class KotlinWasmTargetType { + WASI, + JS; +} + +fun KotlinWasmTargetType.toAttribute(): KotlinWasmTargetAttribute { + return when(this) { + KotlinWasmTargetType.WASI -> KotlinWasmTargetAttribute.wasi + KotlinWasmTargetType.JS -> KotlinWasmTargetAttribute.js + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt index 16de75ad2c2..a438c62d03f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt @@ -33,7 +33,7 @@ interface KotlinJsSubTargetContainerDsl : KotlinTarget { fun whenBrowserConfigured(body: KotlinJsBrowserDsl.() -> Unit) } -interface KotlinJsTargetDsl : KotlinTarget { +interface KotlinJsTargetDsl : KotlinTarget, KotlinTargetWithNodeJsDsl { var moduleName: String? fun browser() = browser { } @@ -44,14 +44,6 @@ interface KotlinJsTargetDsl : KotlinTarget { } } - fun nodejs() = nodejs { } - fun nodejs(body: KotlinJsNodeDsl.() -> Unit) - fun nodejs(fn: Action) { - nodejs { - fn.execute(this) - } - } - fun useCommonJs() fun useEsModules() @@ -74,6 +66,16 @@ interface KotlinJsTargetDsl : KotlinTarget { override val compilations: NamedDomainObjectContainer } +interface KotlinTargetWithNodeJsDsl { + fun nodejs() = nodejs { } + fun nodejs(body: KotlinJsNodeDsl.() -> Unit) + fun nodejs(fn: Action) { + nodejs { + fn.execute(this) + } + } +} + interface KotlinJsSubTargetDsl { @ExperimentalDistributionDsl fun distribution(body: Action) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl.kt new file mode 100644 index 00000000000..3fc39d47e56 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmJsTargetDsl.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2022 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 org.jetbrains.kotlin.gradle.targets.js.dsl + +import org.gradle.api.Action +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenExec +import org.jetbrains.kotlin.gradle.targets.js.d8.D8Exec + +interface KotlinWasmSubTargetContainerDsl : KotlinTarget { + val d8: KotlinWasmD8Dsl + + val isD8Configured: Boolean + + fun whenD8Configured(body: KotlinWasmD8Dsl.() -> Unit) + + fun whenBinaryenApplied(body: (BinaryenExec.() -> Unit) -> Unit) +} + +interface KotlinWasmJsTargetDsl : KotlinWasmTargetDsl, KotlinJsTargetDsl { + fun d8() = d8 { } + fun d8(body: KotlinWasmD8Dsl.() -> Unit) + fun d8(fn: Action) { + d8 { + fn.execute(this) + } + } + + fun applyBinaryen() = applyBinaryen { } + fun applyBinaryen(body: BinaryenExec.() -> Unit) + fun applyBinaryen(fn: Action) { + applyBinaryen { + fn.execute(this) + } + } +} + +interface KotlinWasmD8Dsl : KotlinJsSubTargetDsl { + fun runTask(body: D8Exec.() -> Unit) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmTargetDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmTargetDsl.kt index 284af38dfa4..c0931ecefe9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmTargetDsl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmTargetDsl.kt @@ -5,39 +5,9 @@ package org.jetbrains.kotlin.gradle.targets.js.dsl -import org.gradle.api.Action import org.jetbrains.kotlin.gradle.plugin.KotlinTarget -import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenExec -import org.jetbrains.kotlin.gradle.targets.js.d8.D8Exec +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType -interface KotlinWasmSubTargetContainerDsl : KotlinTarget { - val d8: KotlinWasmD8Dsl - - val isD8Configured: Boolean - - fun whenD8Configured(body: KotlinWasmD8Dsl.() -> Unit) - - fun whenBinaryenApplied(body: (BinaryenExec.() -> Unit) -> Unit) -} - -interface KotlinWasmTargetDsl : KotlinJsTargetDsl { - fun d8() = d8 { } - fun d8(body: KotlinWasmD8Dsl.() -> Unit) - fun d8(fn: Action) { - d8 { - fn.execute(this) - } - } - - fun applyBinaryen() = applyBinaryen { } - fun applyBinaryen(body: BinaryenExec.() -> Unit) - fun applyBinaryen(fn: Action) { - applyBinaryen { - fn.execute(this) - } - } -} - -interface KotlinWasmD8Dsl : KotlinJsSubTargetDsl { - fun runTask(body: D8Exec.() -> Unit) +interface KotlinWasmTargetDsl : KotlinTarget { + val wasmTargetType: KotlinWasmTargetType? } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl.kt new file mode 100644 index 00000000000..4ac5bc0e83e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinWasmWasiTargetDsl.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2022 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 org.jetbrains.kotlin.gradle.targets.js.dsl + +import org.jetbrains.kotlin.gradle.plugin.mpp.HasBinaries +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsBinaryContainer + +interface KotlinWasmWasiTargetDsl : + KotlinWasmTargetDsl, + KotlinTargetWithNodeJsDsl, + HasBinaries \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt index 2c6172db31a..68934656369 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/CompilerFlags.kt @@ -29,3 +29,4 @@ internal const val PER_MODULE = "-Xir-per-module" internal const val PER_MODULE_OUTPUT_NAME = "-Xir-per-module-output-name" internal const val WASM_BACKEND = "-Xwasm" +internal const val WASM_WASI_MODE = "-Xwasm-wasi-mode" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt index a6b4e34ab85..9ee27831c60 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt @@ -5,16 +5,18 @@ package org.jetbrains.kotlin.gradle.targets.js.ir +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver -import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JsIrCompilationSourceSetsContainerFactory -import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JsKotlinCompilationDependencyConfigurationsFactory -import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory -import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinJsCompilerOptionsFactory +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPreConfigure +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.* +import org.jetbrains.kotlin.gradle.plugin.mpp.isMain +import org.jetbrains.kotlin.gradle.plugin.mpp.sourcesJarTask +import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly class KotlinJsIrCompilationFactory internal constructor( - override val target: KotlinOnlyTarget + override val target: KotlinOnlyTarget, ) : KotlinCompilationFactory { override val itemClass: Class get() = KotlinJsIrCompilation::class.java @@ -27,7 +29,14 @@ class KotlinJsIrCompilationFactory internal constructor( } ), compilationSourceSetsContainerFactory = JsIrCompilationSourceSetsContainerFactory, - compilationDependencyConfigurationsFactory = JsKotlinCompilationDependencyConfigurationsFactory + compilationDependencyConfigurationsFactory = JsKotlinCompilationDependencyConfigurationsFactory, + preConfigureAction = DefaultKotlinCompilationPreConfigure + { compilation -> + if (compilation.platformType == KotlinPlatformType.wasm && compilation.isMain()) { + val artifactNameAppendix = (compilation.target as KotlinJsIrTarget).wasmDecamelizedDefaultNameOrNull() + ?: compilation.target.targetName.toLowerCaseAsciiOnly() + sourcesJarTask(compilation, compilation.target.targetName, artifactNameAppendix) + } + } ) override fun create(name: String): KotlinJsIrCompilation = target.project.objects.newInstance( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt index 644a0235459..c25fe1db617 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTests import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.plugin.whenEvaluated import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlatformTestRun +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDistributionDsl import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode @@ -33,7 +34,7 @@ import org.jetbrains.kotlin.gradle.utils.newFileProperty abstract class KotlinJsIrSubTarget( val target: KotlinJsIrTarget, - private val disambiguationClassifier: String + private val disambiguationClassifier: String, ) : KotlinJsSubTargetDsl { val project get() = target.project @@ -121,8 +122,8 @@ abstract class KotlinJsIrSubTarget( KotlinJsBinaryMode.DEVELOPMENT ).single() - testJs.dependsOn(binary.linkSyncTask) - testJs.inputFileProperty.fileProvider( + val inputFileProperty = if (target.wasmTargetType != KotlinWasmTargetType.WASI) { + testJs.dependsOn(binary.linkSyncTask) binary.linkSyncTask.flatMap { linkSyncTask -> binary.linkTask.flatMap { linkTask -> linkTask.outputFileProperty.map { file -> @@ -130,6 +131,15 @@ abstract class KotlinJsIrSubTarget( } } } + } else { + testJs.dependsOn(binary.linkTask) + binary.linkTask.flatMap { linkTask -> + linkTask.outputFileProperty + } + } + + testJs.inputFileProperty.fileProvider( + inputFileProperty ) configureTestDependencies(testJs) @@ -238,7 +248,7 @@ abstract class KotlinJsIrSubTarget( internal inline fun registerSubTargetTask( name: String, args: List = emptyList(), - noinline body: (T) -> (Unit) + noinline body: (T) -> (Unit), ): TaskProvider = project.registerTask(name, args) { it.group = taskGroupName diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt index 3d90deea5c0..968cff1d0cf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt @@ -10,24 +10,32 @@ import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME -import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultKotlinUsageContext -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinTargetWithBinaries -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsageContext +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider +import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.targets.js.JsAggregatingExecutionSource import org.jetbrains.kotlin.gradle.targets.js.KotlinJsReportAggregatingTestRun import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenExec import org.jetbrains.kotlin.gradle.targets.js.dsl.* +import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.typescript.TypeScriptValidationTask import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.registerTask +import org.jetbrains.kotlin.gradle.utils.dashSeparatedName +import org.jetbrains.kotlin.gradle.utils.decamelize import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.setProperty +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly +import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly +import org.jetbrains.kotlin.utils.addIfNotNull import javax.inject.Inject abstract class KotlinJsIrTarget @@ -35,14 +43,16 @@ abstract class KotlinJsIrTarget constructor( project: Project, platformType: KotlinPlatformType, - internal val mixedMode: Boolean + internal val mixedMode: Boolean, ) : KotlinTargetWithBinaries(project, platformType), KotlinTargetWithTests, KotlinJsTargetDsl, - KotlinWasmTargetDsl, + KotlinWasmJsTargetDsl, + KotlinWasmWasiTargetDsl, KotlinJsSubTargetContainerDsl, KotlinWasmSubTargetContainerDsl { + private val propertiesProvider = PropertiesProvider(project) override lateinit var testRuns: NamedDomainObjectContainer internal set @@ -50,6 +60,9 @@ constructor( open var isMpp: Boolean? = null internal set + override var wasmTargetType: KotlinWasmTargetType? = null + internal set + var legacyTarget: KotlinJsTarget? = null internal set @@ -61,6 +74,38 @@ constructor( field = value } + override val kotlinComponents: Set by lazy { + val mainCompilation = compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) + val usageContexts = createUsageContexts(mainCompilation).toMutableSet() + + val componentName = + if (project.kotlinExtension is KotlinMultiplatformExtension) + targetName + else PRIMARY_SINGLE_COMPONENT_NAME + + usageContexts.addIfNotNull( + createSourcesJarAndUsageContextIfPublishable( + producingCompilation = mainCompilation, + componentName = componentName, + artifactNameAppendix = wasmDecamelizedDefaultNameOrNull() ?: dashSeparatedName(targetName.toLowerCaseAsciiOnly()) + ) + ) + + val result = createKotlinVariant(componentName, mainCompilation, usageContexts) + + setOf(result) + } + + override fun createKotlinVariant( + componentName: String, + compilation: KotlinCompilation<*>, + usageContexts: Set, + ): KotlinVariant { + return super.createKotlinVariant(componentName, compilation, usageContexts).apply { + artifactTargetName = wasmDecamelizedDefaultNameOrNull() ?: componentName + } + } + override fun createUsageContexts(producingCompilation: KotlinCompilation<*>): Set { val usageContexts = super.createUsageContexts(producingCompilation) @@ -211,7 +256,11 @@ constructor( //node.js private val nodejsLazyDelegate = lazy { - commonLazy + if (wasmTargetType != KotlinWasmTargetType.WASI) { + commonLazy + } else { + NodeJsRootPlugin.apply(project.rootProject) + } project.objects.newInstance(KotlinNodeJsIr::class.java, this).also { it.configureSubTarget() nodejsConfiguredHandlers.forEach { handler -> @@ -341,3 +390,14 @@ constructor( } } } + +fun KotlinJsIrTarget.wasmDecamelizedDefaultNameOrNull(): String? = if (platformType == KotlinPlatformType.wasm) { + val defaultWasmTargetName = wasmTargetType?.let { + KotlinWasmTargetPreset.WASM_PRESET_NAME + it.name.toLowerCaseAsciiOnly().capitalizeAsciiOnly() + } + + defaultWasmTargetName + ?.takeIf { + targetName == defaultWasmTargetName + }?.decamelize() +} else null diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt index 3b6258fa66f..28076d04143 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt @@ -13,13 +13,16 @@ import org.jetbrains.kotlin.gradle.dsl.JsModuleKind import org.jetbrains.kotlin.gradle.dsl.JsSourceMapEmbedMode import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions import org.jetbrains.kotlin.gradle.plugin.* -import org.jetbrains.kotlin.gradle.plugin.internal.BasePluginConfiguration import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages +import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.libsDirectory +import org.jetbrains.kotlin.gradle.plugin.mpp.sourcesJarTask import org.jetbrains.kotlin.gradle.targets.js.KotlinJsReportAggregatingTestRun import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry import org.jetbrains.kotlin.gradle.testing.testTaskName +import org.jetbrains.kotlin.gradle.utils.decamelize +import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly open class KotlinJsIrTargetConfigurator : KotlinOnlyTargetConfigurator(true), @@ -73,6 +76,14 @@ open class KotlinJsIrTargetConfigurator : configure { it.archiveExtension.set(KLIB_TYPE) it.destinationDirectory.set(libsDirectory) + + if (target.platformType == KotlinPlatformType.wasm) { + if (target.wasmDecamelizedDefaultNameOrNull() != null) { + target.disambiguationClassifier?.let { classifier -> + it.archiveAppendix.set(classifier.decamelize()) + } + } + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt index 44b4d30539f..2c58a8b9144 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.Action import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension @@ -31,6 +32,12 @@ abstract class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : project.tasks.withType().named(runTaskName).configure(body) } + override fun configureRun(compilation: KotlinJsIrCompilation) { + if (target.wasmTargetType != KotlinWasmTargetType.WASI) { + super.configureRun(compilation) + } + } + override fun locateOrRegisterRunTask(binary: JsIrBinary, name: String) { if (project.locateTask(name) != null) return @@ -51,11 +58,13 @@ abstract class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : } override fun configureTestDependencies(test: KotlinJsTest) { - test.dependsOn( - nodeJsTaskProviders.npmInstallTaskProvider, - nodeJsTaskProviders.storeYarnLockTaskProvider, - nodeJsTaskProviders.nodeJsSetupTaskProvider - ) + if (target.wasmTargetType != KotlinWasmTargetType.WASI) { + test.dependsOn( + nodeJsTaskProviders.npmInstallTaskProvider, + nodeJsTaskProviders.storeYarnLockTaskProvider, + nodeJsTaskProviders.nodeJsSetupTaskProvider + ) + } } override fun configureDefaultTestFramework(test: KotlinJsTest) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt index 65a48a58811..7294af9329b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt @@ -8,13 +8,16 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.Project import org.jetbrains.kotlin.gradle.DeprecatedTargetPresetApi import org.jetbrains.kotlin.gradle.plugin.* -import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly +import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly @DeprecatedTargetPresetApi class KotlinWasmTargetPreset( project: Project, + private val targetType: KotlinWasmTargetType ) : KotlinOnlyTargetPreset(project) { override val platformType: KotlinPlatformType = KotlinPlatformType.wasm @@ -25,6 +28,7 @@ class KotlinWasmTargetPreset( val irTarget = project.objects.newInstance(KotlinJsIrTarget::class.java, project, KotlinPlatformType.wasm, false) irTarget.isMpp = true + irTarget.wasmTargetType = targetType return irTarget } @@ -32,7 +36,7 @@ class KotlinWasmTargetPreset( override fun createKotlinTargetConfigurator(): AbstractKotlinTargetConfigurator = KotlinJsIrTargetConfigurator() - override fun getName(): String = WASM_PRESET_NAME + override fun getName(): String = WASM_PRESET_NAME + targetType.name.toLowerCaseAsciiOnly().capitalizeAsciiOnly() public override fun createCompilationFactory( forTarget: KotlinJsIrTarget @@ -40,6 +44,6 @@ class KotlinWasmTargetPreset( KotlinJsIrCompilationFactory(forTarget) companion object { - private const val WASM_PRESET_NAME = "wasm" + internal const val WASM_PRESET_NAME = "wasm" } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt index c6d70477d94..fdf28bccc39 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt @@ -37,8 +37,10 @@ open class NpmProject(@Transient val compilation: KotlinJsCompilation) : Seriali buildNpmProjectName() } - @Transient - val nodeJs = project.rootProject.kotlinNodeJsExtension + @delegate:Transient + val nodeJs by lazy { + project.rootProject.kotlinNodeJsExtension + } val dir: File by lazy { nodeJs.projectPackagesDir.resolve(name) @@ -75,7 +77,9 @@ open class NpmProject(@Transient val compilation: KotlinJsCompilation) : Seriali val publicPackageJsonTaskName: String get() = compilation.disambiguateName(PublicPackageJsonTask.NAME) - internal val modules = NpmProjectModules(dir) + internal val modules by lazy { + NpmProjectModules(dir) + } private val nodeExecutable by lazy { nodeJs.requireConfigured().nodeExecutable diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt index 5961a847188..eec73c9a663 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt @@ -42,8 +42,6 @@ constructor( private val nodeExecutable by project.provider { nodeJs.requireConfigured().nodeExecutable } - private val npmProjectDir by project.provider { compilation.npmProject.dir } - @Input var environment = mutableMapOf() @@ -159,7 +157,7 @@ constructor( override fun createTestExecutionSpec(): TCServiceMessagesTestExecutionSpec { val forkOptions = DefaultProcessForkOptions(fileResolver) - forkOptions.workingDir = npmProjectDir + forkOptions.workingDir = testFramework!!.workingDir.toFile() forkOptions.executable = nodeExecutable environment.forEach { (key, value) -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTestFramework.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTestFramework.kt index 02e1a5de495..65615038ab8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTestFramework.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTestFramework.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.js.testing import org.gradle.process.ProcessForkOptions import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies +import java.nio.file.Path interface KotlinJsTestFramework : RequiresNpmDependencies { val settingsState: String @@ -18,4 +19,6 @@ interface KotlinJsTestFramework : RequiresNpmDependencies { nodeJsArgs: MutableList, debug: Boolean ): TCServiceMessagesTestExecutionSpec + + val workingDir: Path } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt index 32fae92897a..31048c440da 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt @@ -15,9 +15,11 @@ import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments import org.jetbrains.kotlin.gradle.targets.js.d8.D8RootPlugin import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm +import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.writeWasmUnitTestRunner import org.jetbrains.kotlin.gradle.utils.doNotTrackStateCompat import org.jetbrains.kotlin.gradle.utils.getValue +import java.nio.file.Path internal class KotlinWasmD8(private val kotlinJsTest: KotlinJsTest) : KotlinJsTestFramework { override val settingsState: String = "KotlinWasmD8" @@ -29,6 +31,10 @@ internal class KotlinWasmD8(private val kotlinJsTest: KotlinJsTest) : KotlinJsTe private val d8 = D8RootPlugin.apply(project.rootProject) private val d8Executable by project.provider { d8.requireConfigured().executablePath } private val isTeamCity = project.providers.gradleProperty(TCServiceMessagesTestExecutor.TC_PROJECT_PROPERTY) + private val npmProjectDir by project.provider { compilation.npmProject.dir } + + override val workingDir: Path + get() = npmProjectDir.toPath() init { kotlinJsTest.doNotTrackStateCompat("Should always re-run for WASM") diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt index 70bdbdec9a3..c0ea0380c6e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt @@ -5,16 +5,22 @@ package org.jetbrains.kotlin.gradle.targets.js.testing +import org.gradle.api.Project import org.gradle.process.ProcessForkOptions import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutor import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget +import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.writeWasmUnitTestRunner import org.jetbrains.kotlin.gradle.utils.doNotTrackStateCompat +import org.jetbrains.kotlin.gradle.utils.getValue +import java.nio.file.Path internal class KotlinWasmNode(private val kotlinJsTest: KotlinJsTest) : KotlinJsTestFramework { override val settingsState: String = "KotlinWasmNode" @@ -22,6 +28,23 @@ internal class KotlinWasmNode(private val kotlinJsTest: KotlinJsTest) : KotlinJs override val compilation: KotlinJsCompilation = kotlinJsTest.compilation private val isTeamCity = compilation.target.project.providers.gradleProperty(TCServiceMessagesTestExecutor.TC_PROJECT_PROPERTY) + @Transient + private val target: KotlinJsIrTarget = compilation.target as KotlinJsIrTarget + + @Transient + private val project: Project = target.project + + private val npmProjectDir by project.provider { compilation.npmProject.dir } + + private val wasmTargetType: KotlinWasmTargetType? = target.wasmTargetType + + override val workingDir: Path + get() = if (wasmTargetType != KotlinWasmTargetType.WASI) { + npmProjectDir.toPath() + } else { + kotlinJsTest.inputFileProperty.get().asFile.toPath().parent + } + init { kotlinJsTest.doNotTrackStateCompat("Should always re-run for WASM") } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt index 561eb66c137..ecaf9e4136c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt @@ -36,10 +36,12 @@ import org.jetbrains.kotlin.gradle.targets.js.testing.* import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig import org.jetbrains.kotlin.gradle.tasks.KotlinTest import org.jetbrains.kotlin.gradle.utils.appendLine +import org.jetbrains.kotlin.gradle.utils.getValue import org.jetbrains.kotlin.gradle.utils.property import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.slf4j.Logger import java.io.File +import java.nio.file.Path class KotlinKarma( @Transient override val compilation: KotlinJsCompilation, @@ -70,9 +72,14 @@ class KotlinKarma( } private val isTeamCity = project.providers.gradleProperty(TCServiceMessagesTestExecutor.TC_PROJECT_PROPERTY) + private val npmProjectDir by project.provider { npmProject.dir } + override val requiredNpmDependencies: Set get() = requiredDependencies + webpackConfig.getRequiredDependencies(versions) + override val workingDir: Path + get() = npmProjectDir.toPath() + override fun getPath() = "$basePath:kotlinKarma" override val settingsState: String diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt index 2ff10b18635..5eb28adfedc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt @@ -20,6 +20,8 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinTestRunnerCliArgs +import org.jetbrains.kotlin.gradle.utils.getValue +import java.nio.file.Path class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, private val basePath: String) : KotlinJsTestFramework { @@ -28,6 +30,10 @@ class KotlinMocha(@Transient override val compilation: KotlinJsCompilation, priv private val npmProject = compilation.npmProject private val versions = project.rootProject.kotlinNodeJsExtension.versions private val isTeamCity = project.providers.gradleProperty(TCServiceMessagesTestExecutor.TC_PROJECT_PROPERTY) + private val npmProjectDir by project.provider { npmProject.dir } + + override val workingDir: Path + get() = npmProjectDir.toPath() override val settingsState: String get() = "mocha" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 969043abd9c..16b0ae26fe2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import org.jetbrains.kotlin.tooling.core.extrasLazyProperty +import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly internal const val COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME = "commonMainMetadataElements" @@ -152,6 +153,10 @@ class KotlinMetadataTargetConfigurator : if (target.project.isCompatibilityMetadataVariantEnabled) { allMetadataJar.archiveClassifier.set("all") } + + target.disambiguationClassifier?.let { classifier -> + allMetadataJar.archiveAppendix.set(classifier.toLowerCaseAsciiOnly()) + } } if (target.project.isCompatibilityMetadataVariantEnabled) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt index 5056c0ca1c7..f587a418418 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.gradle.tasks.configuration import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.internal.LibraryFilterCachingService import org.jetbrains.kotlin.gradle.targets.js.ir.* import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile @@ -103,5 +105,13 @@ internal open class BaseKotlin2JsCompileConfig( add("$KLIB_MODULE_NAME=${project.klibModuleName(baseName)}") } } + + if (compilation.platformType == KotlinPlatformType.wasm) { + add(WASM_BACKEND) + val wasmTargetType = ((compilation.origin as KotlinJsIrCompilation).target as KotlinJsIrTarget).wasmTargetType!! + if (wasmTargetType == KotlinWasmTargetType.WASI) { + add(WASM_WASI_MODE) + } + } } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinJsIrLinkConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinJsIrLinkConfig.kt index cb091cda648..ba0be2a15ab 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinJsIrLinkConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinJsIrLinkConfig.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.tasks.configuration import org.gradle.api.InvalidUserDataException import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode import org.jetbrains.kotlin.gradle.targets.js.ir.* import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject @@ -98,6 +99,10 @@ internal open class KotlinJsIrLinkConfig( if (compilation.platformType == KotlinPlatformType.wasm) { add(WASM_BACKEND) + val wasmTargetType = ((compilation.origin as KotlinJsIrCompilation).target as KotlinJsIrTarget).wasmTargetType!! + if (wasmTargetType == KotlinWasmTargetType.WASI) { + add(WASM_WASI_MODE) + } } } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/WasmDependencyResolutionSmokeTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/WasmDependencyResolutionSmokeTest.kt index 74dfb1104b9..ef6072c197d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/WasmDependencyResolutionSmokeTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/WasmDependencyResolutionSmokeTest.kt @@ -33,17 +33,17 @@ class WasmDependencyResolutionSmokeTest { project.repositories.mavenLocal() project.repositories.mavenCentralCacheRedirector() } - + producer.multiplatformExtension.apply { jvm() js(IR) { browser() } - wasm() + wasmJs() } consumer.multiplatformExtension.apply { jvm() js(IR) { browser() } - wasm() + wasmJs() sourceSets.commonMain.dependencies { implementation(producer) @@ -59,17 +59,17 @@ class WasmDependencyResolutionSmokeTest { binaryCoordinates(Regex(".*stdlib-common.*")) ) - consumer.kotlinIdeMultiplatformImport.resolveDependencies("wasmMain").assertMatches( + consumer.kotlinIdeMultiplatformImport.resolveDependencies("wasmJsMain").assertMatches( dependsOnDependency(":consumer/commonMain"), - projectArtifactDependency(type = Regular, ":producer", FilePathRegex(".*/producer-wasm.klib")), + projectArtifactDependency(type = Regular, ":producer", FilePathRegex(".*/producer-wasm-js.klib")), binaryCoordinates(Regex(".*stdlib-wasm.*")) ) - consumer.kotlinIdeMultiplatformImport.resolveDependencies("wasmTest").assertMatches( + consumer.kotlinIdeMultiplatformImport.resolveDependencies("wasmJsTest").assertMatches( friendSourceDependency(":consumer/commonMain"), - friendSourceDependency(":consumer/wasmMain"), + friendSourceDependency(":consumer/wasmJsMain"), dependsOnDependency(":consumer/commonTest"), - projectArtifactDependency(type = Regular, ":producer", FilePathRegex(".*/producer-wasm.klib")), + projectArtifactDependency(type = Regular, ":producer", FilePathRegex(".*/producer-wasm-js.klib")), binaryCoordinates(Regex(".*stdlib-wasm.*")) ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/ConfigurationsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/ConfigurationsTest.kt index ec9ec9e97e5..efb0330ad41 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/ConfigurationsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/ConfigurationsTest.kt @@ -163,7 +163,7 @@ class ConfigurationsTest : MultiplatformExtensionTest() { js("nodeJs", KotlinJsCompilerType.IR) { attributes { attribute(jsAttribute, "nodeJs") } } js("browser", KotlinJsCompilerType.IR) { attributes { attribute(jsAttribute, "browser") } } @OptIn(ExperimentalWasmDsl::class) - wasm() + wasmJs() val allJs = sourceSets.create("allJs") targets.getByName("nodeJs").compilations.getByName("main").defaultSourceSet.dependsOn(allJs) @@ -187,7 +187,7 @@ class ConfigurationsTest : MultiplatformExtensionTest() { // WASM val actualWasmConfigurations = targetSpecificConfigurationsToCheck - .map { project.configurations.getByName("wasm$it") } + .map { project.configurations.getByName("wasmJs$it") } .filter { it.attributes.contains(KotlinJsCompilerAttribute.jsCompilerAttribute) } assertEquals( diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinHierarchyDslTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinHierarchyDslTest.kt index f9b253f35b0..c9451a946f8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinHierarchyDslTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinHierarchyDslTest.kt @@ -324,7 +324,7 @@ class KotlinHierarchyDslTest { } } - kotlin.wasm() + kotlin.wasmJs() kotlin.js() assertEquals( @@ -333,7 +333,7 @@ class KotlinHierarchyDslTest { ) assertEquals( - stringSetOf("jsMain", "wasmMain"), + stringSetOf("jsMain", "wasmJsMain"), kotlin.dependingSourceSetNames("webMain") ) } @@ -353,7 +353,7 @@ class KotlinHierarchyDslTest { } } - kotlin.wasm() + kotlin.wasmJs() kotlin.js() kotlin.jvm() kotlin.linuxX64() @@ -369,7 +369,7 @@ class KotlinHierarchyDslTest { ) assertEquals( - stringSetOf("wasmMain", "linuxX64Main"), + stringSetOf("wasmJsMain", "linuxX64Main"), kotlin.dependingSourceSetNames("wasmAndLinuxMain") ) }