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 index ba38d761f35..7506d971522 100644 --- 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 @@ -108,8 +108,11 @@ constructor( private val browserLazyDelegate = lazy { project.objects.newInstance(KotlinBrowserJs::class.java, this).also { - it.configure() - browserConfiguredHandlers.forEach { handler -> handler(it) } + browserConfiguredHandlers.forEach { handler -> + it.whenProducingConfigured { + handler(this) + } + } browserConfiguredHandlers.clear() } } @@ -126,8 +129,12 @@ constructor( private val nodejsLazyDelegate = lazy { project.objects.newInstance(KotlinNodeJs::class.java, this).also { - it.configure() - nodejsConfiguredHandlers.forEach { handler -> handler(it) } + nodejsConfiguredHandlers.forEach { handler -> + it.whenProducingConfigured { + handler(this) + } + } + nodejsConfiguredHandlers.clear() } } 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 7012eb94304..274dd358f46 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 @@ -66,6 +66,10 @@ interface KotlinJsSubTargetDsl { } } + fun produceKotlinLibrary() + + fun produceExecutable() + val testRuns: NamedDomainObjectContainer } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt index fa37cb44886..a131074ee33 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt @@ -43,6 +43,13 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) : override val testTaskDescription: String get() = "Run all ${target.name} tests inside browser using karma and webpack" + override fun configure() { + super.configure() + browserProducingConfiguredHandlers.forEach { handler -> + handler(this) + } + } + override fun configureDefaultTestFramework(testTask: KotlinJsTest) { testTask.useKarma { useChromeHeadless() @@ -287,6 +294,14 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) : } } + fun whenProducingConfigured(body: KotlinBrowserJs.() -> Unit) { + if (producingConfigured) { + this.body() + } else { + browserProducingConfiguredHandlers += body + } + } + companion object { const val DCE_TASK_PREFIX = "processDce" const val DCE_TASK_SUFFIX = "kotlinJs" diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt index c689280e661..3ed3d25bc99 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt @@ -37,12 +37,26 @@ abstract class KotlinJsSubTarget( final override lateinit var testRuns: NamedDomainObjectContainer private set - fun configure() { - NpmResolverPlugin.apply(project) + protected val producingConfigured: Boolean = false + + protected val browserProducingConfiguredHandlers: MutableList Unit> = mutableListOf() + protected val nodejsProducingConfiguredHandlers: MutableList Unit> = mutableListOf() + + override fun produceKotlinLibrary() { + configure() + } + + override fun produceExecutable() { + configure() configureBuildVariants() - configureTests() configureMain() + } + + protected open fun configure() { + NpmResolverPlugin.apply(project) + + configureTests() target.compilations.all { val npmProject = it.npmProject 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 index 4a07cb91cce..4f956b465e6 100644 --- 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 @@ -20,6 +20,13 @@ open class KotlinNodeJs @Inject constructor(target: KotlinJsTarget) : private val runTaskName = disambiguateCamelCased("run") + override fun configure() { + super.configure() + nodejsProducingConfiguredHandlers.forEach { handler -> + handler(this) + } + } + override fun runTask(body: NodeJsExec.() -> Unit) { (project.tasks.getByName(runTaskName) as NodeJsExec).body() } @@ -43,4 +50,12 @@ open class KotlinNodeJs @Inject constructor(target: KotlinJsTarget) : override fun configureBuildVariants() { } + + fun whenProducingConfigured(body: KotlinNodeJs.() -> Unit) { + if (producingConfigured) { + this.body() + } else { + nodejsProducingConfiguredHandlers += body + } + } } \ No newline at end of file