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") {