From 09b3f814c2617986c4e045e75b64d8772e37aecb Mon Sep 17 00:00:00 2001 From: Lanius Trolling Date: Sat, 6 Apr 2024 10:26:03 -0400 Subject: [PATCH] Refactor buildscript --- build.gradle.kts | 163 +++++++++++++++++++++++++++-------------------- 1 file changed, 94 insertions(+), 69 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d579236..5a5bf0e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,6 @@ import com.nixxcode.jvmbrotli.enc.BrotliOutputStream import com.nixxcode.jvmbrotli.enc.Encoder import groovy.json.JsonSlurper import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl 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.WebpackDevtool @@ -37,44 +36,63 @@ plugins { group = "info.mechyrdia" -val configFile = (JsonSlurper().parse(File(rootDir, "config.json")) as Map<*, *>).mapKeys { (k, _) -> k.toString() } +val configFile by project.extra { + (JsonSlurper().parse(File(rootDir, "config.json")) as Map<*, *>).mapKeys { (k, _) -> k.toString() } +} -val isDevMode = (configFile["isDevMode"] as? Boolean) ?: false +val isDevMode by project.extra { + (configFile["isDevMode"] as? Boolean) ?: false +} -val configureOutput: KotlinJsBrowserDsl.(name: String) -> Unit = { name -> - val fileName = "$name.js" - - commonWebpackConfig { - outputFileName = fileName - if (isDevMode) { - mode = KotlinWebpackConfig.Mode.DEVELOPMENT - devtool = WebpackDevtool.SOURCE_MAP - sourceMaps = true - } else { - mode = KotlinWebpackConfig.Mode.PRODUCTION - devtool = null - sourceMaps = false - } - } - - webpackTask { - mainOutputFileName.set(fileName) - if (isDevMode) { - mode = KotlinWebpackConfig.Mode.DEVELOPMENT - devtool = WebpackDevtool.SOURCE_MAP - sourceMaps = true - } else { - mode = KotlinWebpackConfig.Mode.PRODUCTION - sourceMaps = false - } - } +val fileDir by project.extra { + val fileDirPath = configFile["rootDir"]?.let { "$it" } ?: ".." + File(rootDir, fileDirPath) } -val jsTarget: KotlinMultiplatformExtension.(name: String) -> Unit = { name -> +val assetDir by project.extra { + configFile["assetDir"]?.let { File(rootDir, "$it") } ?: File(fileDir, "assets") +} + +val browserWebpackSuffix by project.extra { + if (isDevMode) + "BrowserDevelopmentWebpack" + else + "BrowserProductionWebpack" +} + +fun KotlinMultiplatformExtension.jsConfigured(name: String) { + val isDevMode: Boolean by project.extra + js(name) { browser { - configureOutput(name) + val fileName = "$name.js" + + commonWebpackConfig { + outputFileName = fileName + if (isDevMode) { + mode = KotlinWebpackConfig.Mode.DEVELOPMENT + devtool = WebpackDevtool.SOURCE_MAP + sourceMaps = true + } else { + mode = KotlinWebpackConfig.Mode.PRODUCTION + devtool = null + sourceMaps = false + } + } + + webpackTask { + mainOutputFileName.set(fileName) + if (isDevMode) { + mode = KotlinWebpackConfig.Mode.DEVELOPMENT + devtool = WebpackDevtool.SOURCE_MAP + sourceMaps = true + } else { + mode = KotlinWebpackConfig.Mode.PRODUCTION + sourceMaps = false + } + } } + binaries.executable() } } @@ -84,7 +102,7 @@ repositories { } kotlin { - jsTarget("map") + jsConfigured("map") jvmToolchain(17) jvm("jvm") { withJava() @@ -161,7 +179,7 @@ tasks.named("jvmProcessResources") { val encoderParams = if (BrotliLoader.isBrotliAvailable()) Encoder.Parameters().setQuality(8) else null - val resourceTree = fileTree(mapOf("dir" to outputs.files.asPath + "/static/", "exclude" to listOf("*.gz", "*.br", "*.sha256"))) + val resourceTree = fileTree(mapOf("dir" to outputs.files.asPath + "/static/", "exclude" to listOf("*.gz", "*.br"))) val countDownLatch = CountDownLatch(resourceTree.count()) for (file in resourceTree) { @@ -189,8 +207,6 @@ tasks.named("jvmProcessResources") { } } -val browserWebpackSuffix = if (isDevMode) "BrowserDevelopmentWebpack" else "BrowserProductionWebpack" - tasks.named("shadowJar") { mergeServiceFiles() exclude { it.name == "module-info.class" } @@ -200,54 +216,63 @@ application { mainClass.set("info.mechyrdia.Factbooks") } -val buildJsAsset: Task.(name: String) -> Unit = { name -> - val webpackTask = tasks.getByName("$name$browserWebpackSuffix") - dependsOn(webpackTask) +fun Task.buildJsAsset(name: String) { + val browserWebpackSuffix: String by project.extra + val browserWebpackTask by tasks.named("$name$browserWebpackSuffix") + dependsOn(browserWebpackTask) } -val copyToAssets: Task.(name: String, destSubDir: String, destFileName: String) -> Unit = { name, destSubDir, destFileName -> - val webpackTask = tasks.getByName("$name$browserWebpackSuffix") - - doFirst { - val assetsDirPath = configFile["assetDir"]?.let { "$it" } - ?: configFile["rootDir"]?.let { "$it/assets" } - ?: "../assets" - val assetsDir = File(rootDir, assetsDirPath) - - val destJsName = "$destFileName.js" - - val jsFile = webpackTask - .mainOutputFile - .get() - .asFile +fun copyToAssetsTask(from: TaskProvider, into: String, name: String): TaskProvider { + return tasks.register("${into}DeployToAssets", Copy::class) { + group = "build" - val jsText = jsFile.readText() - val jsMapName = "${webpackTask.mainOutputFileName.get()}.map" - val sourceMapReplaceText = "//# sourceMappingURL=$jsMapName" - val sourceMapReplacement = "//# sourceMappingURL=$destJsName.map" - - val destJsFile = File(assetsDir, "$destSubDir/$destJsName") - val destJsMapFile = File(assetsDir, "$destSubDir/$destJsName.map") + val isDevMode: Boolean by project.extra if (isDevMode) { - val jsMapFile = File(jsFile.parentFile, jsMapName) - val jsMapText = jsMapFile.readText() + val fromJs = from.flatMap { it.mainOutputFile }.map { it.asFile } + val fromJsMap = fromJs.map { File(it.parentFile, "${it.name}.map") } - destJsFile.writeText(jsText.replace(sourceMapReplaceText, sourceMapReplacement)) - destJsMapFile.writeText(jsMapText) + from(files(fromJs, fromJsMap)) { + eachFile { + rename { if (it.endsWith(".map")) "$name.js.map" else "$name.js" } + + val sourceMapReplaceText = "//# sourceMappingURL=${fromJsMap.get().name}" + val sourceMapReplacement = "//# sourceMappingURL=$name.js.map" + filter { line -> + line.replace(sourceMapReplaceText, sourceMapReplacement) + } + } + } } else { - destJsFile.writeText(jsText.replace(sourceMapReplaceText, "")) - destJsMapFile.delete() + val fromJs = from.flatMap { it.mainOutputFile }.map { it.asFile } + + from(fromJs) { + eachFile { + rename { "$name.js" } + + val sourceMapTestText = "//# sourceMappingURL=" + filter { line -> + if (line.contains(sourceMapTestText)) "" else line + } + } + } } + + val assetDir: File by project.extra + val intoDir = File(assetDir, into).apply { mkdirs() } + + into(intoDir) } } +val mapDeployToAssets by copyToAssetsTask(tasks.named("map$browserWebpackSuffix"), "map", "main") + tasks.withType { buildJsAsset("map") } -tasks.getByName("runShadow") { - copyToAssets("map", "map", "main") +tasks.named("runShadow") { + dependsOn(mapDeployToAssets) } tasks.withType { -- 2.25.1