[K/JS] Add .mjs extension to main file in package.json for ES modules compilation

This commit is contained in:
Artem Kobzar
2023-10-23 08:04:45 +00:00
committed by Space Team
parent 9acae3b0df
commit 73b1272211
4 changed files with 69 additions and 2 deletions
@@ -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) {
@@ -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()
@@ -36,6 +36,9 @@ abstract class PublicPackageJsonTask :
@get:Input
abstract val jsIrCompilation: Property<Boolean>
@get:Input
abstract val esModules: Property<Boolean>
@get:Input
abstract val npmProjectName: Property<String>
@@ -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"
@@ -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)