From 2b9a66a5fce8ef2a613ecd9ba4a0459aa376ddca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 28 Oct 2023 17:43:48 +0200 Subject: [PATCH 1/8] build(vite-base): Create the Base plugin --- build.gradle.kts | 1 + settings.gradle.kts | 1 + vite-base/README.md | 5 +++ vite-base/build.gradle.kts | 48 +++++++++++++++++++++ vite-base/src/main/kotlin/BaseVitePlugin.kt | 11 +++++ vite/build.gradle.kts | 2 + vite/src/main/kotlin/KotlinVitePlugin.kt | 2 + 7 files changed, 70 insertions(+) create mode 100644 vite-base/README.md create mode 100644 vite-base/build.gradle.kts create mode 100644 vite-base/src/main/kotlin/BaseVitePlugin.kt diff --git a/build.gradle.kts b/build.gradle.kts index be20e43..c3db08e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,6 +21,7 @@ plugins { dependencies { // List the 'library' projects dokkatoo(projects.vite) + dokkatoo(projects.viteBase) // This is required at the moment, see https://github.com/adamko-dev/dokkatoo/issues/14 dokkatooPluginHtml( diff --git a/settings.gradle.kts b/settings.gradle.kts index 7855c36..804002b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -32,6 +32,7 @@ plugins { include( "vite", + "vite-base", ) buildCache { diff --git a/vite-base/README.md b/vite-base/README.md new file mode 100644 index 0000000..fc8f3b0 --- /dev/null +++ b/vite-base/README.md @@ -0,0 +1,5 @@ +# Module Vite for Gradle + +Gradle plugin to use Vite without preconfigured behavior. + + diff --git a/vite-base/build.gradle.kts b/vite-base/build.gradle.kts new file mode 100644 index 0000000..68382ce --- /dev/null +++ b/vite-base/build.gradle.kts @@ -0,0 +1,48 @@ +plugins { + id("conventions.base") + id("conventions.library") + + `kotlin-dsl` + `java-gradle-plugin` +} + +repositories { + mavenCentral() +} + +gradlePlugin { + plugins { + create("vite") { + id = "dev.opensavvy.vite.base" + implementationClass = "opensavvy.gradle.vite.base.BaseVitePlugin" + } + } +} + +library { + name.set("Vite for Gradle") + description.set("Gradle plugin to use Vite") + homeUrl.set("https://gitlab.com/opensavvy/kotlin-vite") +} + +java { + withSourcesJar() +} + +afterEvaluate { + tasks.named("generatePomFileForVitePluginMarkerMavenPublication", GenerateMavenPom::class.java) { + pom.name.set("Vite for Gradle") + pom.description.set("Plugin marker for the Gradle plugin for Vite") + pom.url.set("https://gitlab.com/opensavvy/kotlin-vite") + + pom.scm { + url.set("https://gitlab.com/opensavvy/kotlin-vite") + } + } + + publishing { + publications.named("vitePluginMarkerMaven", MavenPublication::class.java) { + from(components["java"]) + } + } +} diff --git a/vite-base/src/main/kotlin/BaseVitePlugin.kt b/vite-base/src/main/kotlin/BaseVitePlugin.kt new file mode 100644 index 0000000..e52add4 --- /dev/null +++ b/vite-base/src/main/kotlin/BaseVitePlugin.kt @@ -0,0 +1,11 @@ +package opensavvy.gradle.vite.base + +import org.gradle.api.Plugin +import org.gradle.api.Project + +class BaseVitePlugin : Plugin { + + override fun apply(target: Project) { + println("Applied the Base Vite plugin") + } +} diff --git a/vite/build.gradle.kts b/vite/build.gradle.kts index 6dff1d1..5b00258 100644 --- a/vite/build.gradle.kts +++ b/vite/build.gradle.kts @@ -21,6 +21,8 @@ gradlePlugin { dependencies { compileOnly("org.jetbrains.kotlin:kotlin-gradle-plugin:${playgroundLibs.versions.kotlin.get()}") + + api(projects.viteBase) } library { diff --git a/vite/src/main/kotlin/KotlinVitePlugin.kt b/vite/src/main/kotlin/KotlinVitePlugin.kt index de61e94..3be9e49 100644 --- a/vite/src/main/kotlin/KotlinVitePlugin.kt +++ b/vite/src/main/kotlin/KotlinVitePlugin.kt @@ -13,6 +13,8 @@ class KotlinVitePlugin : Plugin { override fun apply(target: Project) { check(target.pluginManager.hasPlugin("org.jetbrains.kotlin.multiplatform")) { """The kotlin("multiplatform") plugin must be applied before the Vite for Kotlin plugin""" } + target.pluginManager.apply("dev.opensavvy.vite.base") + val config = target.extensions.create("vite", ViteConfig::class.java) config.defaultConfiguration() -- 2.51.2 From 5ce0eecba623aa03033e2f01a2ca08cfc26dd015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 28 Oct 2023 17:46:31 +0200 Subject: [PATCH 2/8] build(vite-kotlin): Rename 'vite' to 'vite-kotlin' --- build.gradle.kts | 2 +- settings.gradle.kts | 2 +- {vite => vite-kotlin}/README.md | 2 +- {vite => vite-kotlin}/build.gradle.kts | 0 {vite => vite-kotlin}/src/main/kotlin/KotlinVitePlugin.kt | 0 {vite => vite-kotlin}/src/main/kotlin/config/Defaults.kt | 0 .../src/main/kotlin/config/ExternalVitePlugin.kt | 0 {vite => vite-kotlin}/src/main/kotlin/config/ViteBuildConfig.kt | 0 {vite => vite-kotlin}/src/main/kotlin/config/ViteConfig.kt | 0 .../src/main/kotlin/config/ViteResourceConfig.kt | 0 {vite => vite-kotlin}/src/main/kotlin/tasks/Copy.kt | 0 .../src/main/kotlin/tasks/CopyLocalResources.kt | 0 {vite => vite-kotlin}/src/main/kotlin/tasks/Dependencies.kt | 0 .../src/main/kotlin/tasks/DumpConfiguration.kt | 0 {vite => vite-kotlin}/src/main/kotlin/tasks/ViteConfigWriter.kt | 0 {vite => vite-kotlin}/src/main/kotlin/tasks/ViteExecTask.kt | 0 16 files changed, 3 insertions(+), 3 deletions(-) rename {vite => vite-kotlin}/README.md (89%) rename {vite => vite-kotlin}/build.gradle.kts (100%) rename {vite => vite-kotlin}/src/main/kotlin/KotlinVitePlugin.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/config/Defaults.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/config/ExternalVitePlugin.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/config/ViteBuildConfig.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/config/ViteConfig.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/config/ViteResourceConfig.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/tasks/Copy.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/tasks/CopyLocalResources.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/tasks/Dependencies.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/tasks/DumpConfiguration.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/tasks/ViteConfigWriter.kt (100%) rename {vite => vite-kotlin}/src/main/kotlin/tasks/ViteExecTask.kt (100%) diff --git a/build.gradle.kts b/build.gradle.kts index c3db08e..5c4c966 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,7 +20,7 @@ plugins { dependencies { // List the 'library' projects - dokkatoo(projects.vite) + dokkatoo(projects.viteKotlin) dokkatoo(projects.viteBase) // This is required at the moment, see https://github.com/adamko-dev/dokkatoo/issues/14 diff --git a/settings.gradle.kts b/settings.gradle.kts index 804002b..ee4b6ba 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -31,8 +31,8 @@ plugins { } include( - "vite", "vite-base", + "vite-kotlin", ) buildCache { diff --git a/vite/README.md b/vite-kotlin/README.md similarity index 89% rename from vite/README.md rename to vite-kotlin/README.md index 546ffee..47b256e 100644 --- a/vite/README.md +++ b/vite-kotlin/README.md @@ -2,7 +2,7 @@ Gradle plugin to use Vite in Kotlin Multiplatform projects. - + ## Import diff --git a/vite/build.gradle.kts b/vite-kotlin/build.gradle.kts similarity index 100% rename from vite/build.gradle.kts rename to vite-kotlin/build.gradle.kts diff --git a/vite/src/main/kotlin/KotlinVitePlugin.kt b/vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt similarity index 100% rename from vite/src/main/kotlin/KotlinVitePlugin.kt rename to vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt diff --git a/vite/src/main/kotlin/config/Defaults.kt b/vite-kotlin/src/main/kotlin/config/Defaults.kt similarity index 100% rename from vite/src/main/kotlin/config/Defaults.kt rename to vite-kotlin/src/main/kotlin/config/Defaults.kt diff --git a/vite/src/main/kotlin/config/ExternalVitePlugin.kt b/vite-kotlin/src/main/kotlin/config/ExternalVitePlugin.kt similarity index 100% rename from vite/src/main/kotlin/config/ExternalVitePlugin.kt rename to vite-kotlin/src/main/kotlin/config/ExternalVitePlugin.kt diff --git a/vite/src/main/kotlin/config/ViteBuildConfig.kt b/vite-kotlin/src/main/kotlin/config/ViteBuildConfig.kt similarity index 100% rename from vite/src/main/kotlin/config/ViteBuildConfig.kt rename to vite-kotlin/src/main/kotlin/config/ViteBuildConfig.kt diff --git a/vite/src/main/kotlin/config/ViteConfig.kt b/vite-kotlin/src/main/kotlin/config/ViteConfig.kt similarity index 100% rename from vite/src/main/kotlin/config/ViteConfig.kt rename to vite-kotlin/src/main/kotlin/config/ViteConfig.kt diff --git a/vite/src/main/kotlin/config/ViteResourceConfig.kt b/vite-kotlin/src/main/kotlin/config/ViteResourceConfig.kt similarity index 100% rename from vite/src/main/kotlin/config/ViteResourceConfig.kt rename to vite-kotlin/src/main/kotlin/config/ViteResourceConfig.kt diff --git a/vite/src/main/kotlin/tasks/Copy.kt b/vite-kotlin/src/main/kotlin/tasks/Copy.kt similarity index 100% rename from vite/src/main/kotlin/tasks/Copy.kt rename to vite-kotlin/src/main/kotlin/tasks/Copy.kt diff --git a/vite/src/main/kotlin/tasks/CopyLocalResources.kt b/vite-kotlin/src/main/kotlin/tasks/CopyLocalResources.kt similarity index 100% rename from vite/src/main/kotlin/tasks/CopyLocalResources.kt rename to vite-kotlin/src/main/kotlin/tasks/CopyLocalResources.kt diff --git a/vite/src/main/kotlin/tasks/Dependencies.kt b/vite-kotlin/src/main/kotlin/tasks/Dependencies.kt similarity index 100% rename from vite/src/main/kotlin/tasks/Dependencies.kt rename to vite-kotlin/src/main/kotlin/tasks/Dependencies.kt diff --git a/vite/src/main/kotlin/tasks/DumpConfiguration.kt b/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt similarity index 100% rename from vite/src/main/kotlin/tasks/DumpConfiguration.kt rename to vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt diff --git a/vite/src/main/kotlin/tasks/ViteConfigWriter.kt b/vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt similarity index 100% rename from vite/src/main/kotlin/tasks/ViteConfigWriter.kt rename to vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt diff --git a/vite/src/main/kotlin/tasks/ViteExecTask.kt b/vite-kotlin/src/main/kotlin/tasks/ViteExecTask.kt similarity index 100% rename from vite/src/main/kotlin/tasks/ViteExecTask.kt rename to vite-kotlin/src/main/kotlin/tasks/ViteExecTask.kt -- 2.51.2 From 1eacbafefadc2e3d64a468d323e82aa4b28be184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 28 Oct 2023 17:59:21 +0200 Subject: [PATCH 3/8] feat(vite-base): Extract the configuration to Base --- .../src/main/kotlin/config/ExternalVitePlugin.kt | 2 +- .../src/main/kotlin/config/ViteBuildConfig.kt | 2 +- .../src/main/kotlin/config/ViteConfig.kt | 10 +++++++++- .../src/main/kotlin/config/ViteResourceConfig.kt | 2 +- vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt | 2 +- vite-kotlin/src/main/kotlin/config/Defaults.kt | 5 +++-- .../src/main/kotlin/tasks/CopyLocalResources.kt | 2 +- vite-kotlin/src/main/kotlin/tasks/Dependencies.kt | 2 +- vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt | 2 +- vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt | 6 +++--- 10 files changed, 22 insertions(+), 13 deletions(-) rename {vite-kotlin => vite-base}/src/main/kotlin/config/ExternalVitePlugin.kt (98%) rename {vite-kotlin => vite-base}/src/main/kotlin/config/ViteBuildConfig.kt (92%) rename {vite-kotlin => vite-base}/src/main/kotlin/config/ViteConfig.kt (93%) rename {vite-kotlin => vite-base}/src/main/kotlin/config/ViteResourceConfig.kt (96%) diff --git a/vite-kotlin/src/main/kotlin/config/ExternalVitePlugin.kt b/vite-base/src/main/kotlin/config/ExternalVitePlugin.kt similarity index 98% rename from vite-kotlin/src/main/kotlin/config/ExternalVitePlugin.kt rename to vite-base/src/main/kotlin/config/ExternalVitePlugin.kt index f91e7f0..6e5c786 100644 --- a/vite-kotlin/src/main/kotlin/config/ExternalVitePlugin.kt +++ b/vite-base/src/main/kotlin/config/ExternalVitePlugin.kt @@ -1,4 +1,4 @@ -package opensavvy.gradle.vite.kotlin.config +package opensavvy.gradle.vite.base.config import org.intellij.lang.annotations.Language import java.io.Serializable diff --git a/vite-kotlin/src/main/kotlin/config/ViteBuildConfig.kt b/vite-base/src/main/kotlin/config/ViteBuildConfig.kt similarity index 92% rename from vite-kotlin/src/main/kotlin/config/ViteBuildConfig.kt rename to vite-base/src/main/kotlin/config/ViteBuildConfig.kt index 8c64b44..b9f0dcb 100644 --- a/vite-kotlin/src/main/kotlin/config/ViteBuildConfig.kt +++ b/vite-base/src/main/kotlin/config/ViteBuildConfig.kt @@ -1,4 +1,4 @@ -package opensavvy.gradle.vite.kotlin.config +package opensavvy.gradle.vite.base.config import org.gradle.api.provider.Property diff --git a/vite-kotlin/src/main/kotlin/config/ViteConfig.kt b/vite-base/src/main/kotlin/config/ViteConfig.kt similarity index 93% rename from vite-kotlin/src/main/kotlin/config/ViteConfig.kt rename to vite-base/src/main/kotlin/config/ViteConfig.kt index 6bc929e..0eec47f 100644 --- a/vite-kotlin/src/main/kotlin/config/ViteConfig.kt +++ b/vite-base/src/main/kotlin/config/ViteConfig.kt @@ -1,4 +1,4 @@ -package opensavvy.gradle.vite.kotlin.config +package opensavvy.gradle.vite.base.config import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property @@ -20,6 +20,14 @@ import org.intellij.lang.annotations.Language */ interface ViteConfig { + /** + * Sets the default values for all configuration fields. + */ + fun setDefaults() { + // Root + version.convention("4.4.9") + } + /** * The version of the Vite package used by this build. * diff --git a/vite-kotlin/src/main/kotlin/config/ViteResourceConfig.kt b/vite-base/src/main/kotlin/config/ViteResourceConfig.kt similarity index 96% rename from vite-kotlin/src/main/kotlin/config/ViteResourceConfig.kt rename to vite-base/src/main/kotlin/config/ViteResourceConfig.kt index eb613b1..df8a8ed 100644 --- a/vite-kotlin/src/main/kotlin/config/ViteResourceConfig.kt +++ b/vite-base/src/main/kotlin/config/ViteResourceConfig.kt @@ -1,4 +1,4 @@ -package opensavvy.gradle.vite.kotlin.config +package opensavvy.gradle.vite.base.config import org.gradle.api.Project import org.gradle.api.provider.ListProperty diff --git a/vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt b/vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt index 3be9e49..638bf56 100644 --- a/vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt +++ b/vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt @@ -1,6 +1,6 @@ package opensavvy.gradle.vite.kotlin -import opensavvy.gradle.vite.kotlin.config.ViteConfig +import opensavvy.gradle.vite.base.config.ViteConfig import opensavvy.gradle.vite.kotlin.config.defaultConfiguration import opensavvy.gradle.vite.kotlin.tasks.* import org.gradle.api.Plugin diff --git a/vite-kotlin/src/main/kotlin/config/Defaults.kt b/vite-kotlin/src/main/kotlin/config/Defaults.kt index 6b0f0b6..be5708a 100644 --- a/vite-kotlin/src/main/kotlin/config/Defaults.kt +++ b/vite-kotlin/src/main/kotlin/config/Defaults.kt @@ -1,8 +1,9 @@ package opensavvy.gradle.vite.kotlin.config +import opensavvy.gradle.vite.base.config.ViteConfig + internal fun ViteConfig.defaultConfiguration() { - // Root - version.convention("4.4.9") + setDefaults() plugin("@originjs/vite-plugin-commonjs", "viteCommonjs", "1.0.3", isNamedExport = true) plugin("@rollup/plugin-commonjs", "commonjs", "24.0.1") diff --git a/vite-kotlin/src/main/kotlin/tasks/CopyLocalResources.kt b/vite-kotlin/src/main/kotlin/tasks/CopyLocalResources.kt index e3c4a8e..45b563d 100644 --- a/vite-kotlin/src/main/kotlin/tasks/CopyLocalResources.kt +++ b/vite-kotlin/src/main/kotlin/tasks/CopyLocalResources.kt @@ -1,7 +1,7 @@ package opensavvy.gradle.vite.kotlin.tasks +import opensavvy.gradle.vite.base.config.ViteConfig import opensavvy.gradle.vite.kotlin.KotlinVitePlugin -import opensavvy.gradle.vite.kotlin.config.ViteConfig import opensavvy.gradle.vite.kotlin.viteBuildDevDir import opensavvy.gradle.vite.kotlin.viteBuildProdDir import org.gradle.api.Project diff --git a/vite-kotlin/src/main/kotlin/tasks/Dependencies.kt b/vite-kotlin/src/main/kotlin/tasks/Dependencies.kt index ce6e8f7..c881ede 100644 --- a/vite-kotlin/src/main/kotlin/tasks/Dependencies.kt +++ b/vite-kotlin/src/main/kotlin/tasks/Dependencies.kt @@ -1,6 +1,6 @@ package opensavvy.gradle.vite.kotlin.tasks -import opensavvy.gradle.vite.kotlin.config.ViteConfig +import opensavvy.gradle.vite.base.config.ViteConfig import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension diff --git a/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt b/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt index ba5ad99..a1077e5 100644 --- a/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt +++ b/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt @@ -1,7 +1,7 @@ package opensavvy.gradle.vite.kotlin.tasks +import opensavvy.gradle.vite.base.config.ViteConfig import opensavvy.gradle.vite.kotlin.KotlinVitePlugin -import opensavvy.gradle.vite.kotlin.config.ViteConfig import opensavvy.gradle.vite.kotlin.viteBuildDevDir import opensavvy.gradle.vite.kotlin.viteBuildProdDir import org.gradle.api.Project diff --git a/vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt b/vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt index 7bd9c74..96fdb14 100644 --- a/vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt +++ b/vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt @@ -1,9 +1,9 @@ package opensavvy.gradle.vite.kotlin.tasks import opensavvy.gradle.vite.kotlin.KotlinVitePlugin -import opensavvy.gradle.vite.kotlin.config.ExternalVitePlugin -import opensavvy.gradle.vite.kotlin.config.ViteBuildConfig -import opensavvy.gradle.vite.kotlin.config.ViteConfig +import opensavvy.gradle.vite.base.config.ExternalVitePlugin +import opensavvy.gradle.vite.base.config.ViteBuildConfig +import opensavvy.gradle.vite.base.config.ViteConfig import opensavvy.gradle.vite.kotlin.viteBuildDevDir import opensavvy.gradle.vite.kotlin.viteBuildDistDir import opensavvy.gradle.vite.kotlin.viteBuildProdDir -- 2.51.2 From 5d4ad8644f1c0d9d047acbb6e5970ee109d22db7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 28 Oct 2023 18:26:58 +0200 Subject: [PATCH 4/8] feat(vite-base): Generify the configuration dump task --- vite-base/src/main/kotlin/config/Dump.kt | 18 +++++ vite-base/src/main/kotlin/dump/DumpDsl.kt | 69 +++++++++++++++++++ .../main/kotlin/tasks/DumpConfiguration.kt | 30 +++----- 3 files changed, 97 insertions(+), 20 deletions(-) create mode 100644 vite-base/src/main/kotlin/config/Dump.kt create mode 100644 vite-base/src/main/kotlin/dump/DumpDsl.kt diff --git a/vite-base/src/main/kotlin/config/Dump.kt b/vite-base/src/main/kotlin/config/Dump.kt new file mode 100644 index 0000000..c694701 --- /dev/null +++ b/vite-base/src/main/kotlin/config/Dump.kt @@ -0,0 +1,18 @@ +package opensavvy.gradle.vite.base.config + +import opensavvy.gradle.vite.base.dump.DumpDsl + +fun DumpDsl.dumpViteConfig(config: ViteConfig) { + section("Top-level") { + value("Vite version", config.version.get()) + value("Plugins", config.plugins.get()) + } + + section("Build") { + value("Target", config.build.target.get()) + } + + section("Transitive resource dependencies") { + value("Projects", config.resources.projects.get()) + } +} diff --git a/vite-base/src/main/kotlin/dump/DumpDsl.kt b/vite-base/src/main/kotlin/dump/DumpDsl.kt new file mode 100644 index 0000000..0d98588 --- /dev/null +++ b/vite-base/src/main/kotlin/dump/DumpDsl.kt @@ -0,0 +1,69 @@ +package opensavvy.gradle.vite.base.dump + +/** + * Creates an information dump. See [dump]. + */ +class DumpDsl internal constructor() { + private val sections = ArrayList() + + fun section(name: String, block: SectionDsl.() -> Unit) { + sections += SectionDsl(name).apply(block) + } + + override fun toString(): String = buildString { + val paddingSize = 2 + sections + .flatMap { it.stored.keys } + .maxOf { it.length } + val padding = " ".repeat(paddingSize) + + for (section in sections) { + appendLine("» ${section.name}") + + for ((title, values) in section.stored) { + val spacingSize = paddingSize - title.length + val spacing = " ".repeat(spacingSize) + appendLine("$title${spacing}${values.firstOrNull() ?: "(none)"}") + + for (value in values.drop(1)) { + appendLine("$padding$value") + } + } + + appendLine() + } + } + + inner class SectionDsl internal constructor(internal val name: String) { + internal val stored = HashMap>() + + fun value(title: String, value: String) { + stored[title] = listOf(value) + } + + fun value(title: String, values: Iterable) { + stored[title] = values.map { it.toString() }.toList() + } + + fun value(title: String, vararg value: Any) = + value(title, value.asIterable()) + + } +} + +/** + * Creates an information dump. + * + * ### Example + * + * ```kotlin + * println(dump { + * section("Hello") { + * value("Path", "first") + * value("Other", "first", "second") + * } + * }) + * ``` + */ +fun dump(block: DumpDsl.() -> Unit): String = DumpDsl() + .apply(block) + .toString() diff --git a/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt b/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt index a1077e5..86ecdec 100644 --- a/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt +++ b/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt @@ -1,6 +1,8 @@ package opensavvy.gradle.vite.kotlin.tasks import opensavvy.gradle.vite.base.config.ViteConfig +import opensavvy.gradle.vite.base.config.dumpViteConfig +import opensavvy.gradle.vite.base.dump.dump import opensavvy.gradle.vite.kotlin.KotlinVitePlugin import opensavvy.gradle.vite.kotlin.viteBuildDevDir import opensavvy.gradle.vite.kotlin.viteBuildProdDir @@ -15,26 +17,14 @@ internal fun createDumpTask(project: Project, config: ViteConfig) { description = "Prints the configuration of the Vite plugin" doLast { - println(""" - » Top-level - Vite version ${config.version.get()} - Plugins ${config.plugins.get().dump()} - - » Build - Target ${config.build.target.get()} - - » Destinations - Dev ${viteBuildDev.get()} - Production ${viteBuildProd.get()} - - » Transitive resource dependencies - Projects ${config.resources.projects.get().dump()} - """.trimIndent()) + println(dump { + dumpViteConfig(config) + + section("Destinations") { + value("Development", viteBuildDev.get()) + value("Production", viteBuildProd.get()) + } + }) } } } - -private fun Collection.dump(transform: (T) -> CharSequence = { it.toString() }) = this - .takeIf { it.isNotEmpty() } - ?.joinToString(separator = "\n ", transform = transform) - ?: "(none)" -- 2.51.2 From e43e9610c649d15f456dd2f408f2ea21da966678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 28 Oct 2023 18:33:44 +0200 Subject: [PATCH 5/8] feat(vite-base): Generify the configuration writing task --- .../src/main/kotlin/tasks/WriteConfig.kt | 37 +------------------ .../src/main/kotlin/tasks/ConfigWriter.kt | 36 ++++++++++++++++++ 2 files changed, 38 insertions(+), 35 deletions(-) rename vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt => vite-base/src/main/kotlin/tasks/WriteConfig.kt (65%) create mode 100644 vite-kotlin/src/main/kotlin/tasks/ConfigWriter.kt diff --git a/vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt b/vite-base/src/main/kotlin/tasks/WriteConfig.kt similarity index 65% rename from vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt rename to vite-base/src/main/kotlin/tasks/WriteConfig.kt index 96fdb14..258dce4 100644 --- a/vite-kotlin/src/main/kotlin/tasks/ViteConfigWriter.kt +++ b/vite-base/src/main/kotlin/tasks/WriteConfig.kt @@ -1,14 +1,9 @@ -package opensavvy.gradle.vite.kotlin.tasks +package opensavvy.gradle.vite.base.tasks -import opensavvy.gradle.vite.kotlin.KotlinVitePlugin import opensavvy.gradle.vite.base.config.ExternalVitePlugin import opensavvy.gradle.vite.base.config.ViteBuildConfig import opensavvy.gradle.vite.base.config.ViteConfig -import opensavvy.gradle.vite.kotlin.viteBuildDevDir -import opensavvy.gradle.vite.kotlin.viteBuildDistDir -import opensavvy.gradle.vite.kotlin.viteBuildProdDir import org.gradle.api.DefaultTask -import org.gradle.api.Project import org.gradle.api.file.RegularFile import org.gradle.api.file.RegularFileProperty import org.gradle.api.provider.ListProperty @@ -16,7 +11,6 @@ import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction -import org.gradle.configurationcache.extensions.capitalized import org.gradle.work.DisableCachingByDefault import java.io.File @@ -25,7 +19,7 @@ import java.io.File */ @Suppress("LeakingThis") @DisableCachingByDefault(because = "Not worth caching") -abstract class ViteConfigWriter : DefaultTask() { +abstract class WriteConfig : DefaultTask() { /** * Directory in which the build happens. @@ -57,13 +51,11 @@ abstract class ViteConfigWriter : DefaultTask() { init { description = "Generates the vite.config.js file" - group = KotlinVitePlugin.GROUP val config = project.extensions.getByType(ViteConfig::class.java) plugins.convention(config.plugins) buildTarget.convention(config.build.target) configurationFile.convention(buildRoot.map { "$it/vite.config.js" }.map { RegularFile { File(it) } }) - outDir.convention(project.viteBuildDistDir.map { it.asFile.absolutePath }) } private fun pluginImport(plugin: ExternalVitePlugin) = if (plugin.isNamedExport) @@ -98,29 +90,4 @@ abstract class ViteConfigWriter : DefaultTask() { """.trimIndent() ) } - - companion object { - /** Name of the default configuration task for the dev build. */ - const val NAME_DEV = "viteConfigureDev" - /** Name of the default configuration task for the production build. */ - const val NAME_PROD = "viteConfigureProd" - } -} - -internal fun createConfigWriterTasks(project: Project) { - project.tasks.register(ViteConfigWriter.NAME_DEV, ViteConfigWriter::class.java) { - dependsOn("viteCompileDev") - - buildRoot.convention(project.viteBuildDevDir.map { it.asFile.absolutePath }) - } - - project.tasks.register(ViteConfigWriter.NAME_PROD, ViteConfigWriter::class.java) { - dependsOn("viteCompileProd") - - buildRoot.convention(project.viteBuildProdDir.map { it.asFile.absolutePath }) - } - - project.tasks.named("clean") { - dependsOn("clean${ViteConfigWriter.NAME_DEV.capitalized()}", "clean${ViteConfigWriter.NAME_PROD.capitalized()}") - } } diff --git a/vite-kotlin/src/main/kotlin/tasks/ConfigWriter.kt b/vite-kotlin/src/main/kotlin/tasks/ConfigWriter.kt new file mode 100644 index 0000000..b5d65fd --- /dev/null +++ b/vite-kotlin/src/main/kotlin/tasks/ConfigWriter.kt @@ -0,0 +1,36 @@ +package opensavvy.gradle.vite.kotlin.tasks + +import opensavvy.gradle.vite.base.tasks.WriteConfig +import opensavvy.gradle.vite.kotlin.KotlinVitePlugin +import opensavvy.gradle.vite.kotlin.viteBuildDevDir +import opensavvy.gradle.vite.kotlin.viteBuildDistDir +import opensavvy.gradle.vite.kotlin.viteBuildProdDir +import org.gradle.api.Project +import org.gradle.configurationcache.extensions.capitalized + +/** Name of the default configuration task for the dev build. */ +internal const val VITE_CONFIGURE_DEV_NAME = "viteConfigureDev" +/** Name of the default configuration task for the production build. */ +internal const val VITE_CONFIGURE_PROD_NAME = "viteConfigureProd" + +internal fun createConfigWriterTasks(project: Project) { + project.tasks.register(VITE_CONFIGURE_DEV_NAME, WriteConfig::class.java) { + dependsOn("viteCompileDev") + group = KotlinVitePlugin.GROUP + + outDir.convention(project.viteBuildDistDir.map { it.asFile.absolutePath }) + buildRoot.convention(project.viteBuildDevDir.map { it.asFile.absolutePath }) + } + + project.tasks.register(VITE_CONFIGURE_PROD_NAME, WriteConfig::class.java) { + dependsOn("viteCompileProd") + group = KotlinVitePlugin.GROUP + + outDir.convention(project.viteBuildDistDir.map { it.asFile.absolutePath }) + buildRoot.convention(project.viteBuildProdDir.map { it.asFile.absolutePath }) + } + + project.tasks.named("clean") { + dependsOn("clean${VITE_CONFIGURE_DEV_NAME.capitalized()}", "clean${VITE_CONFIGURE_PROD_NAME.capitalized()}") + } +} -- 2.51.2 From 148882d99a521772dcff8bee86c13a1391f01f07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 28 Oct 2023 19:05:13 +0200 Subject: [PATCH 6/8] feat(vite-base): Add the root and base configuration --- vite-base/src/main/kotlin/config/Dump.kt | 11 +++-- .../src/main/kotlin/config/ViteConfig.kt | 49 ++++++++++++++++++- vite-base/src/main/kotlin/dump/DumpDsl.kt | 24 +++++---- .../main/kotlin/tasks/DumpConfiguration.kt | 4 +- 4 files changed, 71 insertions(+), 17 deletions(-) diff --git a/vite-base/src/main/kotlin/config/Dump.kt b/vite-base/src/main/kotlin/config/Dump.kt index c694701..d782bdd 100644 --- a/vite-base/src/main/kotlin/config/Dump.kt +++ b/vite-base/src/main/kotlin/config/Dump.kt @@ -4,15 +4,18 @@ import opensavvy.gradle.vite.base.dump.DumpDsl fun DumpDsl.dumpViteConfig(config: ViteConfig) { section("Top-level") { - value("Vite version", config.version.get()) - value("Plugins", config.plugins.get()) + value("Vite version", config.version) + value("Plugins", config.plugins) + + value("Root", config.root) + value("Base", config.base) } section("Build") { - value("Target", config.build.target.get()) + value("Target", config.build.target) } section("Transitive resource dependencies") { - value("Projects", config.resources.projects.get()) + value("Projects", config.resources.projects) } } diff --git a/vite-base/src/main/kotlin/config/ViteConfig.kt b/vite-base/src/main/kotlin/config/ViteConfig.kt index 0eec47f..767c625 100644 --- a/vite-base/src/main/kotlin/config/ViteConfig.kt +++ b/vite-base/src/main/kotlin/config/ViteConfig.kt @@ -1,5 +1,6 @@ package opensavvy.gradle.vite.base.config +import org.gradle.api.file.DirectoryProperty import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.Nested @@ -26,13 +27,12 @@ interface ViteConfig { fun setDefaults() { // Root version.convention("4.4.9") + base.convention("/") } /** * The version of the Vite package used by this build. * - * The list of versions is available [on the NPM website](https://www.npmjs.com/package/vite?activeTab=versions). - * * ### Example * * ```kotlin @@ -40,9 +40,54 @@ interface ViteConfig { * version.set("3.0.0") * } * ``` + * + * ### External resources + * + * - [List of versions](https://www.npmjs.com/package/vite?activeTab=versions). */ val version: Property + /** + * Project root directory, where `index.html` is located. + * + * ### Example + * + * ```kotlin + * vite { + * root.set(project.layout.projectDirectory.file("index.html")) + * } + * ``` + * + * ### External resources + * + * - [Official documentation](https://vitejs.dev/config/shared-options.html#root) + */ + val root: DirectoryProperty + + /** + * Base public path when served in development or production. + * + * Valid values include: + * - Absolute URL pathname, e.g. `/foo/`, + * - Full URL, e.g. `https://foo.com/`, + * - Empty string or `./` (for embedded deployment). + * + * ### Example + * + * To expose the generate website to the `/ui` path instead of the website root, use: + * ```kotlin + * vite { + * base.set("/ui") + * } + * ``` + * + * ### External resources + * + * - [Official documentation](https://vitejs.dev/config/shared-options.html#base) + * - [Setting the public base path](https://vitejs.dev/guide/build.html#public-base-path) + */ + val base: Property + /** * The list of Vite plugins from NPM imported by this project. * diff --git a/vite-base/src/main/kotlin/dump/DumpDsl.kt b/vite-base/src/main/kotlin/dump/DumpDsl.kt index 0d98588..a33c1ea 100644 --- a/vite-base/src/main/kotlin/dump/DumpDsl.kt +++ b/vite-base/src/main/kotlin/dump/DumpDsl.kt @@ -1,5 +1,10 @@ package opensavvy.gradle.vite.base.dump +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.Provider + +private const val notConfigured = "(none)" + /** * Creates an information dump. See [dump]. */ @@ -22,7 +27,7 @@ class DumpDsl internal constructor() { for ((title, values) in section.stored) { val spacingSize = paddingSize - title.length val spacing = " ".repeat(spacingSize) - appendLine("$title${spacing}${values.firstOrNull() ?: "(none)"}") + appendLine("$title${spacing}${values.firstOrNull() ?: notConfigured}") for (value in values.drop(1)) { appendLine("$padding$value") @@ -36,17 +41,18 @@ class DumpDsl internal constructor() { inner class SectionDsl internal constructor(internal val name: String) { internal val stored = HashMap>() - fun value(title: String, value: String) { - stored[title] = listOf(value) + private fun Any?.customToString(): String = when (this) { + is Provider<*> -> map { it.customToString() }.getOrElse(notConfigured) + else -> toString() } - fun value(title: String, values: Iterable) { - stored[title] = values.map { it.toString() }.toList() + fun value(title: String, value: Any) { + when (value) { + is Iterable<*> -> stored[title] = value.map { it.customToString() }.toList() + is ListProperty<*> -> value(title, value.getOrElse(emptyList())) + else -> stored[title] = listOf(value.customToString()) + } } - - fun value(title: String, vararg value: Any) = - value(title, value.asIterable()) - } } diff --git a/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt b/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt index 86ecdec..1c7a2bb 100644 --- a/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt +++ b/vite-kotlin/src/main/kotlin/tasks/DumpConfiguration.kt @@ -21,8 +21,8 @@ internal fun createDumpTask(project: Project, config: ViteConfig) { dumpViteConfig(config) section("Destinations") { - value("Development", viteBuildDev.get()) - value("Production", viteBuildProd.get()) + value("Development", viteBuildDev) + value("Production", viteBuildProd) } }) } -- 2.51.2 From f9073a11a52b07d20786b36d538e24ddfef54754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 28 Oct 2023 19:34:13 +0200 Subject: [PATCH 7/8] refactor(vite-base): Tasks default to the global configuration --- vite-base/src/main/kotlin/BaseVitePlugin.kt | 10 ++- .../src/main/kotlin/config/ViteBuildConfig.kt | 27 +++++++ .../src/main/kotlin/config/ViteConfig.kt | 15 ++++ .../main/kotlin/config/ViteResourceConfig.kt | 2 + .../src/main/kotlin/tasks/WriteConfig.kt | 74 +++++++++---------- .../src/main/kotlin/KotlinVitePlugin.kt | 3 +- .../src/main/kotlin/tasks/ConfigWriter.kt | 18 ++++- 7 files changed, 102 insertions(+), 47 deletions(-) diff --git a/vite-base/src/main/kotlin/BaseVitePlugin.kt b/vite-base/src/main/kotlin/BaseVitePlugin.kt index e52add4..35610dc 100644 --- a/vite-base/src/main/kotlin/BaseVitePlugin.kt +++ b/vite-base/src/main/kotlin/BaseVitePlugin.kt @@ -1,11 +1,19 @@ package opensavvy.gradle.vite.base +import opensavvy.gradle.vite.base.config.ViteConfig import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.getByType class BaseVitePlugin : Plugin { override fun apply(target: Project) { - println("Applied the Base Vite plugin") + val config = target.extensions.create("vite", ViteConfig::class.java) } } + +/** + * Accesses the project's [ViteConfig] extension. + */ +val Project.viteConfig: ViteConfig + get() = extensions.getByType() diff --git a/vite-base/src/main/kotlin/config/ViteBuildConfig.kt b/vite-base/src/main/kotlin/config/ViteBuildConfig.kt index b9f0dcb..770f09d 100644 --- a/vite-base/src/main/kotlin/config/ViteBuildConfig.kt +++ b/vite-base/src/main/kotlin/config/ViteBuildConfig.kt @@ -1,6 +1,8 @@ package opensavvy.gradle.vite.base.config +import org.gradle.api.file.DirectoryProperty import org.gradle.api.provider.Property +import org.gradle.api.tasks.Internal /** * Rollup configuration. @@ -29,7 +31,32 @@ interface ViteBuildConfig { * } * } * ``` + * + * ### External resources + * + * - [Official documentation](https://vitejs.dev/config/build-options.html#build-target) */ + @get:Internal val target: Property + /** + * Output directory of the production build. + * + * ### Example + * + * ```kotlin + * vite { + * build { + * outDir.set(project.layout.buildDirectory.dir("dist")) + * } + * } + * ``` + * + * ### External resources + * + * - [Official documentation](https://vitejs.dev/config/build-options.html#build-outdir) + */ + @get:Internal + val outDir: DirectoryProperty + } diff --git a/vite-base/src/main/kotlin/config/ViteConfig.kt b/vite-base/src/main/kotlin/config/ViteConfig.kt index 767c625..d4e0d7b 100644 --- a/vite-base/src/main/kotlin/config/ViteConfig.kt +++ b/vite-base/src/main/kotlin/config/ViteConfig.kt @@ -3,6 +3,7 @@ package opensavvy.gradle.vite.base.config import org.gradle.api.file.DirectoryProperty import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property +import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Nested import org.intellij.lang.annotations.Language @@ -30,6 +31,16 @@ interface ViteConfig { base.convention("/") } + fun setDefaultsFrom(other: ViteConfig) { + version.convention(other.version) + root.convention(other.root) + base.convention(other.base) + plugins.convention(other.plugins) + build.target.convention(other.build.target) + build.outDir.convention(other.build.outDir) + resources.projects.convention(other.resources.projects) + } + /** * The version of the Vite package used by this build. * @@ -45,6 +56,7 @@ interface ViteConfig { * * - [List of versions](https://www.npmjs.com/package/vite?activeTab=versions). */ + @get:Internal val version: Property /** @@ -62,6 +74,7 @@ interface ViteConfig { * * - [Official documentation](https://vitejs.dev/config/shared-options.html#root) */ + @get:Internal val root: DirectoryProperty /** @@ -86,6 +99,7 @@ interface ViteConfig { * - [Official documentation](https://vitejs.dev/config/shared-options.html#base) * - [Setting the public base path](https://vitejs.dev/guide/build.html#public-base-path) */ + @get:Internal val base: Property /** @@ -95,6 +109,7 @@ interface ViteConfig { * * For more information on plugins, see [ExternalVitePlugin]. */ + @get:Internal val plugins: ListProperty /** diff --git a/vite-base/src/main/kotlin/config/ViteResourceConfig.kt b/vite-base/src/main/kotlin/config/ViteResourceConfig.kt index df8a8ed..49bfe72 100644 --- a/vite-base/src/main/kotlin/config/ViteResourceConfig.kt +++ b/vite-base/src/main/kotlin/config/ViteResourceConfig.kt @@ -2,6 +2,7 @@ package opensavvy.gradle.vite.base.config import org.gradle.api.Project import org.gradle.api.provider.ListProperty +import org.gradle.api.tasks.Internal /** * Declares which resources from other Kotlin Multiplatform projects should be imported. @@ -24,6 +25,7 @@ interface ViteResourceConfig { * * For convenience, you may use the [from] method. */ + @get:Internal val projects: ListProperty /** diff --git a/vite-base/src/main/kotlin/tasks/WriteConfig.kt b/vite-base/src/main/kotlin/tasks/WriteConfig.kt index 258dce4..1bacc8d 100644 --- a/vite-base/src/main/kotlin/tasks/WriteConfig.kt +++ b/vite-base/src/main/kotlin/tasks/WriteConfig.kt @@ -1,14 +1,12 @@ package opensavvy.gradle.vite.base.tasks import opensavvy.gradle.vite.base.config.ExternalVitePlugin -import opensavvy.gradle.vite.base.config.ViteBuildConfig import opensavvy.gradle.vite.base.config.ViteConfig +import opensavvy.gradle.vite.base.viteConfig import org.gradle.api.DefaultTask import org.gradle.api.file.RegularFile import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.ListProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Nested import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction import org.gradle.work.DisableCachingByDefault @@ -22,29 +20,15 @@ import java.io.File abstract class WriteConfig : DefaultTask() { /** - * Directory in which the build happens. + * The configuration to write to the file. */ - @get:Input - abstract val buildRoot: Property - - /** See [ViteConfig.plugins]. */ - @get:Input - abstract val plugins: ListProperty - - /** See [ViteBuildConfig.target]. */ - @get:Input - abstract val buildTarget: Property - - /** - * The directory in which the distribution will be created. - */ - @get:Input - abstract val outDir: Property + @get:Nested + abstract val config: ViteConfig /** * The path to the `vite.config.js` file which will be created by this task. * - * By default, it is created in the [buildRoot] directory. + * By default, it is created in the [root][ViteConfig.root] directory. */ @get:OutputFile abstract val configurationFile: RegularFileProperty @@ -52,12 +36,18 @@ abstract class WriteConfig : DefaultTask() { init { description = "Generates the vite.config.js file" - val config = project.extensions.getByType(ViteConfig::class.java) - plugins.convention(config.plugins) - buildTarget.convention(config.build.target) - configurationFile.convention(buildRoot.map { "$it/vite.config.js" }.map { RegularFile { File(it) } }) + config.setDefaultsFrom(project.viteConfig) + configurationFile.convention(config.root.map { "$it/vite.config.js" }.map { RegularFile { File(it) } }) + + inputs.property("plugins", config.plugins) + inputs.property("base", config.base) + inputs.property("root", config.root.map { it.toString() }) + inputs.property("build.target", config.build.target) + inputs.property("build.outDir", config.build.outDir.map { it.toString() }) } + fun config(block: ViteConfig.() -> Unit) = config.apply(block) + private fun pluginImport(plugin: ExternalVitePlugin) = if (plugin.isNamedExport) "import {${plugin.exportedAs}} from '${plugin.packageName}'" else @@ -66,26 +56,28 @@ abstract class WriteConfig : DefaultTask() { @TaskAction fun create() { val output = configurationFile.get().asFile + output.writeText( // language=JavaScript """ - ${ - plugins.get().joinToString(separator = "\n ") { pluginImport(it) } + ${ + config.plugins.get().joinToString(separator = "\n ") { pluginImport(it) } } - /** @type {import('vite').UserConfig} */ - export default { - base: '', - plugins: [ - ${ - plugins.get() - .joinToString(separator = ",\n ") { "${it.exportedAs}(${it.configuration ?: ""})" } + /** @type {import('vite').UserConfig} */ + export default { + root: '${config.root.get().asFile.relativeTo(configurationFile.get().asFile.parentFile)}', + base: '${config.base.get()}', + plugins: [ + ${ + config.plugins.get() + .joinToString(separator = ",\n ") { "${it.exportedAs}(${it.configuration ?: ""})" } + }, + ], + build: { + target: '${config.build.target.get()}', + outDir: '${config.build.outDir.get()}', + }, } - ], - build: { - target: '${buildTarget.get()}', - outDir: '${outDir.get()}' - } - } """.trimIndent() ) diff --git a/vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt b/vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt index 638bf56..4164578 100644 --- a/vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt +++ b/vite-kotlin/src/main/kotlin/KotlinVitePlugin.kt @@ -1,6 +1,7 @@ package opensavvy.gradle.vite.kotlin import opensavvy.gradle.vite.base.config.ViteConfig +import opensavvy.gradle.vite.base.viteConfig import opensavvy.gradle.vite.kotlin.config.defaultConfiguration import opensavvy.gradle.vite.kotlin.tasks.* import org.gradle.api.Plugin @@ -15,7 +16,7 @@ class KotlinVitePlugin : Plugin { target.pluginManager.apply("dev.opensavvy.vite.base") - val config = target.extensions.create("vite", ViteConfig::class.java) + val config = target.viteConfig config.defaultConfiguration() // Lifecycle tasks for convenience diff --git a/vite-kotlin/src/main/kotlin/tasks/ConfigWriter.kt b/vite-kotlin/src/main/kotlin/tasks/ConfigWriter.kt index b5d65fd..b473ba8 100644 --- a/vite-kotlin/src/main/kotlin/tasks/ConfigWriter.kt +++ b/vite-kotlin/src/main/kotlin/tasks/ConfigWriter.kt @@ -18,16 +18,26 @@ internal fun createConfigWriterTasks(project: Project) { dependsOn("viteCompileDev") group = KotlinVitePlugin.GROUP - outDir.convention(project.viteBuildDistDir.map { it.asFile.absolutePath }) - buildRoot.convention(project.viteBuildDevDir.map { it.asFile.absolutePath }) + config { + root.set(project.viteBuildDevDir) + + build { + outDir.set(project.viteBuildDistDir) + } + } } project.tasks.register(VITE_CONFIGURE_PROD_NAME, WriteConfig::class.java) { dependsOn("viteCompileProd") group = KotlinVitePlugin.GROUP - outDir.convention(project.viteBuildDistDir.map { it.asFile.absolutePath }) - buildRoot.convention(project.viteBuildProdDir.map { it.asFile.absolutePath }) + config { + root.convention(project.viteBuildProdDir) + + build { + outDir.convention(project.viteBuildDistDir) + } + } } project.tasks.named("clean") { -- 2.51.2 From 7e4873a7be6ee91369d29fc6afe40f9015102bd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 28 Oct 2023 19:55:50 +0200 Subject: [PATCH 8/8] refactor(vite-base): Extract the ViteExec task to Base --- vite-base/src/main/kotlin/tasks/ViteExec.kt | 105 ++++++++++++++ .../src/main/kotlin/tasks/ViteExecTask.kt | 129 +++++------------- 2 files changed, 136 insertions(+), 98 deletions(-) create mode 100644 vite-base/src/main/kotlin/tasks/ViteExec.kt diff --git a/vite-base/src/main/kotlin/tasks/ViteExec.kt b/vite-base/src/main/kotlin/tasks/ViteExec.kt new file mode 100644 index 0000000..0132649 --- /dev/null +++ b/vite-base/src/main/kotlin/tasks/ViteExec.kt @@ -0,0 +1,105 @@ +package opensavvy.gradle.vite.base.tasks + +import opensavvy.gradle.vite.base.config.ViteConfig +import opensavvy.gradle.vite.base.viteConfig +import org.gradle.api.DefaultTask +import org.gradle.api.file.RegularFile +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.* +import org.gradle.process.ExecOperations +import java.io.File +import javax.inject.Inject + +/** + * Executes a Vite command in the context of this project. + */ +@Suppress("LeakingThis") +@CacheableTask +abstract class ViteExec @Inject constructor( + private val process: ExecOperations, +) : DefaultTask() { + + /** + * The Vite command to execute, for example `run` or `build`. + */ + @get:Input + @get:Optional + abstract val command: Property + + /** + * Arguments passed to [command]. + */ + @get:Input + abstract val arguments: ListProperty + + /** + * The path to the Node executable. + * + * Use this property to override which Node installation is used. + * By default, the Node installation used by the Kotlin plugin is used. + */ + @get:InputFile + @get:PathSensitive(PathSensitivity.RELATIVE) + abstract val nodePath: RegularFileProperty + + /** + * The path to the Vite executable. + * + * Use this property to override which Vite installation is used. + * By default, Vite is installed as a development dependency of the project in which this plugin is applied. + */ + @get:InputFile + @get:PathSensitive(PathSensitivity.RELATIVE) + abstract val vitePath: RegularFileProperty + + /** + * The directory in which the command will be executed. + */ + @get:Input + abstract val workingDirectory: Property + + /** + * The path to the `vite.config.js` file. + */ + @get:InputFile + @get:PathSensitive(PathSensitivity.RELATIVE) + abstract val configurationFile: RegularFileProperty + + /** + * The Vite configuration. + */ + @get:Nested + abstract val config: ViteConfig + + init { + description = "Executes a given Vite command" + + command.convention("") + arguments.convention(emptyList()) + config.setDefaultsFrom(project.viteConfig) + configurationFile.convention(config.root.map { "$it/vite.config.js" }.map { RegularFile { File(it) } }) + workingDirectory.convention(config.root.map { it.asFile.absolutePath }) + + inputs.property("vite_version", config.version) + } + + fun config(block: ViteConfig.() -> Unit) = config.apply(block) + + @TaskAction + fun execute() { + process.exec { + commandLine( + nodePath.get().asFile.absolutePath, + vitePath.get().asFile.absolutePath, + command.get(), + "-c", + configurationFile.get().asFile.relativeTo(File(workingDirectory.get())), + *arguments.get().toTypedArray(), + ) + + workingDir(workingDirectory.get()) + } + } +} diff --git a/vite-kotlin/src/main/kotlin/tasks/ViteExecTask.kt b/vite-kotlin/src/main/kotlin/tasks/ViteExecTask.kt index e21481f..87e0cba 100644 --- a/vite-kotlin/src/main/kotlin/tasks/ViteExecTask.kt +++ b/vite-kotlin/src/main/kotlin/tasks/ViteExecTask.kt @@ -1,121 +1,54 @@ package opensavvy.gradle.vite.kotlin.tasks -import opensavvy.gradle.vite.kotlin.* -import org.gradle.api.DefaultTask +import opensavvy.gradle.vite.base.tasks.ViteExec +import opensavvy.gradle.vite.kotlin.KotlinVitePlugin +import opensavvy.gradle.vite.kotlin.viteBuildDevDir +import opensavvy.gradle.vite.kotlin.viteBuildDistDir +import opensavvy.gradle.vite.kotlin.viteBuildProdDir import org.gradle.api.Project import org.gradle.api.file.RegularFile -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.ListProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.* -import org.gradle.process.ExecOperations import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject import java.io.File -import javax.inject.Inject - -/** - * Executes a Vite command in the context of this project. - */ -@Suppress("LeakingThis") -@CacheableTask -abstract class ViteExecTask @Inject constructor( - private val process: ExecOperations, -) : DefaultTask() { - - /** - * The Vite command to execute, for example `run` or `build`. - */ - @get:Input - @get:Optional - abstract val command: Property - - /** - * Arguments passed to [command]. - */ - @get:Input - abstract val arguments: ListProperty - - /** - * The path to the Node executable. - * - * Use this property to override which Node installation is used. - * By default, the Node installation used by the Kotlin plugin is used. - */ - @get:InputFile - @get:PathSensitive(PathSensitivity.RELATIVE) - abstract val nodePath: RegularFileProperty - - /** - * The path to the Vite executable. - * - * Use this property to override which Vite installation is used. - * By default, Vite is installed as a development dependency of the project in which this plugin is applied. - */ - @get:InputFile - @get:PathSensitive(PathSensitivity.RELATIVE) - abstract val vitePath: RegularFileProperty - - @get:Input - abstract val workingDirectory: Property - - init { - group = KotlinVitePlugin.GROUP - description = "Executes a given Vite command" - - arguments.convention(emptyList()) - - val kotlinEnvironment = project.rootProject.kotlinNodeJsExtension - nodePath.convention( - kotlinEnvironment - .requireConfigured() - .let { RegularFile { File(it.nodeExecutable) } } - ) - - vitePath.convention( - kotlinEnvironment - .projectPackagesDir.parentFile.resolve(NpmProject.NODE_MODULES) - .let { RegularFile { File("$it/vite/bin/vite.js") } } - ) - - val config = project.kotlinViteExtension - inputs.property("vite_version", config.version) - } - - @TaskAction - fun execute() { - process.exec { - commandLine( - nodePath.get().asFile.absolutePath, - vitePath.get().asFile.absolutePath, - command.getOrElse(""), - "-c", - "../vite.config.js", - *arguments.get().toTypedArray(), - ) - - workingDir(workingDirectory.get()) - } - } +private fun ViteExec.execConventions() { + dependsOn(":kotlinNpmInstall") + group = KotlinVitePlugin.GROUP + + val kotlinEnvironment = project.rootProject.kotlinNodeJsExtension + nodePath.set( + kotlinEnvironment + .requireConfigured() + .let { RegularFile { File(it.nodeExecutable) } } + ) + + vitePath.set( + kotlinEnvironment + .projectPackagesDir.parentFile.resolve(NpmProject.NODE_MODULES) + .let { RegularFile { File("$it/vite/bin/vite.js") } } + ) } internal fun createExecTasks(project: Project) { - project.tasks.register("viteBuild", ViteExecTask::class.java) { + project.tasks.register("viteBuild", ViteExec::class.java) { description = "Builds the production variant of the project" - dependsOn("viteConfigureProd", "viteCompileProd", ":kotlinNpmInstall") + dependsOn("viteConfigureProd", "viteCompileProd") + execConventions() command.set("build") - workingDirectory.set(project.viteBuildProdDir.map { "$it/kotlin" }) + config.root.set(project.viteBuildProdDir.map { it.dir("kotlin") }) + configurationFile.set(project.viteBuildProdDir.map { it.file("vite.config.js") }) outputs.dir(project.viteBuildDistDir) } - project.tasks.register("viteRun", ViteExecTask::class.java) { + project.tasks.register("viteRun", ViteExec::class.java) { description = "Hosts the development variant of the project" - dependsOn("viteConfigureDev", "viteCompileDev", ":kotlinNpmInstall") + dependsOn("viteConfigureDev", "viteCompileDev") + execConventions() - workingDirectory.set(project.viteBuildDevDir.map { "$it/kotlin" }) + config.root.set(project.viteBuildDevDir.map { it.dir("kotlin") }) + configurationFile.set(project.viteBuildDevDir.map { it.file("vite.config.js") }) } project.tasks.named("assemble") { -- 2.51.2