[Gradle, JS] Use live collections for webpack configurations

^KT-57116 fixed
This commit is contained in:
Ilya Goncharov
2023-04-26 09:09:01 +00:00
committed by Space Team
parent f058ee21b0
commit 133992d0bc
3 changed files with 61 additions and 14 deletions
@@ -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
@@ -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<Action<KotlinWebpack>> = mutableListOf()
private val runTaskConfigurations: MutableList<Action<KotlinWebpack>> = mutableListOf()
private val webpackTaskConfigurations: DomainObjectSet<Action<KotlinWebpack>> = project.objects.domainObjectSet(Action::class.java)
as DomainObjectSet<Action<KotlinWebpack>>
private val runTaskConfigurations: DomainObjectSet<Action<KotlinWebpack>> = project.objects.domainObjectSet(Action::class.java)
as DomainObjectSet<Action<KotlinWebpack>>
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<File>,
entryModuleName: Provider<String>,
configurationActions: List<Action<KotlinWebpack>>,
configurationActions: DomainObjectSet<Action<KotlinWebpack>>,
nodeJs: NodeJsRootExtension,
defaultArchivesName: Property<String>,
) {
@@ -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)
}
}
@@ -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<Action<KotlinJsTestFramework?>> =
project.objects.domainObjectSet(Action::class.java) as DomainObjectSet<Action<KotlinJsTestFramework?>>
fun onTestFrameworkSet(action: (KotlinJsTestFramework?) -> Unit) {
fun onTestFrameworkSet(action: Action<KotlinJsTestFramework?>) {
onTestFrameworkCallbacks.add(action)
testFramework?.let { testFramework: KotlinJsTestFramework ->
onTestFrameworkCallbacks.forEach { callback ->
callback(testFramework)
}
}
}
@Suppress("unused")