From f6891853e01890ecf9a5d9910ff06f8dc35020c6 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 7 Apr 2020 17:51:40 +0300 Subject: [PATCH] [Gradle, JS] Reorganize css settings with rules #KT-38055 fixed --- .../targets/js/webpack/KotlinWebpackConfig.kt | 115 +++++++++++------- .../js/webpack/KotlinWebpackCssSettings.kt | 34 +++++- 2 files changed, 106 insertions(+), 43 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt index 9c4cd30fe2b..6c70c5e0fd3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt @@ -57,16 +57,19 @@ data class KotlinWebpackConfig( it.add(versions.webpackDevServer) } - if (!cssSettings.enabled) return@also + if (!cssSettings.enabled || cssSettings.rules.isEmpty()) return@also it.add(versions.cssLoader) - when (cssSettings.mode) { - EXTRACT -> it.add(versions.miniCssExtractPlugin) - INLINE -> it.add(versions.styleLoader) - IMPORT -> { + cssSettings.rules.forEach { rule -> + when (rule.mode) { + EXTRACT -> it.add(versions.miniCssExtractPlugin) + INLINE -> it.add(versions.styleLoader) + IMPORT -> { + } + else -> cssError() } - else -> cssError() } + } enum class Mode(val code: String) { @@ -253,7 +256,7 @@ data class KotlinWebpackConfig( } private fun Appendable.appendCssSettings() { - if (!cssSettings.enabled) + if (!cssSettings.enabled || cssSettings.rules.isEmpty()) return appendln( @@ -263,53 +266,81 @@ data class KotlinWebpackConfig( """.trimIndent() ) - appendln( - """ - | const use = [ - | { - | loader: 'css-loader', - | options: {}, - | } - | ] - """.trimMargin() - ) - val extractedCss = """ - | const MiniCssExtractPlugin = require('mini-css-extract-plugin'); - | use.unshift({ - | loader: MiniCssExtractPlugin.loader, - | options: {} - | }) - | config.plugins.push(new MiniCssExtractPlugin()) + | const MiniCssExtractPlugin = require('mini-css-extract-plugin'); + | use.unshift({ + | loader: MiniCssExtractPlugin.loader, + | options: {} + | }) + | config.plugins.push(new MiniCssExtractPlugin()) """.trimMargin() val inlinedCss = """ - | use.unshift({ - | loader: 'style-loader', - | options: {} - | }) - | + | use.unshift({ + | loader: 'style-loader', + | options: {} + | }) + | """.trimMargin() - when (cssSettings.mode) { - EXTRACT -> appendln(extractedCss) - INLINE -> appendln(inlinedCss) - IMPORT -> { + cssSettings.rules.forEach { rule -> + appendln( + """ + | ;(function(config) { + """.trimMargin() + ) + appendln( + """ + | const use = [ + | { + | loader: 'css-loader', + | options: {}, + | } + | ] + """.trimMargin() + ) + + when (rule.mode) { + EXTRACT -> appendln(extractedCss) + INLINE -> appendln(inlinedCss) + IMPORT -> { + } + else -> cssError() } - else -> cssError() - } - appendln( - """ - | config.module.rules.push({ - | test: /\.css${'$'}/, - | use: use - | }) + val excluded = rule.exclude.let { + if (it.isNotEmpty()) { + "[${it.joinToString()}]" + } else null + } + + val included = rule.include.let { + if (it.isNotEmpty()) { + "[${it.joinToString()}]" + } else null + } + + appendln( + """ + | config.module.rules.push({ + | test: /\.css${'$'}/, + | use: use, + | ${excluded?.let { "exclude: $it," } ?: ""} + | ${included?.let { "include: $it" } ?: ""} + | }) """.trimMargin() - ) + ) + + appendln( + """ + | })(config); + + """.trimMargin() + ) + } appendln( """ diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackCssSettings.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackCssSettings.kt index b940e1f9025..c7131391227 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackCssSettings.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackCssSettings.kt @@ -6,14 +6,46 @@ package org.jetbrains.kotlin.gradle.targets.js.webpack import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.Nested import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackCssMode.INLINE data class KotlinWebpackCssSettings( @Input var enabled: Boolean = true, + @Nested + var rules: MutableList = mutableListOf( + KotlinWebpackCssRule() + ) +) { + @get:Internal + var mode: String + get() = + rules + .singleOrNull() + ?.mode ?: singleRuleError() + set(value) { + rules.singleOrNull() + ?.let { + it.mode = value + } ?: singleRuleError() + } + + private fun singleRuleError(): Nothing { + throw error("CSS mode shortcut can be applied only with one css rule") + } +} + +data class KotlinWebpackCssRule( @Input - var mode: String = INLINE + var mode: String = INLINE, + + @Input + var include: MutableList = mutableListOf(), + + @Input + var exclude: MutableList = mutableListOf() ) object KotlinWebpackCssMode {