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 5b0b938b764..53f18d53b48 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
@@ -1859,4 +1859,50 @@ class Kotlin2JsIrGradlePluginIT : KGPBaseTest() {
}
}
}
+
+ @DisplayName("Check that nodeTest run tests with commonjs module kind")
+ @GradleTest
+ fun testFailedJsTestWithCommonJs(gradleVersion: GradleVersion) {
+ project("kotlin-js-project-failed-test", gradleVersion) {
+ buildGradle.appendText(
+ """
+ |
+ |tasks.withType(KotlinJsCompile).configureEach {
+ | kotlinOptions { moduleKind = "commonjs" }
+ |}
+ """.trimMargin()
+ )
+ buildAndFail("nodeTest") {
+ assertTasksFailed(":nodeTest")
+
+ assertTestResults(
+ projectPath.resolve("TEST-all.xml"),
+ "nodeTest"
+ )
+ }
+ }
+ }
+
+ @DisplayName("Check that nodeTest run tests with ESM module kind")
+ @GradleTest
+ fun testFailedJsTestWithESM(gradleVersion: GradleVersion) {
+ project("kotlin-js-project-failed-test", gradleVersion) {
+ buildGradle.appendText(
+ """
+ |
+ |tasks.withType(KotlinJsCompile).configureEach {
+ | kotlinOptions { moduleKind = "es" }
+ |}
+ """.trimMargin()
+ )
+ buildAndFail("nodeTest") {
+ assertTasksFailed(":nodeTest")
+
+ assertTestResults(
+ projectPath.resolve("TEST-all.xml"),
+ "nodeTest"
+ )
+ }
+ }
+ }
}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/TEST-all.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/TEST-all.xml
new file mode 100644
index 00000000000..716ec274701
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/TEST-all.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+ ...
+
+
+
+
+
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/build.gradle
new file mode 100644
index 00000000000..358e430e87e
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/build.gradle
@@ -0,0 +1,22 @@
+import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile
+
+plugins {
+ id("org.jetbrains.kotlin.js")
+}
+
+dependencies {
+ implementation("org.jetbrains.kotlin:kotlin-stdlib-js")
+ testImplementation("org.jetbrains.kotlin:kotlin-test-js")
+}
+
+repositories {
+ mavenLocal()
+ mavenCentral()
+}
+
+kotlin {
+ js {
+ binaries.executable()
+ nodejs()
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/custom/main.txt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/custom/main.txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/gradle.properties
new file mode 100644
index 00000000000..cc1416ef297
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/gradle.properties
@@ -0,0 +1 @@
+kotlin.tests.individualTaskReports=true
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/src/main/kotlin/Base.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/src/main/kotlin/Base.kt
new file mode 100644
index 00000000000..122e2fd9a31
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/src/main/kotlin/Base.kt
@@ -0,0 +1,10 @@
+/*
+ * 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 getValue(): Int {
+ return 42
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/src/test/kotlin/Tests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/src/test/kotlin/Tests.kt
new file mode 100644
index 00000000000..a87db839f6e
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-project-failed-test/src/test/kotlin/Tests.kt
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2010-2021 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.
+ */
+
+import kotlin.test.Test
+import kotlin.test.assertEquals
+
+class Tests {
+ @Test
+ fun testHello() {
+ assertEquals(73, com.example.getValue())
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt
index 8f3adfaaba9..6edc02f6dcd 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt
@@ -12,9 +12,12 @@ import groovy.lang.Closure
import org.gradle.api.Action
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.tasks.TaskProvider
+import org.gradle.api.provider.Provider
+import org.jetbrains.kotlin.gradle.dsl.JsModuleKind
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions
import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions
+import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationImpl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetContainerDsl
import org.jetbrains.kotlin.gradle.targets.js.ir.JsBinary
@@ -99,4 +102,16 @@ open class KotlinJsCompilation @Inject internal constructor(
project.configure(this, handler)
}
}
-}
\ No newline at end of file
+}
+
+internal val KotlinJsCompilation.fileExtension: Provider
+ get() {
+ val isWasm = platformType == KotlinPlatformType.wasm
+ return compilerOptions.options.moduleKind.map { moduleKind ->
+ if (isWasm || moduleKind == JsModuleKind.MODULE_ES) {
+ "mjs"
+ } else {
+ "js"
+ }
+ }
+ }
\ No newline at end of file
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 b8763c4e06f..6447453c257 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
@@ -9,7 +9,10 @@ import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner
import org.jetbrains.kotlin.gradle.incremental.IncrementalModuleInfoBuildService
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
+import org.jetbrains.kotlin.gradle.plugin.getExtension
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
+import org.jetbrains.kotlin.gradle.plugin.mpp.fileExtension
import org.jetbrains.kotlin.gradle.plugin.tcs
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType
@@ -40,7 +43,8 @@ internal open class BaseKotlin2JsCompileConfig(
configureAdditionalFreeCompilerArguments(task, compilation)
- val compilationTarget = compilation.tcs.compilation.target
+ val binaryCompilation = compilation.tcs.compilation
+ val compilationTarget = binaryCompilation.target
if (compilationTarget is KotlinJsTarget ||
(compilationTarget is KotlinWithJavaTarget<*, *> && compilationTarget.platformType == KotlinPlatformType.js)
) {
@@ -57,8 +61,10 @@ internal open class BaseKotlin2JsCompileConfig(
if (task.compilerOptions.outputFile.orNull != null) {
task.compilerOptions.outputFile.map { File(it) }
} else {
- task.compilerOptions.moduleName.map { name ->
- dir.file(name + compilation.platformType.fileExtension).asFile
+ task.compilerOptions.moduleName.flatMap { name ->
+ (binaryCompilation as KotlinJsCompilation).fileExtension.map {
+ dir.file("$name.$it").asFile
+ }
}
}
}