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.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest 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.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 import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
class KotlinBrowserJs(target: KotlinJsTarget) : class KotlinBrowserJs(target: KotlinJsTarget) :
@@ -67,7 +67,7 @@ class KotlinBrowserJs(target: KotlinJsTarget) :
it.compilation = compilation it.compilation = compilation
it.description = "start webpack dev server" it.description = "start webpack dev server"
it.devServer = KotlinWebpackConfigWriter.DevServer( it.devServer = KotlinWebpackConfig.DevServer(
open = true, open = true,
contentBase = listOf(compilation.output.resourcesDir.canonicalPath) 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.KotlinJsTest
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework 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.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.jetbrains.kotlin.gradle.testing.internal.reportsDir
import org.slf4j.Logger import org.slf4j.Logger
import java.io.File import java.io.File
@@ -108,19 +108,22 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF
requiredDependencies.add(versions.karmaWebpack) requiredDependencies.add(versions.karmaWebpack)
requiredDependencies.add(versions.webpack) 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") addPreprocessor("webpack")
confJsWriters.add { confJsWriters.add {
it.appendln() it.appendln()
it.appendln("// webpack config") it.appendln("// webpack config")
it.appendln("function createWebpackConfig() {") it.appendln("function createWebpackConfig() {")
KotlinWebpackConfigWriter( webpackConfigWriter.appendTo(it)
configDirectory = project.projectDir.resolve("webpack.config.d").takeIf { it.isDirectory },
sourceMaps = true,
export = false,
progressReporter = true,
progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath
).appendTo(it)
it.appendln(" return config;") it.appendln(" return config;")
it.appendln("}") it.appendln("}")
@@ -102,14 +102,14 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
@Input @Input
@Optional @Optional
var devServer: KotlinWebpackConfigWriter.DevServer? = null var devServer: KotlinWebpackConfig.DevServer? = null
private fun createRunner() = KotlinWebpackRunner( private fun createRunner() = KotlinWebpackRunner(
compilation.npmProject, compilation.npmProject,
configFile, configFile,
execHandleFactory, execHandleFactory,
bin, bin,
KotlinWebpackConfigWriter( KotlinWebpackConfig(
entry = entry, entry = entry,
reportEvaluatedConfigFile = if (saveEvaluatedConfigFile) evaluatedConfigFile else null, reportEvaluatedConfigFile = if (saveEvaluatedConfigFile) evaluatedConfigFile else null,
outputPath = destinationDirectory, outputPath = destinationDirectory,
@@ -126,23 +126,7 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
@Internal get() = true @Internal get() = true
override val requiredNpmDependencies: Collection<NpmPackageVersion> override val requiredNpmDependencies: Collection<NpmPackageVersion>
@Internal get() = mutableListOf<NpmPackageVersion>().also { @Internal get() = createRunner().config.getRequiredDependencies(versions)
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)
}
}
@TaskAction @TaskAction
fun doExecute() { fun doExecute() {
@@ -160,7 +144,7 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
} }
} else { } else {
runner.copy( runner.copy(
configWriter = runner.configWriter.copy( config = runner.config.copy(
progressReporter = true, progressReporter = true,
progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath 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.GsonBuilder
import com.google.gson.stream.JsonWriter 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 org.jetbrains.kotlin.gradle.targets.js.appendConfigsFromDir
import java.io.File import java.io.File
import java.io.Serializable import java.io.Serializable
import java.io.StringWriter import java.io.StringWriter
@Suppress("MemberVisibilityCanBePrivate") @Suppress("MemberVisibilityCanBePrivate")
data class KotlinWebpackConfigWriter( data class KotlinWebpackConfig(
val mode: Mode = Mode.DEVELOPMENT, val mode: Mode = Mode.DEVELOPMENT,
val entry: File? = null, val entry: File? = null,
val outputPath: File? = null, val outputPath: File? = null,
@@ -31,6 +33,24 @@ data class KotlinWebpackConfigWriter(
val progressReporter: Boolean = false, val progressReporter: Boolean = false,
val progressReporterPathFilter: String? = null 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) { enum class Mode(val code: String) {
DEVELOPMENT("development"), DEVELOPMENT("development"),
PRODUCTION("production") PRODUCTION("production")
@@ -17,7 +17,7 @@ internal data class KotlinWebpackRunner(
val configFile: File, val configFile: File,
val execHandleFactory: ExecHandleFactory, val execHandleFactory: ExecHandleFactory,
val tool: String, val tool: String,
val configWriter: KotlinWebpackConfigWriter val config: KotlinWebpackConfig
) { ) {
fun execute() = npmProject.project.execWithProgress("webpack") { fun execute() = npmProject.project.execWithProgress("webpack") {
configureExec(it) configureExec(it)
@@ -32,14 +32,14 @@ internal data class KotlinWebpackRunner(
} }
private fun configureExec(execFactory: ExecSpec) { private fun configureExec(execFactory: ExecSpec) {
check(configWriter.entry?.isFile == true) { check(config.entry?.isFile == true) {
"${this}: Entry file not existed \"${configWriter.entry}\"" "${this}: Entry file not existed \"${config.entry}\""
} }
configWriter.save(configFile) config.save(configFile)
val args = mutableListOf<String>("--config", configFile.absolutePath) val args = mutableListOf<String>("--config", configFile.absolutePath)
if (configWriter.showProgress) { if (config.showProgress) {
args.add("--progress") args.add("--progress")
} }