From 133992d0bc00729b6cee781e2359458f6d60410a Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 26 Apr 2023 09:09:01 +0000 Subject: [PATCH] [Gradle, JS] Use live collections for webpack configurations ^KT-57116 fixed --- .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 45 +++++++++++++++++++ .../gradle/targets/js/ir/KotlinBrowserJsIr.kt | 12 +++-- .../gradle/targets/js/testing/KotlinJsTest.kt | 18 ++++---- 3 files changed, 61 insertions(+), 14 deletions(-) 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 e2ec03a75b1..bb812aa9a9e 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 @@ -498,6 +498,51 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) { } } } + + @DisplayName("Webpack config block works after task configured") + @GradleTest + fun testWebpackConfigWorksAfterTaskConfigured(gradleVersion: GradleVersion) { + project("js-library-with-executable", gradleVersion) { + buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) + + buildGradleKts.modify { originalScript -> + buildString { + append(originalScript) + append( + """ + | + |kotlin { + | js { + | browser { + | } + | } + |} + | + |tasks.all { + | // do nothing + |} + | + |kotlin { + | js { + | browser { + | commonWebpackConfig { + | outputFileName = "CORRECT_NAME.js" + | } + | } + | } + |} + | + """.trimMargin() + ) + } + } + + build("browserProductionWebpack") { + assertTasksExecuted(":browserProductionWebpack") + assertFileExists(projectPath.resolve("build/${Distribution.DIST}/js/productionExecutable/CORRECT_NAME.js")) + } + } + } } @JsGradlePluginTests diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt index f6e592c39d3..5111baddb56 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.Action +import org.gradle.api.DomainObjectCollection +import org.gradle.api.DomainObjectSet import org.gradle.api.Task import org.gradle.api.provider.Property import org.gradle.api.provider.Provider @@ -42,8 +44,10 @@ abstract class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : private val nodeJs = project.rootProject.kotlinNodeJsExtension - private val webpackTaskConfigurations: MutableList> = mutableListOf() - private val runTaskConfigurations: MutableList> = mutableListOf() + private val webpackTaskConfigurations: DomainObjectSet> = project.objects.domainObjectSet(Action::class.java) + as DomainObjectSet> + private val runTaskConfigurations: DomainObjectSet> = project.objects.domainObjectSet(Action::class.java) + as DomainObjectSet> override val testTaskDescription: String get() = "Run all ${target.name} tests inside browser using karma and webpack" @@ -267,7 +271,7 @@ abstract class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : mode: KotlinJsBinaryMode, inputFilesDirectory: Provider, entryModuleName: Provider, - configurationActions: List>, + configurationActions: DomainObjectSet>, nodeJs: NodeJsRootExtension, defaultArchivesName: Property, ) { @@ -285,7 +289,7 @@ abstract class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : mainOutputFileName.convention(defaultArchivesName.orElse("main").map { "$it.js" }).finalizeValueOnRead() - configurationActions.forEach { configure -> + configurationActions.all { configure -> configure.execute(this) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt index 17faa104771..8e9212bad53 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.targets.js.testing import org.gradle.api.Action +import org.gradle.api.DomainObjectSet import org.gradle.api.file.FileCollection import org.gradle.api.file.RegularFileProperty import org.gradle.api.tasks.* @@ -19,6 +20,8 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.testing.karma.KotlinKarma import org.jetbrains.kotlin.gradle.targets.js.testing.mocha.KotlinMocha +import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack +import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig import org.jetbrains.kotlin.gradle.tasks.KotlinTest import org.jetbrains.kotlin.gradle.utils.getValue import org.jetbrains.kotlin.gradle.utils.newFileProperty @@ -46,21 +49,16 @@ constructor( var testFramework: KotlinJsTestFramework? = null set(value) { field = value - onTestFrameworkCallbacks.forEach { callback -> - callback(value) + onTestFrameworkCallbacks.all { callback -> + callback.execute(value) } } - private var onTestFrameworkCallbacks: MutableList<(KotlinJsTestFramework?) -> Unit> = - mutableListOf() + private var onTestFrameworkCallbacks: DomainObjectSet> = + project.objects.domainObjectSet(Action::class.java) as DomainObjectSet> - fun onTestFrameworkSet(action: (KotlinJsTestFramework?) -> Unit) { + fun onTestFrameworkSet(action: Action) { onTestFrameworkCallbacks.add(action) - testFramework?.let { testFramework: KotlinJsTestFramework -> - onTestFrameworkCallbacks.forEach { callback -> - callback(testFramework) - } - } } @Suppress("unused")