[Gradle, JS] Add compatibility with webpack 4
^KT-42921 fixed
This commit is contained in:
committed by
TeamCityServer
parent
a1a01a1428
commit
a291895ebe
+16
@@ -15,6 +15,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
|
||||
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat.Companion.externalsOutputFormatProperty
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion.Companion.warningMessage
|
||||
import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter
|
||||
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
|
||||
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
||||
@@ -248,6 +250,20 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
||||
val jsCompiler: KotlinJsCompilerType
|
||||
get() = property(jsCompilerProperty)?.let { KotlinJsCompilerType.byArgumentOrNull(it) } ?: KotlinJsCompilerType.LEGACY
|
||||
|
||||
/**
|
||||
* Use Webpack 4 for compatibility
|
||||
*/
|
||||
val webpackMajorVersion: WebpackMajorVersion
|
||||
get() = property(WebpackMajorVersion.webpackMajorVersion)?.let { WebpackMajorVersion.byArgument(it) }
|
||||
?.also { version ->
|
||||
if (!WebpackMajorVersion.webpackVersionWarning && version != WebpackMajorVersion.DEFAULT) {
|
||||
WebpackMajorVersion.webpackVersionWarning = true
|
||||
project.logger.warn(WebpackMajorVersion.warningMessage)
|
||||
}
|
||||
}
|
||||
?: WebpackMajorVersion.DEFAULT
|
||||
|
||||
|
||||
/**
|
||||
* Default mode of generating of Dukat
|
||||
*/
|
||||
|
||||
+2
@@ -12,10 +12,12 @@ package org.jetbrains.kotlin.gradle.targets.js
|
||||
class NpmVersions {
|
||||
val dukat = NpmPackageVersion("dukat", "0.5.8-rc.4")
|
||||
val webpack = NpmPackageVersion("webpack", "5.26.2")
|
||||
val webpack4 = NpmPackageVersion("webpack", "4.44.1")
|
||||
val webpackCli = NpmPackageVersion("webpack-cli", "4.5.0")
|
||||
val webpackBundleAnalyzer = NpmPackageVersion("webpack-bundle-analyzer", "4.4.0")
|
||||
val webpackDevServer = NpmPackageVersion("webpack-dev-server", "3.11.2")
|
||||
val sourceMapLoader = NpmPackageVersion("source-map-loader", "2.0.1")
|
||||
val sourceMapLoader1 = NpmPackageVersion("source-map-loader", "1.1.0")
|
||||
val sourceMapSupport = NpmPackageVersion("source-map-support", "0.5.19")
|
||||
val cssLoader = NpmPackageVersion("css-loader", "5.1.3")
|
||||
val styleLoader = NpmPackageVersion("style-loader", "2.0.0")
|
||||
|
||||
+11
-1
@@ -10,6 +10,7 @@ import org.gradle.api.provider.Provider
|
||||
import org.gradle.api.tasks.Copy
|
||||
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce
|
||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDceDsl
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
|
||||
@@ -22,6 +23,8 @@ import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackDevtool
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion.Companion.choose
|
||||
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
||||
import org.jetbrains.kotlin.gradle.utils.newFileProperty
|
||||
import java.io.File
|
||||
@@ -34,6 +37,10 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
||||
private val webpackTaskConfigurations: MutableList<KotlinWebpack.() -> Unit> = mutableListOf()
|
||||
private val runTaskConfigurations: MutableList<KotlinWebpack.() -> Unit> = mutableListOf()
|
||||
|
||||
private val propertiesProvider = PropertiesProvider(project)
|
||||
private val webpackMajorVersion
|
||||
get() = propertiesProvider.webpackMajorVersion
|
||||
|
||||
override val testTaskDescription: String
|
||||
get() = "Run all ${target.name} tests inside browser using karma and webpack"
|
||||
|
||||
@@ -99,7 +106,10 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
||||
.resolve(binary.linkTask.get().outputFile.name)
|
||||
}
|
||||
|
||||
task.args.add(0, "serve")
|
||||
webpackMajorVersion.choose(
|
||||
{ task.args.add(0, "serve") },
|
||||
{ task.bin = "webpack-dev-server/bin/webpack-dev-server.js" }
|
||||
)()
|
||||
task.description = "start ${mode.name.toLowerCase()} webpack dev server"
|
||||
|
||||
task.devServer = KotlinWebpackConfig.DevServer(
|
||||
|
||||
+11
-1
@@ -12,6 +12,7 @@ import org.gradle.language.base.plugins.LifecycleBasePlugin
|
||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce
|
||||
import org.jetbrains.kotlin.gradle.plugin.COMPILER_CLASSPATH_CONFIGURATION_NAME
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
|
||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.*
|
||||
@@ -25,6 +26,8 @@ import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackDevtool
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion.Companion.choose
|
||||
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
||||
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||
@@ -40,6 +43,9 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
|
||||
private val runTaskConfigurations: MutableList<KotlinWebpack.() -> Unit> = mutableListOf()
|
||||
private val dceConfigurations: MutableList<KotlinJsDce.() -> Unit> = mutableListOf()
|
||||
private val distribution: Distribution = DefaultDistribution(project)
|
||||
private val propertiesProvider = PropertiesProvider(project)
|
||||
private val webpackMajorVersion
|
||||
get() = propertiesProvider.webpackMajorVersion
|
||||
|
||||
override val testTaskDescription: String
|
||||
get() = "Run all ${target.name} tests inside browser using karma and webpack"
|
||||
@@ -128,7 +134,11 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
|
||||
),
|
||||
listOf(compilation)
|
||||
) { task ->
|
||||
task.args.add(0, "serve")
|
||||
webpackMajorVersion.choose(
|
||||
{ task.args.add(0, "serve") },
|
||||
{ task.bin = "webpack-dev-server/bin/webpack-dev-server.js" }
|
||||
)()
|
||||
|
||||
task.description = "start ${type.name.toLowerCase()} webpack dev server"
|
||||
|
||||
task.devServer = KotlinWebpackConfig.DevServer(
|
||||
|
||||
+18
-3
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.gradle.internal.processLogMessage
|
||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings
|
||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutor.Companion.TC_PROJECT_PROPERTY
|
||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
|
||||
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
||||
@@ -30,6 +31,7 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
||||
import org.jetbrains.kotlin.gradle.targets.js.testing.*
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion.Companion.choose
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinTest
|
||||
import org.jetbrains.kotlin.gradle.testing.internal.reportsDir
|
||||
import org.jetbrains.kotlin.gradle.utils.isConfigurationCacheAvailable
|
||||
@@ -76,13 +78,16 @@ class KotlinKarma(
|
||||
override val settingsState: String
|
||||
get() = "KotlinKarma($config)"
|
||||
|
||||
private val webpackMajorVersion = PropertiesProvider(project).webpackMajorVersion
|
||||
|
||||
val webpackConfig = KotlinWebpackConfig(
|
||||
configDirectory = project.projectDir.resolve("webpack.config.d"),
|
||||
sourceMaps = true,
|
||||
devtool = null,
|
||||
export = false,
|
||||
progressReporter = true,
|
||||
progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath
|
||||
progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath,
|
||||
webpackMajorVersion = webpackMajorVersion
|
||||
)
|
||||
|
||||
init {
|
||||
@@ -200,10 +205,20 @@ class KotlinKarma(
|
||||
|
||||
private fun useWebpack() {
|
||||
requiredDependencies.add(versions.karmaWebpack)
|
||||
requiredDependencies.add(versions.webpack)
|
||||
requiredDependencies.add(
|
||||
webpackMajorVersion.choose(
|
||||
versions.webpack,
|
||||
versions.webpack4
|
||||
)
|
||||
)
|
||||
requiredDependencies.add(versions.webpackCli)
|
||||
requiredDependencies.add(versions.formatUtil)
|
||||
requiredDependencies.add(versions.sourceMapLoader)
|
||||
requiredDependencies.add(
|
||||
webpackMajorVersion.choose(
|
||||
versions.sourceMapLoader,
|
||||
versions.sourceMapLoader1
|
||||
)
|
||||
)
|
||||
|
||||
addPreprocessor("webpack")
|
||||
confJsWriters.add {
|
||||
|
||||
+6
-1
@@ -18,6 +18,7 @@ import org.gradle.deployment.internal.DeploymentHandle
|
||||
import org.gradle.deployment.internal.DeploymentRegistry
|
||||
import org.gradle.process.internal.ExecHandle
|
||||
import org.gradle.process.internal.ExecHandleFactory
|
||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||
@@ -205,6 +206,9 @@ constructor(
|
||||
@Nested
|
||||
val synthConfig = KotlinWebpackConfig()
|
||||
|
||||
@Input
|
||||
val webpackMajorVersion = PropertiesProvider(project).webpackMajorVersion
|
||||
|
||||
fun webpackConfigApplier(body: KotlinWebpackConfig.() -> Unit) {
|
||||
synthConfig.body()
|
||||
webpackConfigAppliers.add(body)
|
||||
@@ -227,7 +231,8 @@ constructor(
|
||||
devServer = devServer,
|
||||
devtool = devtool,
|
||||
sourceMaps = sourceMaps,
|
||||
resolveFromModulesFirst = resolveFromModulesFirst
|
||||
resolveFromModulesFirst = resolveFromModulesFirst,
|
||||
webpackMajorVersion = webpackMajorVersion
|
||||
)
|
||||
|
||||
webpackConfigAppliers
|
||||
|
||||
+27
-4
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.targets.js.jsQuoted
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackCssMode.EXTRACT
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackCssMode.IMPORT
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackCssMode.INLINE
|
||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion.Companion.choose
|
||||
import java.io.File
|
||||
import java.io.Serializable
|
||||
import java.io.StringWriter
|
||||
@@ -63,7 +64,9 @@ data class KotlinWebpackConfig(
|
||||
@Optional
|
||||
var progressReporterPathFilter: String? = null,
|
||||
@Input
|
||||
var resolveFromModulesFirst: Boolean = false
|
||||
var resolveFromModulesFirst: Boolean = false,
|
||||
@Input
|
||||
val webpackMajorVersion: WebpackMajorVersion = WebpackMajorVersion.V5
|
||||
) {
|
||||
@get:Input
|
||||
@get:Optional
|
||||
@@ -93,7 +96,12 @@ data class KotlinWebpackConfig(
|
||||
fun getRequiredDependencies(versions: NpmVersions) =
|
||||
mutableSetOf<RequiredKotlinJsDependency>().also {
|
||||
it.add(versions.kotlinJsTestRunner)
|
||||
it.add(versions.webpack)
|
||||
it.add(
|
||||
webpackMajorVersion.choose(
|
||||
versions.webpack,
|
||||
versions.webpack4
|
||||
)
|
||||
)
|
||||
it.add(versions.webpackCli)
|
||||
it.add(versions.formatUtil)
|
||||
|
||||
@@ -102,7 +110,12 @@ data class KotlinWebpackConfig(
|
||||
}
|
||||
|
||||
if (sourceMaps) {
|
||||
it.add(versions.sourceMapLoader)
|
||||
it.add(
|
||||
webpackMajorVersion.choose(
|
||||
versions.sourceMapLoader,
|
||||
versions.sourceMapLoader1
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (devServer != null) {
|
||||
@@ -269,7 +282,17 @@ data class KotlinWebpackConfig(
|
||||
enforce: "pre"
|
||||
});
|
||||
config.devtool = ${devtool?.let { "'$it'" } ?: false};
|
||||
config.ignoreWarnings = [/Failed to parse source map/]
|
||||
${
|
||||
webpackMajorVersion.choose(
|
||||
"config.ignoreWarnings = [/Failed to parse source map/]",
|
||||
"""
|
||||
config.stats = config.stats || {}
|
||||
Object.assign(config.stats, config.stats, {
|
||||
warningsFilter: [/Failed to parse source map/]
|
||||
})
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright 2010-2021 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.webpack
|
||||
|
||||
enum class WebpackMajorVersion(
|
||||
val value: String
|
||||
) {
|
||||
V4("4"),
|
||||
V5("5");
|
||||
|
||||
companion object {
|
||||
val DEFAULT = V5
|
||||
|
||||
const val webpackMajorVersion = "kotlin.js.webpack.major.version"
|
||||
|
||||
const val warningMessage = "Default webpack version now is 5. Support of webpack 4 is deprecated."
|
||||
|
||||
var webpackVersionWarning = false
|
||||
|
||||
fun byArgumentOrNull(argument: String): WebpackMajorVersion? =
|
||||
when (argument) {
|
||||
"4" -> V4
|
||||
"5" -> V5
|
||||
else -> null
|
||||
}
|
||||
|
||||
fun byArgument(argument: String): WebpackMajorVersion =
|
||||
byArgumentOrNull(argument)
|
||||
?: throw IllegalArgumentException(
|
||||
"This webpack major version is not supported. Use [${WebpackMajorVersion.values().toList().joinToString { it.value }}]"
|
||||
)
|
||||
|
||||
fun <T> WebpackMajorVersion.choose(
|
||||
defaultValue: T,
|
||||
v4Value: T
|
||||
): T =
|
||||
when (this) {
|
||||
V5 -> defaultValue
|
||||
V4 -> v4Value
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user