From c0deea33bb5fc38ff81963c51ae3953873db6702 Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Mon, 13 May 2019 10:54:21 +0300 Subject: [PATCH] Gradle, JS: resolve NPM dependencies inside task when possible #KT-30530 --- .../generators/gradle/dsl/presetEntries.kt | 5 +- ...otlinTargetContainerWithPresetFunctions.kt | 7 +-- .../gradle/plugin/KotlinTargetConfigurator.kt | 1 + .../gradle/plugin/mpp/kotlinTargetPresets.kt | 15 ++--- .../gradle/targets/js/KotlinJsTarget.kt | 58 +++++++++++++++++++ .../targets/js/KotlinJsTargetConfigurator.kt | 24 ++++++++ .../gradle/targets/js/KotlinJsTargetPreset.kt | 18 +++--- .../kotlin/gradle/targets/js/KotlinNodeJs.kt | 36 ------------ .../targets/js/dsl/KotlinJsTargetDsl.kt | 11 ++-- .../gradle/targets/js/npm/NpmResolveTask.kt | 16 +++++ .../js/{ => subtargets}/KotlinBrowserJs.kt | 28 ++++++--- .../KotlinJsSubTarget.kt} | 32 +++++++--- .../targets/js/subtargets/KotlinNodeJs.kt | 46 +++++++++++++++ 13 files changed, 215 insertions(+), 82 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinNodeJs.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmResolveTask.kt rename libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/{ => subtargets}/KotlinBrowserJs.kt (63%) rename libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/{KotlinJsInnerTargetConfigurator.kt => subtargets/KotlinJsSubTarget.kt} (71%) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinNodeJs.kt diff --git a/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/presetEntries.kt b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/presetEntries.kt index 67339962752..2e03f905331 100644 --- a/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/presetEntries.kt +++ b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/presetEntries.kt @@ -30,10 +30,7 @@ internal val jvmPresetEntry = KotlinPresetEntry( internal val jsPresetEntry = KotlinPresetEntry( "js", typeName("$MPP_PACKAGE.KotlinJsTargetPreset"), - typeName( - "$MPP_PACKAGE.KotlinOnlyTarget", - "$MPP_PACKAGE.KotlinJsCompilation" - ) + typeName("org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget") ) internal val androidPresetEntry = KotlinPresetEntry( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt index 5e8f9e9fa06..033a5a644c9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt @@ -5,12 +5,11 @@ import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.plugin.KotlinTargetsContainerWithPresets import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTargetPreset -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetPreset -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget // DO NOT EDIT MANUALLY! Generated by org.jetbrains.kotlin.generators.gradle.dsl.MppPresetFunctionsCodegenKt @@ -34,8 +33,8 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP fun js( name: String = "js", - configure: KotlinOnlyTarget.() -> Unit = { } - ): KotlinOnlyTarget = + configure: KotlinJsTarget.() -> Unit = { } + ): KotlinJsTarget = configureOrCreate( name, presets.getByName("js") as KotlinJsTargetPreset, 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 c21789dddda..6ed99662103 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 @@ -220,6 +220,7 @@ abstract class AbstractKotlinTargetConfigurator companion object { const val testTaskNameSuffix = "test" + const val runTaskNameSuffix = "run" fun defineConfigurationsForCompilation( compilation: KotlinCompilation<*> 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 83d8b73ecf1..85f9c88bec0 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,25 +6,22 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.KotlinTargetConfigurator -import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset +import org.jetbrains.kotlin.gradle.plugin.* -abstract class KotlinOnlyTargetPreset, T : KotlinCompilation<*>>( +abstract class KotlinOnlyTargetPreset>( protected val project: Project, protected val kotlinPluginVersion: String -) : KotlinTargetPreset { +) : KotlinTargetPreset> { protected abstract fun createKotlinTargetConfigurator(): KotlinTargetConfigurator protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? = target.targetName - abstract protected fun instantiateTarget(): R + protected open fun createKotlinOnlyTarget() = KotlinOnlyTarget(project, platformType) - override fun createTarget(name: String): R { - val result = instantiateTarget().apply { + override fun createTarget(name: String): KotlinOnlyTarget { + val result = createKotlinOnlyTarget().apply { targetName = name disambiguationClassifier = provideTargetDisambiguationClassifier(this@apply) preset = this@KotlinOnlyTargetPreset diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt new file mode 100644 index 00000000000..b9b851f97b3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt @@ -0,0 +1,58 @@ +/* + * 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 org.jetbrains.kotlin.gradle.targets.js + +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix +import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.testTaskNameSuffix +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl +import org.jetbrains.kotlin.gradle.targets.js.subtargets.KotlinBrowserJs +import org.jetbrains.kotlin.gradle.targets.js.subtargets.KotlinNodeJs +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName + +class KotlinJsTarget(project: Project, platformType: KotlinPlatformType) : + KotlinOnlyTarget(project, platformType), KotlinJsTargetDsl { + + val testTaskName = lowerCamelCaseName(disambiguationClassifier, testTaskNameSuffix) + val testTask get() = project.tasks.maybeCreate(testTaskName) + + val runTaskName = lowerCamelCaseName(disambiguationClassifier, runTaskNameSuffix) + val runTask get() = project.tasks.maybeCreate(runTaskName) + + private var hasSubtargets = false + + val browser by lazy { + hasSubtargets = true + KotlinBrowserJs(this).also { + it.configure() + } + } + val nodejs by lazy { + hasSubtargets = true + KotlinNodeJs(this).also { + it.configure() + } + } + + override fun browser(body: KotlinJsBrowserDsl.() -> Unit) { + browser.body() + } + + override fun nodejs(body: KotlinJsNodeDsl.() -> Unit) { + nodejs.body() + } + + fun configureDefaults() { + if (!hasSubtargets) { + browser() + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetConfigurator.kt index 5a0c9039a6f..eb95bbe65b7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetConfigurator.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.targets.js +import org.gradle.api.plugins.JavaBasePlugin import org.jetbrains.kotlin.gradle.plugin.Kotlin2JsSourceSetProcessor import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetProcessor @@ -15,10 +16,33 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName open class KotlinJsTargetConfigurator(kotlinPluginVersion: String) : KotlinTargetConfigurator(true, true, kotlinPluginVersion) { + override fun configureTarget(target: KotlinOnlyTarget) { + target as KotlinJsTarget + + target.configureDefaults() + super.configureTarget(target) + + target.project.tasks.maybeCreate(runTaskNameSuffix).dependsOn(target.runTask) + } + + override fun configureTest(target: KotlinOnlyTarget) { + // tests configured in KotlinJsSubTarget.configure + + target as KotlinJsTarget + val tasks = target.project.tasks + val check = tasks.findByName(JavaBasePlugin.CHECK_TASK_NAME) + + @Suppress("IfThenToSafeAccess") + if (check != null) { + check.dependsOn(target.testTask) + } + } + override fun buildCompilationProcessor(compilation: KotlinJsCompilation): KotlinSourceSetProcessor<*> { val tasksProvider = KotlinTasksProvider(compilation.target.targetName) return Kotlin2JsSourceSetProcessor(compilation.target.project, tasksProvider, compilation, kotlinPluginVersion) 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 b605042cf63..ede6af4b33a 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 @@ -3,22 +3,27 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility +@file:Suppress("PackageDirectoryMismatch") + +// Old package for compatibility package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.targets.js.KotlinJsSingleTargetConfigurator +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator open class KotlinJsTargetPreset( project: Project, kotlinPluginVersion: String -) : KotlinOnlyTargetPreset, KotlinJsCompilation>( +) : KotlinOnlyTargetPreset( project, kotlinPluginVersion ) { - override fun instantiateTarget() = KotlinOnlyTarget(project, KotlinPlatformType.js) + override val platformType: KotlinPlatformType + get() = KotlinPlatformType.js + + override fun createKotlinOnlyTarget() = KotlinJsTarget(project, platformType) override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator(kotlinPluginVersion) @@ -27,9 +32,6 @@ open class KotlinJsTargetPreset( override fun createCompilationFactory(forTarget: KotlinOnlyTarget) = KotlinJsCompilationFactory(project, forTarget) - override val platformType: KotlinPlatformType - get() = KotlinPlatformType.js - companion object { const val PRESET_NAME = "js" } @@ -44,5 +46,5 @@ class KotlinJsSingleTargetPreset( // 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 - override fun createKotlinTargetConfigurator() = KotlinJsSingleTargetConfigurator(kotlinPluginVersion) + override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator(kotlinPluginVersion) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinNodeJs.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinNodeJs.kt deleted file mode 100644 index b6e748c1622..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinNodeJs.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget -import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec -import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject -import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest -import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask - -class KotlinNodeJs(target: KotlinOnlyTarget) : - KotlinJsInnerTargetConfigurator(target) { - - override fun configureDefaultTestFramework(it: KotlinJsTest) { - it.useNodeJs { } - } - - override fun configureRun(compilation: KotlinJsCompilation) { - // source maps support - compilation.dependencies { - runtimeOnly(kotlin("test-nodejs-runner")) - } - - val project = target.project - project.createOrRegisterTask("run") { - it.args(project.npmProject.compileOutput(compilation.compileKotlinTask)) - - // source maps support - it.args("--require", "kotlin-test-nodejs-runner/kotlin-nodejs-source-map-support.js") - } - } -} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt index d75918b8fa0..67b401248b8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt @@ -10,21 +10,22 @@ import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack interface KotlinJsTargetDsl { - fun browser() + fun browser() = browser { } fun browser(body: KotlinJsBrowserDsl.() -> Unit) - fun nodejs() + fun nodejs() = nodejs { } fun nodejs(body: KotlinJsNodeDsl.() -> Unit) } -interface KotlinJsInnerTargetDsl { +interface KotlinJsSubTargetDsl { fun testTask(body: KotlinJsTest.() -> Unit) } -interface KotlinJsBrowserDsl : KotlinJsInnerTargetDsl { +interface KotlinJsBrowserDsl : KotlinJsSubTargetDsl { fun runTask(body: KotlinWebpack.() -> Unit) + fun webpackTask(body: KotlinWebpack.() -> Unit) } -interface KotlinJsNodeDsl : KotlinJsInnerTargetDsl { +interface KotlinJsNodeDsl : KotlinJsSubTargetDsl { fun runTask(body: NodeJsExec.() -> Unit) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmResolveTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmResolveTask.kt new file mode 100644 index 00000000000..abd73ca03b2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmResolveTask.kt @@ -0,0 +1,16 @@ +/* + * 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 org.jetbrains.kotlin.gradle.targets.js.npm + +import org.gradle.api.internal.AbstractTask +import org.gradle.api.tasks.TaskAction + +open class NpmResolveTask : AbstractTask() { + @TaskAction + fun resolve() { + NpmResolver.resolve(project) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinBrowserJs.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt similarity index 63% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinBrowserJs.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt index 7d4c69d07ad..6d3325f89c5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinBrowserJs.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt @@ -1,13 +1,15 @@ /* - * 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. + * 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 org.jetbrains.kotlin.gradle.targets.js +package org.jetbrains.kotlin.gradle.targets.js.subtargets import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest @@ -15,8 +17,12 @@ import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask -class KotlinBrowserJs(target: KotlinOnlyTarget) : KotlinJsInnerTargetConfigurator(target, "browser") { +class KotlinBrowserJs(target: KotlinJsTarget) : + KotlinJsSubTarget(target, "browser"), + KotlinJsBrowserDsl { + private val versions = project.nodeJs.versions + private val webpackTaskName = disambiguateCamelCased("webpack") override fun configureDefaultTestFramework(it: KotlinJsTest) { it.useKarma { @@ -25,13 +31,21 @@ class KotlinBrowserJs(target: KotlinOnlyTarget) : KotlinJsI } } + override fun runTask(body: KotlinWebpack.() -> Unit) { + (project.tasks.getByName(runTaskName) as KotlinWebpack).body() + } + + override fun webpackTask(body: KotlinWebpack.() -> Unit) { + (project.tasks.getByName(webpackTaskName) as KotlinWebpack).body() + } + override fun configureRun(compilation: KotlinJsCompilation) { val project = compilation.target.project val npmProject = project.npmProject val compileKotlinTask = compilation.compileKotlinTask project.createOrRegisterTask(disambiguateCamelCased("webpack")) { - it.dependsOn(compileKotlinTask) + it.dependsOn(npmResolveTask, compileKotlinTask) it.entry = npmProject.compileOutput(compileKotlinTask) @@ -39,7 +53,7 @@ class KotlinBrowserJs(target: KotlinOnlyTarget) : KotlinJsI } project.createOrRegisterTask(disambiguateCamelCased("run")) { - it.dependsOn(compileKotlinTask) + it.dependsOn(npmResolveTask, compileKotlinTask) it.bin = "webpack-dev-server" it.entry = npmProject.compileOutput(compileKotlinTask) @@ -50,7 +64,7 @@ class KotlinBrowserJs(target: KotlinOnlyTarget) : KotlinJsI ) it.outputs.upToDateWhen { false } - project.tasks.maybeCreate("run").dependsOn(it) + target.runTask.dependsOn(it) } } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsInnerTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt similarity index 71% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsInnerTargetConfigurator.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt index 90c41bce798..3ac1053ab4d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsInnerTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt @@ -1,27 +1,35 @@ /* - * 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. + * 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 org.jetbrains.kotlin.gradle.targets.js +package org.jetbrains.kotlin.gradle.targets.js.subtargets import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin +import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolveTask import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask import org.jetbrains.kotlin.gradle.testing.internal.configureConventions import org.jetbrains.kotlin.gradle.testing.internal.registerTestTask import org.jetbrains.kotlin.utils.addIfNotNull -abstract class KotlinJsInnerTargetConfigurator( - val target: KotlinOnlyTarget, +abstract class KotlinJsSubTarget( + val target: KotlinJsTarget, private val disambiguationClassifier: String -) { +) : KotlinJsSubTargetDsl { val project get() = target.project + val npmResolveTask = project.createOrRegisterTask("npmResolve") {} + + val runTaskName = disambiguateCamelCased("run") + val testTaskName = disambiguateCamelCased("test") + fun configure() { configureTests() configureRun() @@ -52,7 +60,8 @@ abstract class KotlinJsInnerTargetConfigurator( private fun configureTests(compilation: KotlinJsCompilation) { val compileTask = compilation.compileKotlinTask - val testTaskName = disambiguateCamelCased("test") + + compileTask.dependsOn(npmResolveTask) // apply plugin (cannot be done at task instantiation time) val nodeJs = NodeJsPlugin.apply(target.project).root @@ -60,7 +69,7 @@ abstract class KotlinJsInnerTargetConfigurator( val testJs = project.createOrRegisterTask(testTaskName) { testJs -> testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP - testJs.dependsOn(compileTask, nodeJs.nodeJsSetupTask) + testJs.dependsOn(npmResolveTask, compileTask, nodeJs.nodeJsSetupTask) testJs.onlyIf { compileTask.outputFile.exists() @@ -71,7 +80,7 @@ abstract class KotlinJsInnerTargetConfigurator( testJs.configureConventions() - project.tasks.maybeCreate("test").dependsOn(testJs) + target.testTask.dependsOn(testJs) } registerTestTask(testJs) @@ -90,10 +99,15 @@ abstract class KotlinJsInnerTargetConfigurator( fun configureRun() { target.compilations.all { compilation -> if (compilation.name == KotlinCompilation.MAIN_COMPILATION_NAME) { + compilation.compileKotlinTask.dependsOn(npmResolveTask) configureRun(compilation) } } } protected abstract fun configureRun(compilation: KotlinJsCompilation) + + override fun testTask(body: KotlinJsTest.() -> Unit) { + (project.tasks.getByName(testTaskName) as KotlinJsTest).body() + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinNodeJs.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinNodeJs.kt new file mode 100644 index 00000000000..9da1e0d0412 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinNodeJs.kt @@ -0,0 +1,46 @@ +/* + * 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 org.jetbrains.kotlin.gradle.targets.js.subtargets + +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl +import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec +import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject +import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest +import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask + +class KotlinNodeJs(target: KotlinJsTarget) : + KotlinJsSubTarget(target, "nodeJs"), + KotlinJsNodeDsl { + + override fun runTask(body: NodeJsExec.() -> Unit) { + (project.tasks.getByName(runTaskName) as NodeJsExec).body() + } + + override fun configureDefaultTestFramework(it: KotlinJsTest) { + it.useNodeJs { } + } + + override fun configureRun(compilation: KotlinJsCompilation) { + // source maps support + compilation.dependencies { + runtimeOnly(kotlin("test-nodejs-runner")) + } + + val project = target.project + project.createOrRegisterTask(disambiguateCamelCased("run")) { + val npmProject = project.npmProject + it.args(npmProject.compileOutput(compilation.compileKotlinTask)) + + // source maps support + it.args("--require", npmProject.getModuleEntryPath("kotlin-test-nodejs-runner")) + + target.runTask.dependsOn(it) + } + } +} \ No newline at end of file