[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") @DisplayName("Multiple targets works without clash")
@GradleTest @GradleTest
fun testMultipleJsTargets(gradleVersion: GradleVersion) { fun testMultipleJsTargets(gradleVersion: GradleVersion) {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.process.ExecSpec 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.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
@@ -31,7 +32,12 @@ val KotlinJsCompilation.npmProject: NpmProject
open class NpmProject(@Transient val compilation: KotlinJsCompilation) : Serializable { open class NpmProject(@Transient val compilation: KotlinJsCompilation) : Serializable {
val compilationName = compilation.disambiguatedName 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 { val name: String by lazy {
buildNpmProjectName() buildNpmProjectName()
@@ -36,6 +36,9 @@ abstract class PublicPackageJsonTask :
@get:Input @get:Input
abstract val jsIrCompilation: Property<Boolean> abstract val jsIrCompilation: Property<Boolean>
@get:Input
abstract val esModules: Property<Boolean>
@get:Input @get:Input
abstract val npmProjectName: Property<String> abstract val npmProjectName: Property<String>
@@ -85,7 +88,8 @@ abstract class PublicPackageJsonTask :
externalDependencies, externalDependencies,
packageJsonHandlers.get() packageJsonHandlers.get()
).let { packageJson -> ).let { packageJson ->
packageJson.main = "${npmProjectName.get()}.js" val extension = if (esModules.get()) "mjs" else "js"
packageJson.main = "${npmProjectName.get()}.$extension"
if (jsIrCompilation.get()) { if (jsIrCompilation.get()) {
packageJson.types = "${npmProjectName.get()}.d.ts" 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.internal.artifacts.DefaultProjectComponentIdentifier
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Zip 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.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.categoryByName import org.jetbrains.kotlin.gradle.plugin.categoryByName
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
@@ -80,6 +81,7 @@ class KotlinCompilationNpmResolver(
it.jsIrCompilation.set(compilation is KotlinJsIrCompilation) it.jsIrCompilation.set(compilation is KotlinJsIrCompilation)
it.npmProjectName.set(npmProject.name) it.npmProjectName.set(npmProject.name)
it.npmProjectMain.set(npmProject.main) it.npmProjectMain.set(npmProject.main)
it.esModules.set(compilation.compilerOptions.options.moduleKind.get() == JsModuleKind.MODULE_ES)
}.also { packageJsonTask -> }.also { packageJsonTask ->
project.dependencies.attributesSchema { project.dependencies.attributesSchema {
it.attribute(publicPackageJsonAttribute) it.attribute(publicPackageJsonAttribute)