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 171c2ee6054..dd71e3dc32f 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 @@ -624,6 +624,61 @@ class Kotlin2JsIrGradlePluginIT : KGPBaseTest() { } } + + @DisplayName("package json contains correct extension for ES-modules") + @GradleTest + fun testPackageJsonWithEsModules(gradleVersion: GradleVersion) { + project("kotlin-js-browser-project", gradleVersion) { + buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) + subProject("app").buildGradleKts.modify { + it + """ + | + |kotlin.target.useEsModules() + | + """.trimMargin() + } + + build(":app:packageJson") { + val packageJson = projectPath + .resolve("build/js/packages/kotlin-js-browser-app") + .resolve(NpmProject.PACKAGE_JSON) + .let { + Gson().fromJson(it.readText(), PackageJson::class.java) + } + + assertEquals(packageJson.main, "kotlin/kotlin-js-browser-app.mjs") + + } + } + } + + @DisplayName("public package json contains correct extension for ES-modules") + @GradleTest + fun testPublicPackageJsonWithEsModules(gradleVersion: GradleVersion) { + project("kotlin-js-browser-project", gradleVersion) { + buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) + subProject("app").buildGradleKts.modify { + it + """ + | + |kotlin.target.useEsModules() + | + """.trimMargin() + } + + build(":app:publicPackageJson") { + val packageJson = subProject("app").projectPath + .resolve("build/tmp/publicPackageJson") + .resolve(NpmProject.PACKAGE_JSON) + .let { + Gson().fromJson(it.readText(), PackageJson::class.java) + } + + assertEquals(packageJson.main, "kotlin-js-browser-app.mjs") + + } + } + } + @DisplayName("Multiple targets works without clash") @GradleTest fun testMultipleJsTargets(gradleVersion: GradleVersion) { 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 fdf28bccc39..8f52a554586 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm import org.gradle.api.Project import org.gradle.process.ExecSpec +import org.jetbrains.kotlin.gradle.dsl.JsModuleKind import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation @@ -31,7 +32,12 @@ val KotlinJsCompilation.npmProject: NpmProject open class NpmProject(@Transient val compilation: KotlinJsCompilation) : Serializable { val compilationName = compilation.disambiguatedName - private val extension = if (compilation.platformType == KotlinPlatformType.wasm) ".mjs" else ".js" + private val extension by lazy { + if ( + compilation.platformType == KotlinPlatformType.wasm || + compilation.kotlinOptions.moduleKind == JsModuleKind.MODULE_ES.kind + ) ".mjs" else ".js" + } val name: String by lazy { buildNpmProjectName() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt index bbaa1edf06b..4796bcfcc95 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt @@ -36,6 +36,9 @@ abstract class PublicPackageJsonTask : @get:Input abstract val jsIrCompilation: Property + @get:Input + abstract val esModules: Property + @get:Input abstract val npmProjectName: Property @@ -85,7 +88,8 @@ abstract class PublicPackageJsonTask : externalDependencies, packageJsonHandlers.get() ).let { packageJson -> - packageJson.main = "${npmProjectName.get()}.js" + val extension = if (esModules.get()) "mjs" else "js" + packageJson.main = "${npmProjectName.get()}.$extension" if (jsIrCompilation.get()) { packageJson.types = "${npmProjectName.get()}.d.ts" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index 88c7d28918e..74cfe0c216e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -16,6 +16,7 @@ import org.gradle.api.attributes.Usage import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.bundling.Zip +import org.jetbrains.kotlin.gradle.dsl.JsModuleKind import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.categoryByName import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation @@ -80,6 +81,7 @@ class KotlinCompilationNpmResolver( it.jsIrCompilation.set(compilation is KotlinJsIrCompilation) it.npmProjectName.set(npmProject.name) it.npmProjectMain.set(npmProject.main) + it.esModules.set(compilation.compilerOptions.options.moduleKind.get() == JsModuleKind.MODULE_ES) }.also { packageJsonTask -> project.dependencies.attributesSchema { it.attribute(publicPackageJsonAttribute)