diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index fb658464..1858ddc4 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -23,7 +23,7 @@ dependencies { implementation(libs.gradleNodePlugin) - implementation(libs.qoomonGitVersioning) + implementation(libs.gitVersioningPlugin) } diff --git a/buildSrc/src/main/kotlin/buildsrc/config/gradle.kt b/buildSrc/src/main/kotlin/buildsrc/config/gradle.kt index e13da441..ce039062 100644 --- a/buildSrc/src/main/kotlin/buildsrc/config/gradle.kt +++ b/buildSrc/src/main/kotlin/buildsrc/config/gradle.kt @@ -1,7 +1,15 @@ package buildsrc.config +import org.gradle.api.Action +import org.gradle.api.Project +import org.gradle.api.artifacts.repositories.PasswordCredentials import org.gradle.api.file.ProjectLayout +import org.gradle.api.provider.Provider +import org.gradle.api.provider.ProviderFactory +import org.gradle.kotlin.dsl.findByType import org.gradle.plugins.ide.idea.model.IdeaModule +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget /** exclude generated Gradle code, so it doesn't clog up search results */ @@ -21,3 +29,28 @@ fun IdeaModule.excludeGeneratedGradleDsl(layout: ProjectLayout) { ) ) } + + +// https://github.com/gradle/gradle/issues/20925 +fun ProviderFactory.credentialsAction( + repositoryName: String +): Provider> = zip( + gradleProperty("${repositoryName}Username"), + gradleProperty("${repositoryName}Password"), +) { user, pass -> + Action { + username = user + password = pass + } +} + + +/** Logic from [KotlinJvmTarget.withJava] */ +fun Project.isKotlinMultiplatformJavaEnabled(): Boolean { + val multiplatformExtension: KotlinMultiplatformExtension? = + extensions.findByType(KotlinMultiplatformExtension::class) + + return multiplatformExtension?.targets + ?.any { it is KotlinJvmTarget && it.withJavaEnabled } + ?: false +} diff --git a/buildSrc/src/main/kotlin/buildsrc/config/publishing.kt b/buildSrc/src/main/kotlin/buildsrc/config/publishing.kt index 3295aee3..1038f833 100644 --- a/buildSrc/src/main/kotlin/buildsrc/config/publishing.kt +++ b/buildSrc/src/main/kotlin/buildsrc/config/publishing.kt @@ -2,17 +2,44 @@ package buildsrc.config import org.gradle.api.Project import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.getByType import org.gradle.plugins.signing.SigningExtension +fun MavenPublication.createKxsTsGenPom(): Unit = pom { + name.set("Kotlinx Serialization Typescript Generator") + description.set("KxsTsGen creates TypeScript interfaces from Kotlinx Serialization @Serializable classes") + url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator") + + licenses { + license { + name.set("The Apache License, Version 2.0") + url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") + } + } + + developers { + developer { + email.set("adam@adamko.dev") + } + } + + scm { + connection.set("scm:git:git://github.com/adamko-dev/kotlinx-serialization-typescript-generator.git") + developerConnection.set("scm:git:ssh://github.com:adamko-dev/kotlinx-serialization-typescript-generator.git") + url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator") + } +} + + // hacks because IntelliJ still doesn't properly load DSL accessors for buildSrc /** Configure [PublishingExtension] */ -fun Project.publishing(action: PublishingExtension.() -> Unit): Unit = - extensions.configure(action) +fun Project.publishing(configure: PublishingExtension.() -> Unit): Unit = + extensions.configure(configure) val Project.publishing: PublishingExtension @@ -20,8 +47,8 @@ val Project.publishing: PublishingExtension /** Configure [SigningExtension] */ -fun Project.signing(action: SigningExtension.() -> Unit): Unit = - extensions.configure(action) +fun Project.signing(configure: SigningExtension.() -> Unit): Unit = + extensions.configure(configure) val Project.signing: SigningExtension diff --git a/buildSrc/src/main/kotlin/buildsrc/convention/maven-publish.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/convention/maven-publish.gradle.kts index 598ec2b3..d9377ce1 100644 --- a/buildSrc/src/main/kotlin/buildsrc/convention/maven-publish.gradle.kts +++ b/buildSrc/src/main/kotlin/buildsrc/convention/maven-publish.gradle.kts @@ -1,10 +1,11 @@ package buildsrc.convention +import buildsrc.config.createKxsTsGenPom +import buildsrc.config.credentialsAction +import buildsrc.config.isKotlinMultiplatformJavaEnabled import buildsrc.config.publishing import buildsrc.config.signing -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin -import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget plugins { @@ -13,15 +14,8 @@ plugins { } val sonatypeRepositoryCredentials: Provider> = - providers.zip( - providers.gradleProperty("sonatypeRepositoryUsername"), - providers.gradleProperty("sonatypeRepositoryPassword"), - ) { user, pass -> - Action { - username = user - password = pass - } - } + providers.credentialsAction("sonatypeRepository") + val sonatypeRepositoryReleaseUrl: Provider = provider { if (version.toString().endsWith("SNAPSHOT")) { @@ -49,26 +43,21 @@ val javadocJarStub by tasks.registering(Jar::class) { } -tasks.matching { - it.name.startsWith(PublishingPlugin.PUBLISH_LIFECYCLE_TASK_NAME) - && it.group == PublishingPlugin.PUBLISH_TASK_GROUP -}.configureEach { +tasks.withType().configureEach { + // Gradle warns about some signing tasks using publishing task outputs without explicit + // dependencies. I'm not going to go through them all and fix them, so here's a quick fix. + dependsOn(tasks.withType()) + if (sonatypeRepositoryCredentials.isPresent()) { dependsOn(javadocJarStub) } + doLast { logger.lifecycle("[${this.name}] ${project.group}:${project.name}:${project.version}") } } -// Gradle warns about some signing tasks using publishing task outputs without explicit -// dependencies. I'm not going to go through them all and fix them, so here's a quick safety check. -tasks.matching { it.name.startsWith("publish") }.configureEach { - mustRunAfter(tasks.matching { it.name.startsWith("sign") }) -} - - publishing { if (sonatypeRepositoryCredentials.isPresent()) { repositories { @@ -76,9 +65,14 @@ publishing { name = "sonatype" credentials(sonatypeRepositoryCredentials.get()) } + // publish to local dir, for testing + // maven { + // name = "maven-internal" + // url = uri(rootProject.layout.buildDirectory.dir("maven-internal")) + // } } publications.withType().configureEach { - createKxTsGenPom() + createKxsTsGenPom() artifact(javadocJarStub) } } @@ -124,40 +118,3 @@ plugins.withType(JavaPlatformPlugin::class).configureEach { from(components["javaPlatform"]) } } - - -fun MavenPublication.createKxTsGenPom(): Unit = pom { - name.set("Kotlinx Serialization Typescript Generator") - description.set("KxTsGen creates TypeScript interfaces from Kotlinx Serialization @Serializable classes") - url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator") - - licenses { - license { - name.set("The Apache License, Version 2.0") - url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") - } - } - - developers { - developer { - email.set("adam@adamko.dev") - } - } - - scm { - connection.set("scm:git:git://github.com/adamko-dev/kotlinx-serialization-typescript-generator.git") - developerConnection.set("scm:git:ssh://github.com:adamko-dev/kotlinx-serialization-typescript-generator.git") - url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator") - } -} - - -/** Logic from [KotlinJvmTarget.withJava] */ -fun Project.isKotlinMultiplatformJavaEnabled(): Boolean { - val multiplatformExtension: KotlinMultiplatformExtension? = - extensions.findByType(KotlinMultiplatformExtension::class) - - return multiplatformExtension?.targets - ?.any { it is KotlinJvmTarget && it.withJavaEnabled } - ?: false -} diff --git a/docs/tuples.md b/docs/tuples.md index 2aca0f0f..0bda74cb 100644 --- a/docs/tuples.md +++ b/docs/tuples.md @@ -27,7 +27,7 @@ In TypeScript, tuples are a compact format for data structures. They're like fix that only contain the type. This is especially useful when using JSON, as including property names means the messages are much larger. -Tuples are a bit difficult to create in Kotlinx Serialization, but KxTsGen includes +Tuples are a bit difficult to create in Kotlinx Serialization, but KxsTsGen includes [TupleSerializer](../modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/core/experiments/tuple.kt) which can help. It requires a name, an ordered list of elements, and a constructor for deserializing. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 06738275..79c5eec3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,8 +22,7 @@ kotlinProcess = "1.3.1" classgraph = "4.8.143" gradleNodePlugin = "3.3.0" - -qoomonGitVersioning = "6.1.2" +gitVersioningPlugin = "6.1.2" [libraries] @@ -55,6 +54,7 @@ kotlinProcess = { group = "com.github.pgreze", name = "kotlin-process", version. kotlinCompileTesting = { group = "com.github.tschuchortdev", name = "kotlin-compile-testing", version.ref = "kotlinCompileTesting" } kotlinCompileTesting-ksp = { group = "com.github.tschuchortdev", name = "kotlin-compile-testing-ksp", version.ref = "kotlinCompileTesting" } +## Kotest ## kotest-bom = { group = "io.kotest", name = "kotest-bom", version.ref = "kotest" } kotest-assertionsCore = { group = "io.kotest", name = "kotest-assertions-core" } @@ -65,13 +65,16 @@ kotest-frameworkDatatest = { group = "io.kotest", name = "kotest-framework-datat kotest-runnerJUnit5 = { group = "io.kotest", name = "kotest-runner-junit5" } kotest-gradlePlugin = { group = "io.kotest", name = "kotest-framework-multiplatform-plugin-gradle", version.ref = "kotest" } +## Knit ## kotlinx-knit = { group = "org.jetbrains.kotlinx", name = "kotlinx-knit", version.ref = "kotlinx-knit" } kotlinx-knit-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-knit-test", version.ref = "kotlinx-knit" } kotlinx-knit-gradlePlugin = { group = "org.jetbrains.kotlinx", name = "kotlinx-knit", version.ref = "kotlinx-knit" } -qoomonGitVersioning = { group = "me.qoomon", name = "gradle-git-versioning-plugin", version.ref = "qoomonGitVersioning" } +### Gradle Plugins ### + +gitVersioningPlugin = { group = "me.qoomon", name = "gradle-git-versioning-plugin", version.ref = "gitVersioningPlugin" } [bundles] diff --git a/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsConfig.kt b/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsConfig.kt index 5f0d83fe..61016b93 100644 --- a/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsConfig.kt +++ b/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsConfig.kt @@ -1,7 +1,7 @@ package dev.adamko.kxstsgen import dev.adamko.kxstsgen.core.TsDeclaration -import dev.adamko.kxstsgen.core.UnimplementedKxTsGenApi +import dev.adamko.kxstsgen.core.UnimplementedKxsTsGenApi import dev.adamko.kxstsgen.core.util.MutableMapWithDefaultPut import kotlin.jvm.JvmInline import kotlin.reflect.KClass @@ -25,9 +25,9 @@ import kotlinx.serialization.modules.SerializersModuleCollector data class KxsTsConfig( val indent: String = " ", val declarationSeparator: String = "\n\n", - @UnimplementedKxTsGenApi + @UnimplementedKxsTsGenApi val namespaceConfig: NamespaceConfig = NamespaceConfig.Disabled, - @UnimplementedKxTsGenApi + @UnimplementedKxsTsGenApi val typeAliasTyping: TypeAliasTypingConfig = TypeAliasTypingConfig.None, val serializersModule: SerializersModule = EmptySerializersModule, ) { diff --git a/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsGenerator.kt b/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsGenerator.kt index 9ed94cdd..2ab1a9fb 100644 --- a/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsGenerator.kt +++ b/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsGenerator.kt @@ -23,7 +23,7 @@ import kotlinx.serialization.descriptors.nullable * or by setting hardcoded values in [serializerDescriptorOverrides] or [descriptorOverrides], * or changed by overriding any converter. * - * @param[config] General settings that affect how KxTsGen works + * @param[config] General settings that affect how KxsTsGen works * @param[sourceCodeGenerator] Convert [TsElement]s to TypeScript source code */ open class KxsTsGenerator( diff --git a/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/core/annotations.kt b/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/core/annotations.kt index 3b9b0ae8..8d1dee4a 100644 --- a/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/core/annotations.kt +++ b/modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/core/annotations.kt @@ -9,4 +9,4 @@ package dev.adamko.kxstsgen.core ) @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @MustBeDocumented -annotation class UnimplementedKxTsGenApi +annotation class UnimplementedKxsTsGenApi