diff --git a/ksp/core-annotations/.gitignore b/ksp/core-annotations/.gitignore index ce36b8c..378eac2 100644 --- a/ksp/core-annotations/.gitignore +++ b/ksp/core-annotations/.gitignore @@ -1 +1 @@ -../../ksp-annotations/build +build diff --git a/ksp/core-annotations/gradle.properties b/ksp/core-annotations/gradle.properties index a3feb79..dcc8a92 100644 --- a/ksp/core-annotations/gradle.properties +++ b/ksp/core-annotations/gradle.properties @@ -1,3 +1,3 @@ -POM_NAME=Ksp Processor -POM_ARTIFACT_ID=ksp-processor -POM_DESCRIPTION=The KSP routing processor +POM_NAME=Ksp Core Annotations +POM_ARTIFACT_ID=ksp-core-annotations +POM_DESCRIPTION=Core annotations to generate basic behaviors diff --git a/ksp/core-processor/.gitignore b/ksp/core-processor/.gitignore index da334b4..378eac2 100644 --- a/ksp/core-processor/.gitignore +++ b/ksp/core-processor/.gitignore @@ -1 +1 @@ -../../ksp-processor/build +build diff --git a/ksp/core-processor/gradle.properties b/ksp/core-processor/gradle.properties index a3feb79..9d4fbcc 100644 --- a/ksp/core-processor/gradle.properties +++ b/ksp/core-processor/gradle.properties @@ -1,3 +1,3 @@ -POM_NAME=Ksp Processor -POM_ARTIFACT_ID=ksp-processor -POM_DESCRIPTION=The KSP routing processor +POM_NAME=Ksp Core Processor +POM_ARTIFACT_ID=ksp-core-processor +POM_DESCRIPTION=Ksp core processor to generate basic behaviors diff --git a/ksp/gradle-plugin/.gitignore b/ksp/gradle-plugin/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/ksp/gradle-plugin/.gitignore @@ -0,0 +1 @@ +build diff --git a/ksp/gradle-plugin/build.gradle.kts b/ksp/gradle-plugin/build.gradle.kts new file mode 100644 index 0000000..0deadbe --- /dev/null +++ b/ksp/gradle-plugin/build.gradle.kts @@ -0,0 +1,41 @@ +import com.android.build.gradle.internal.tasks.factory.dependsOn + +plugins { + kotlin("jvm") + id("java-gradle-plugin") + id("com.gradle.plugin-publish") version "1.2.1" + id("org.jetbrains.kotlinx.kover") + alias(libs.plugins.maven.publish) +} + +dependencies { + implementation(libs.plugin.kotlin) +} + +gradlePlugin { + website.set("https://github.com/programadorthi/kotlin-routing") + vcsUrl.set("https://github.com/programadorthi/kotlin-routing") + + plugins { + create("kotlin-routing-plugin") { + id = "dev.programadorthi.routing" + implementationClass = "dev.programadorthi.routing.gradle.KotlinRoutingGradlePlugin" + displayName = "Kotlin Routing Gradle Plugin" + description = "Gradle Plugin for Kotlin Routing" + tags.set(listOf("router", "kotlin", "kotlin-mpp", "ktor", "routing", "navigation")) + } + } +} + +val versionRegister = tasks.register("version-register") { + commandLine( + "find", "./src", + "-type", "f", + "-exec", + "sed", "-i", + "''", """s//${providers.gradleProperty("version").get()}/g""", + "{}", "+" + ) +} + +tasks.named("processResources").dependsOn(versionRegister) diff --git a/ksp/gradle-plugin/gradle.properties b/ksp/gradle-plugin/gradle.properties new file mode 100644 index 0000000..00c7d90 --- /dev/null +++ b/ksp/gradle-plugin/gradle.properties @@ -0,0 +1,3 @@ +POM_NAME=Ksp Gradle Plugin +POM_ARTIFACT_ID=ksp-gradle-plugin +POM_DESCRIPTION=The KSP Gradle Plugin diff --git a/ksp/gradle-plugin/src/main/kotlin/dev/programadorthi/routing/gradle/KotlinRoutingGradlePlugin.kt b/ksp/gradle-plugin/src/main/kotlin/dev/programadorthi/routing/gradle/KotlinRoutingGradlePlugin.kt new file mode 100644 index 0000000..b0de05e --- /dev/null +++ b/ksp/gradle-plugin/src/main/kotlin/dev/programadorthi/routing/gradle/KotlinRoutingGradlePlugin.kt @@ -0,0 +1,56 @@ +package dev.programadorthi.routing.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import java.util.Locale + +class KotlinRoutingGradlePlugin : Plugin { + override fun apply(target: Project) { + with(target) { + checkNotNull(plugins.findPlugin("com.google.devtools.ksp")) { + "KSP plugin not found. Please, apply ksp plugin before routing plugin" + } + + val kex = kotlinExtension + if (kex is KotlinSingleTargetExtension<*>) { + dependencies.add("implementation", ANNOTATIONS) + dependencies.add("ksp", PROCESSOR) + return@with + } + + if (kex is KotlinMultiplatformExtension) { + kex.targets.configureEach { kTarget -> + kTarget.compilations.configureEach { compilation -> + println(">>>> $kTarget -> $compilation") + } + if (kTarget.platformType.name == "common") { + dependencies.add("kspCommonMainMetadata", PROCESSOR) + return@configureEach + } + val capitalizedTargetName = + kTarget.targetName.replaceFirstChar { + if (it.isLowerCase()) { + it.titlecase(Locale.US) + } else { + it.toString() + } + } + dependencies.add("ksp$capitalizedTargetName", PROCESSOR) + + if (kTarget.compilations.any { it.name == "test" }) { + dependencies.add("ksp${capitalizedTargetName}Test", PROCESSOR) + } + } + } + } + } + + private companion object { + // Version will be replaced by Gradle Exec Task + private const val ANNOTATIONS = "dev.programadorthi.routing:ksp-core-annotations:" + private const val PROCESSOR = "dev.programadorthi.routing:ksp-core-processor:" + } +} diff --git a/samples/ksp-sample/build.gradle.kts b/samples/ksp-sample/build.gradle.kts index d96a602..7df2719 100644 --- a/samples/ksp-sample/build.gradle.kts +++ b/samples/ksp-sample/build.gradle.kts @@ -1,11 +1,17 @@ plugins { - alias(libs.plugins.ksp) kotlin("jvm") + alias(libs.plugins.ksp) + //id("dev.programadorthi.routing") version "0.0.99" } dependencies { implementation(projects.core) - implementation(projects.ksp.coreAnnotations) - implementation(projects.ksp.coreProcessor) - ksp(projects.ksp.coreProcessor) +} + +configurations.all { + resolutionStrategy.dependencySubstitution { + substitute(module("dev.programadorthi.routing:core")) + .using(project(":core")) + .because("KSP gradle plugin have maven central dependencies") + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index b209be6..c0d6c77 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -27,6 +27,7 @@ include(":events") include(":events-resources") include(":ksp:core-annotations") include(":ksp:core-processor") +include(":ksp:gradle-plugin") include(":resources") include(":sessions") include(":status-pages")