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 1baa7ce9694..147f2f52c7f 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
@@ -349,4 +349,36 @@ class Kotlin2JsGradlePluginIT : BaseGradleIT() {
assertNotContains(USING_JS_INCREMENTAL_COMPILATION_MESSAGE)
}
}
+
+ @Test
+ fun testNewKotlinJsPlugin() = with(Project("kotlin-js-plugin-project", GradleVersionRequired.AtLeast("4.10.2"))) {
+ setupWorkingDir()
+ gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
+ gradleSettingsScript().modify(::transformBuildScriptWithPluginsDsl)
+
+ build("publish", "runDceKotlin", "test", "runDceBenchmarkKotlin") {
+ assertSuccessful()
+
+ assertTasksExecuted(
+ ":compileKotlin", ":compileTestKotlin", ":compileBenchmarkKotlin",
+ ":runDceKotlin", ":runDceBenchmarkKotlin"
+ )
+
+ val moduleDir = "build/repo/com/example/kotlin-js-plugin/1.0/"
+
+ val publishedJar = fileInWorkingDir(moduleDir + "kotlin-js-plugin-1.0.jar")
+ ZipFile(publishedJar).use { zip ->
+ val entries = zip.entries().asSequence().map { it.name }
+ assertTrue { "kotlin-js-plugin.js" in entries }
+ }
+
+ val publishedPom = fileInWorkingDir(moduleDir + "kotlin-js-plugin-1.0.pom")
+ val kotlinVersion = defaultBuildOptions().kotlinVersion
+ val pomText = publishedPom.readText().replace(Regex("\\s+"), "")
+ assertTrue { "kotlinx-html-js0.6.10compile" in pomText }
+ assertTrue { "kotlin-stdlib-js$kotlinVersionruntime" in pomText }
+
+ assertFileExists(moduleDir + "kotlin-js-plugin-1.0-sources.jar")
+ }
+ }
}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/build.gradle.kts
new file mode 100644
index 00000000000..34cca234c8b
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/build.gradle.kts
@@ -0,0 +1,47 @@
+plugins {
+ kotlin("js").version("")
+ id("kotlin-dce-js")
+ `maven-publish`
+}
+
+group = "com.example"
+version = "1.0"
+
+repositories {
+ mavenLocal()
+ jcenter()
+}
+
+kotlin.sourceSets {
+ main {
+ dependencies {
+ api("org.jetbrains.kotlinx:kotlinx-html-js:0.6.10")
+ implementation(kotlin("stdlib-js"))
+ }
+ }
+ test {
+ dependencies {
+ implementation(kotlin("test-js"))
+ }
+ }
+}
+
+kotlin.target.compilations.create("benchmark") {
+ defaultSourceSet.dependencies {
+ val main by kotlin.target.compilations
+ implementation(main.compileDependencyFiles + main.output.classesDirs)
+ runtimeOnly(main.runtimeDependencyFiles)
+ }
+}
+
+publishing {
+ publications {
+ create("default", MavenPublication::class.java) {
+ from(kotlin.target.components.single())
+ artifact(tasks.getByName("kotlinSourcesJar"))
+ }
+ }
+ repositories {
+ maven("$buildDir/repo")
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/settings.gradle.kts
new file mode 100644
index 00000000000..b6cdbb8e386
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/settings.gradle.kts
@@ -0,0 +1,15 @@
+pluginManagement {
+ resolutionStrategy {
+ eachPlugin{
+ when (requested.id.id) {
+ "kotlin-dce-js" -> useModule("org.jetbrains.kotlin:kotlin-gradle-plugin:")
+ }
+ }
+ }
+ repositories {
+ mavenLocal()
+ gradlePluginPortal()
+ }
+}
+
+rootProject.name = "kotlin-js-plugin"
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/benchmark/kotlin/MainBenchmark.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/benchmark/kotlin/MainBenchmark.kt
new file mode 100644
index 00000000000..7a9df1cdb51
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/benchmark/kotlin/MainBenchmark.kt
@@ -0,0 +1,9 @@
+package com.example
+
+class MainBenchmark {
+ fun runBenchmark() {
+ main()
+ hello()
+ console.log("ran at the speed of light")
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/main/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/main/kotlin/Main.kt
new file mode 100644
index 00000000000..7c18f20be13
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/main/kotlin/Main.kt
@@ -0,0 +1,15 @@
+package com.example
+
+import kotlinx.html.dom.create
+import kotlinx.html.js.div
+import kotlinx.html.p
+import kotlin.browser.document
+
+fun hello() = "hello"
+
+fun main() {
+ document.create.div {
+ p { hello() }
+ }
+ console.log(hello())
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/test/kotlin/MainTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/test/kotlin/MainTest.kt
new file mode 100644
index 00000000000..f6c873754cb
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/test/kotlin/MainTest.kt
@@ -0,0 +1,11 @@
+package com.example
+
+import kotlin.test.Test
+import kotlin.test.assertEquals
+
+class MainTest {
+ @Test
+ fun testHello() {
+ assertEquals("hello", hello())
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts
index 771c10f52bb..1d2086abacb 100644
--- a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts
+++ b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts
@@ -128,6 +128,11 @@ pluginBundle {
id = "org.jetbrains.kotlin.jvm",
display = "Kotlin JVM plugin"
)
+ create(
+ name = "kotlinJsPlugin",
+ id = "org.jetbrains.kotlin.js",
+ display = "Kotlin JS plugin"
+ )
create(
name = "kotlinMultiplatformPlugin",
id = "org.jetbrains.kotlin.multiplatform",
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt
index e15ea20e597..69bbe76e342 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt
@@ -22,6 +22,8 @@ import org.gradle.api.internal.plugins.DslObject
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
import kotlin.reflect.KClass
@@ -72,6 +74,17 @@ open class Kotlin2JsProjectExtension : KotlinSingleJavaTargetExtension() {
internal set
}
+open class KotlinJsProjectExtension : KotlinSingleTargetExtension() {
+ override lateinit var target: KotlinOnlyTarget
+
+ @Deprecated(
+ "Needed for IDE import using the MPP import mechanism",
+ level = DeprecationLevel.HIDDEN
+ )
+ fun getTargets() =
+ target.project.container(KotlinTarget::class.java).apply { add(target) }
+}
+
open class KotlinCommonProjectExtension : KotlinSingleJavaTargetExtension() {
override lateinit var target: KotlinWithJavaTarget
internal set
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt
index e680f07a9bd..e3cb6c9b976 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt
@@ -19,10 +19,10 @@ package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
-import org.jetbrains.kotlin.gradle.dsl.KotlinSingleJavaTargetExtension
+import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
-import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinJsDce
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
@@ -30,14 +30,17 @@ import java.io.File
class KotlinJsDcePlugin : Plugin {
override fun apply(project: Project) {
- val kotlinExtension = project.multiplatformExtensionOrNull ?: run {
- project.pluginManager.apply(Kotlin2JsPluginWrapper::class.java)
- project.kotlinExtension as KotlinSingleJavaTargetExtension
- }
+ val kotlinExtension =
+ project.multiplatformExtensionOrNull
+ ?: project.extensions.getByName("kotlin") as? KotlinSingleTargetExtension
+ ?: run {
+ project.pluginManager.apply(Kotlin2JsPluginWrapper::class.java)
+ project.kotlinExtension as KotlinSingleTargetExtension
+ }
fun forEachJsTarget(action: (KotlinTarget) -> Unit) {
when (kotlinExtension) {
- is KotlinSingleJavaTargetExtension -> action(kotlinExtension.target)
+ is KotlinSingleTargetExtension -> action(kotlinExtension.target)
is KotlinMultiplatformExtension ->
kotlinExtension.targets
.matching { it.platformType == KotlinPlatformType.js }
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt
index 3c624aa8a1a..9a231c5efe3 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt
@@ -23,13 +23,13 @@ import org.gradle.api.internal.FeaturePreviews
import org.gradle.api.internal.file.FileResolver
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
-import org.gradle.internal.reflect.Instantiator
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.logging.kotlinDebug
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
+import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
@@ -139,15 +139,24 @@ open class Kotlin2JsPluginWrapper @Inject constructor(
get() = Kotlin2JsProjectExtension::class
}
+open class KotlinJsPluginWrapper @Inject constructor(
+ fileResolver: FileResolver
+) : KotlinBasePluginWrapper(fileResolver) {
+ override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin =
+ KotlinJsPlugin(kotlinPluginVersion)
+
+ override val projectExtensionClass: KClass
+ get() = KotlinJsProjectExtension::class
+}
+
open class KotlinMultiplatformPluginWrapper @Inject constructor(
fileResolver: FileResolver,
- private val instantiator: Instantiator,
private val featurePreviews: FeaturePreviews
) : KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin =
KotlinMultiplatformPlugin(
- fileResolver,
- instantiator, kotlinPluginVersion, featurePreviews
+ kotlinPluginVersion,
+ featurePreviews
)
override val projectExtensionClass: KClass
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt
index c8a348873b5..5b91d1416ff 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt
@@ -7,37 +7,25 @@ package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Project
import org.gradle.api.Task
-import org.gradle.api.artifacts.*
+import org.gradle.api.artifacts.Configuration
+import org.gradle.api.artifacts.Dependency
+import org.gradle.api.artifacts.PublishArtifact
import org.gradle.api.artifacts.type.ArtifactTypeDefinition
import org.gradle.api.attributes.Usage
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
import org.gradle.api.file.FileCollection
import org.gradle.api.internal.artifacts.ArtifactAttributes
-import org.gradle.api.internal.artifacts.publish.DefaultPublishArtifact
-import org.gradle.api.internal.plugins.DefaultArtifactPublicationSet
import org.gradle.api.internal.plugins.DslObject
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.plugins.JavaBasePlugin
-import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.Delete
-import org.gradle.api.tasks.Exec
import org.gradle.api.tasks.bundling.Jar
import org.gradle.api.tasks.testing.Test
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.gradle.language.jvm.tasks.ProcessResources
-import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
-import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
-import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME
-import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPILATION_NAME
import org.jetbrains.kotlin.gradle.plugin.mpp.*
-import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile
-import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
-import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
-import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
-import java.io.File
-import java.util.*
import java.util.concurrent.Callable
abstract class AbstractKotlinTargetConfigurator(
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt
index b4b35220923..eb56d5ccef4 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt
@@ -11,7 +11,6 @@ import org.gradle.api.Project
import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.internal.FeaturePreviews
-import org.gradle.api.internal.file.FileResolver
import org.gradle.api.internal.plugins.DslObject
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.publish.PublicationContainer
@@ -20,7 +19,6 @@ import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.internal.publication.MavenPublicationInternal
import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven
import org.gradle.api.tasks.compile.AbstractCompile
-import org.gradle.internal.reflect.Instantiator
import org.gradle.jvm.tasks.Jar
import org.gradle.util.ConfigureUtil
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
@@ -36,8 +34,6 @@ import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.presetName
class KotlinMultiplatformPlugin(
- private val fileResolver: FileResolver,
- private val instantiator: Instantiator,
private val kotlinPluginVersion: String,
private val featurePreviews: FeaturePreviews // TODO get rid of this internal API usage once we don't need it
) : Plugin {
@@ -83,7 +79,7 @@ class KotlinMultiplatformPlugin(
// set up metadata publishing
targetsFromPreset.fromPreset(
- KotlinMetadataTargetPreset(project, instantiator, fileResolver, kotlinPluginVersion),
+ KotlinMetadataTargetPreset(project, kotlinPluginVersion),
METADATA_TARGET_NAME
)
configurePublishingWithMavenPublish(project)
@@ -135,8 +131,8 @@ class KotlinMultiplatformPlugin(
fun setupDefaultPresets(project: Project) {
with(project.multiplatformExtension.presets) {
- add(KotlinJvmTargetPreset(project, instantiator, fileResolver, kotlinPluginVersion))
- add(KotlinJsTargetPreset(project, instantiator, fileResolver, kotlinPluginVersion))
+ add(KotlinJvmTargetPreset(project, kotlinPluginVersion))
+ add(KotlinJsTargetPreset(project, kotlinPluginVersion))
add(KotlinAndroidTargetPreset(project, kotlinPluginVersion))
add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion))
HostManager().targets.forEach { _, target ->
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt
index ece5062e51d..57c0d7ea47e 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt
@@ -6,24 +6,23 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
-import org.gradle.api.internal.file.FileResolver
-import org.gradle.internal.reflect.Instantiator
import org.jetbrains.kotlin.gradle.plugin.*
abstract class KotlinOnlyTargetPreset>(
protected val project: Project,
- private val instantiator: Instantiator,
- private val fileResolver: FileResolver,
protected val kotlinPluginVersion: String
) : KotlinTargetPreset> {
protected open fun createKotlinTargetConfigurator(): KotlinTargetConfigurator =
KotlinTargetConfigurator(createDefaultSourceSets = true, createTestCompilation = true)
+ protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? =
+ target.targetName
+
override fun createTarget(name: String): KotlinOnlyTarget {
val result = KotlinOnlyTarget(project, platformType).apply {
targetName = name
- disambiguationClassifier = name
+ disambiguationClassifier = provideTargetDisambiguationClassifier(this@apply)
preset = this@KotlinOnlyTargetPreset
val compilationFactory = createCompilationFactory(this)
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt
new file mode 100644
index 00000000000..8e5820683fa
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2010-2019 JetBrains s.r.o. 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
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.plugins.JavaBasePlugin
+import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
+import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
+import org.jetbrains.kotlin.gradle.plugin.configureDefaultVersionsResolutionStrategy
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset
+import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
+
+open class KotlinJsPlugin(
+ private val kotlinPluginVersion: String
+) : Plugin {
+
+ override fun apply(project: Project) {
+ // TODO get rid of this plugin, too? Use the 'base' plugin instead?
+ // in fact, the attributes schema of the Java base plugin may be required to consume non-MPP Kotlin/JS libs,
+ // so investigation is needed
+ project.plugins.apply(JavaBasePlugin::class.java)
+
+ checkGradleCompatibility()
+
+ val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension
+ configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion)
+
+ val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion).createTarget("kotlin")
+
+ kotlinExtension.target = target
+
+ project.components.addAll(target.components)
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt
index be3617741ea..4975f2561e7 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt
@@ -7,22 +7,16 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
-import org.gradle.api.internal.file.FileResolver
-import org.gradle.internal.reflect.Instantiator
import org.jetbrains.kotlin.gradle.plugin.Kotlin2JsSourceSetProcessor
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetProcessor
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
-class KotlinJsTargetPreset(
+open class KotlinJsTargetPreset(
project: Project,
- instantiator: Instantiator,
- fileResolver: FileResolver,
kotlinPluginVersion: String
) : KotlinOnlyTargetPreset(
project,
- instantiator,
- fileResolver,
kotlinPluginVersion
) {
override fun getName(): String = PRESET_NAME
@@ -42,3 +36,13 @@ class KotlinJsTargetPreset(
const val PRESET_NAME = "js"
}
}
+
+class KotlinJsSingleTargetPreset(
+ project: Project,
+ kotlinPluginVersion: String
+) :
+ KotlinJsTargetPreset(project, kotlinPluginVersion) {
+
+ // In a Kotlin/JS single-platform project, we don't need any disambiguation suffixes or prefixes in the names:
+ override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? = null
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt
index bb39310e96c..c683ed89771 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt
@@ -7,8 +7,6 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
-import org.gradle.api.internal.file.FileResolver
-import org.gradle.internal.reflect.Instantiator
import org.jetbrains.kotlin.gradle.plugin.Kotlin2JvmSourceSetProcessor
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetProcessor
@@ -16,13 +14,9 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
class KotlinJvmTargetPreset(
project: Project,
- instantiator: Instantiator,
- fileResolver: FileResolver,
kotlinPluginVersion: String
) : KotlinOnlyTargetPreset(
project,
- instantiator,
- fileResolver,
kotlinPluginVersion
) {
override fun getName(): String = PRESET_NAME
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt
index 3dc7d189f24..7cdb751ed0f 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt
@@ -7,8 +7,6 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
-import org.gradle.api.internal.file.FileResolver
-import org.gradle.internal.reflect.Instantiator
import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.*
@@ -17,13 +15,9 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
class KotlinMetadataTargetPreset(
project: Project,
- instantiator: Instantiator,
- fileResolver: FileResolver,
kotlinPluginVersion: String
) : KotlinOnlyTargetPreset(
project,
- instantiator,
- fileResolver,
kotlinPluginVersion
) {
override fun getName(): String = PRESET_NAME
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties
new file mode 100644
index 00000000000..661fbbe0005
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties
@@ -0,0 +1 @@
+implementation-class=org.jetbrains.kotlin.gradle.plugin.KotlinJsPluginWrapper
\ No newline at end of file