Gradle, js, karma: require webpack npm dependencies

This commit is contained in:
Sergey Rostov
2019-08-06 12:22:36 +03:00
parent 99762193f9
commit 3e25166832
5 changed files with 43 additions and 36 deletions
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfigWriter
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
class KotlinBrowserJs(target: KotlinJsTarget) :
@@ -67,7 +67,7 @@ class KotlinBrowserJs(target: KotlinJsTarget) :
it.compilation = compilation
it.description = "start webpack dev server"
it.devServer = KotlinWebpackConfigWriter.DevServer(
it.devServer = KotlinWebpackConfig.DevServer(
open = true,
contentBase = listOf(compilation.output.resourcesDir.canonicalPath)
)
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
import org.jetbrains.kotlin.gradle.targets.js.testing.karma.KarmaConfig.CoverageReporter.Reporter
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfigWriter
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
import org.jetbrains.kotlin.gradle.testing.internal.reportsDir
import org.slf4j.Logger
import java.io.File
@@ -108,19 +108,22 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF
requiredDependencies.add(versions.karmaWebpack)
requiredDependencies.add(versions.webpack)
val webpackConfigWriter = KotlinWebpackConfig(
configDirectory = project.projectDir.resolve("webpack.config.d").takeIf { it.isDirectory },
sourceMaps = true,
export = false,
progressReporter = true,
progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath
)
requiredDependencies.addAll(webpackConfigWriter.getRequiredDependencies(versions))
addPreprocessor("webpack")
confJsWriters.add {
it.appendln()
it.appendln("// webpack config")
it.appendln("function createWebpackConfig() {")
KotlinWebpackConfigWriter(
configDirectory = project.projectDir.resolve("webpack.config.d").takeIf { it.isDirectory },
sourceMaps = true,
export = false,
progressReporter = true,
progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath
).appendTo(it)
webpackConfigWriter.appendTo(it)
it.appendln(" return config;")
it.appendln("}")
@@ -102,14 +102,14 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
@Input
@Optional
var devServer: KotlinWebpackConfigWriter.DevServer? = null
var devServer: KotlinWebpackConfig.DevServer? = null
private fun createRunner() = KotlinWebpackRunner(
compilation.npmProject,
configFile,
execHandleFactory,
bin,
KotlinWebpackConfigWriter(
KotlinWebpackConfig(
entry = entry,
reportEvaluatedConfigFile = if (saveEvaluatedConfigFile) evaluatedConfigFile else null,
outputPath = destinationDirectory,
@@ -126,23 +126,7 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
@Internal get() = true
override val requiredNpmDependencies: Collection<NpmPackageVersion>
@Internal get() = mutableListOf<NpmPackageVersion>().also {
it.add(versions.webpack)
it.add(versions.webpackCli)
if (report) {
it.add(versions.webpackBundleAnalyzer)
}
if (sourceMaps) {
it.add(versions.sourceMapLoader)
it.add(versions.sourceMapSupport)
}
if (devServer != null) {
it.add(versions.webpackDevServer)
}
}
@Internal get() = createRunner().config.getRequiredDependencies(versions)
@TaskAction
fun doExecute() {
@@ -160,7 +144,7 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
}
} else {
runner.copy(
configWriter = runner.configWriter.copy(
config = runner.config.copy(
progressReporter = true,
progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath
)
@@ -9,13 +9,15 @@ package org.jetbrains.kotlin.gradle.targets.js.webpack
import com.google.gson.GsonBuilder
import com.google.gson.stream.JsonWriter
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
import org.jetbrains.kotlin.gradle.targets.js.NpmVersions
import org.jetbrains.kotlin.gradle.targets.js.appendConfigsFromDir
import java.io.File
import java.io.Serializable
import java.io.StringWriter
@Suppress("MemberVisibilityCanBePrivate")
data class KotlinWebpackConfigWriter(
data class KotlinWebpackConfig(
val mode: Mode = Mode.DEVELOPMENT,
val entry: File? = null,
val outputPath: File? = null,
@@ -31,6 +33,24 @@ data class KotlinWebpackConfigWriter(
val progressReporter: Boolean = false,
val progressReporterPathFilter: String? = null
) {
fun getRequiredDependencies(versions: NpmVersions) = mutableListOf<NpmPackageVersion>().also {
it.add(versions.webpack)
it.add(versions.webpackCli)
if (bundleAnalyzerReportDir != null) {
it.add(versions.webpackBundleAnalyzer)
}
if (sourceMaps) {
it.add(versions.sourceMapLoader)
it.add(versions.sourceMapSupport)
}
if (devServer != null) {
it.add(versions.webpackDevServer)
}
}
enum class Mode(val code: String) {
DEVELOPMENT("development"),
PRODUCTION("production")
@@ -17,7 +17,7 @@ internal data class KotlinWebpackRunner(
val configFile: File,
val execHandleFactory: ExecHandleFactory,
val tool: String,
val configWriter: KotlinWebpackConfigWriter
val config: KotlinWebpackConfig
) {
fun execute() = npmProject.project.execWithProgress("webpack") {
configureExec(it)
@@ -32,14 +32,14 @@ internal data class KotlinWebpackRunner(
}
private fun configureExec(execFactory: ExecSpec) {
check(configWriter.entry?.isFile == true) {
"${this}: Entry file not existed \"${configWriter.entry}\""
check(config.entry?.isFile == true) {
"${this}: Entry file not existed \"${config.entry}\""
}
configWriter.save(configFile)
config.save(configFile)
val args = mutableListOf<String>("--config", configFile.absolutePath)
if (configWriter.showProgress) {
if (config.showProgress) {
args.add("--progress")
}