diff --git a/build.gradle.kts b/build.gradle.kts index 306e13df..dbd0d572 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,9 @@ */ import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion -import util.getSpacePassword +import util.configureApiValidation +import util.configureNpm +import util.configureProjectReport import util.libs plugins { @@ -11,7 +13,6 @@ plugins { alias(libs.plugins.kotlinx.rpc) apply false alias(libs.plugins.conventions.kover) alias(libs.plugins.conventions.gradle.doctor) - alias(libs.plugins.binary.compatibility.validator) if (libs.versions.atomicfu.get() >= "0.24.0") { alias(libs.plugins.atomicfu.new) @@ -20,31 +21,9 @@ plugins { } } -// useful for dependencies introspection -// run ./gradlew htmlDependencyReport -// Report can normally be found in build/reports/project/dependencies/index.html -allprojects { - plugins.apply("project-report") -} - -object Const { - const val INTERNAL_RPC_API_ANNOTATION = "kotlinx.rpc.internal.utils.InternalRPCApi" -} - -apiValidation { - ignoredPackages.add("kotlinx.rpc.internal") - ignoredPackages.add("kotlinx.rpc.krpc.internal") - - ignoredProjects.addAll( - listOf( - "compiler-plugin-tests", - "krpc-test", - "utils", - ) - ) - - nonPublicMarkers.add(Const.INTERNAL_RPC_API_ANNOTATION) -} +configureProjectReport() +configureNpm() +configureApiValidation() val kotlinVersionFull: String by extra @@ -63,62 +42,3 @@ val kotlinGPVersion = getKotlinPluginVersion() if (kotlinVersionFull != kotlinGPVersion) { error("KGP version mismatch. Project version: $kotlinVersionFull, KGP version: $kotlinGPVersion") } - -val executeNpmLogin by tasks.registering { - val registryUrl = "https://packages.jetbrains.team/npm/p/krpc/build-deps/" - - // To prevent leaking of credentials in VCS on dev machine use the build directory config file - val buildYarnConfigFile = File(project.rootDir, "build/js/.yarnrc") - val buildNpmConfigFile = File(project.rootDir, "build/js/.npmrc") - - val spacePassword: String? = getSpacePassword() - - doLast { - val outputYarnText = """ - registry: "$registryUrl" - """.trimIndent() - - var outputNpmText = """ - registry: "$registryUrl" - """.trimIndent() - - if (spacePassword != null) { - if (spacePassword.split(".").size != 3) { - throw GradleException("Unexpected Space Token format") - } - - outputNpmText += System.lineSeparator() + """ - always-auth: true - ${registryUrl.removePrefix("https:")}:_authToken=$spacePassword - """.trimIndent() - } - - buildYarnConfigFile.createNewFile() - buildYarnConfigFile.writeText(outputYarnText) - buildNpmConfigFile.createNewFile() - buildNpmConfigFile.writeText(outputNpmText) - } - - outputs.file(buildYarnConfigFile).withPropertyName("buildOutputYarnFile") - outputs.file(buildNpmConfigFile).withPropertyName("buildOutputNpmFile") -} - -plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java).configureEach { - rootProject.extensions.configure(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension::class.java) { - download = true - downloadBaseUrl = "https://packages.jetbrains.team/files/p/krpc/build-deps/" - } - - tasks.named("kotlinNpmInstall").configure { - dependsOn(executeNpmLogin) - } -} - -// necessary for CI js tests -rootProject.plugins.withType { - rootProject.extensions.configure { - ignoreScripts = false - download = true - downloadBaseUrl = "https://packages.jetbrains.team/files/p/krpc/build-deps/" - } -} diff --git a/gradle-conventions-settings/build.gradle.kts b/gradle-conventions-settings/build.gradle.kts index f47d1dd2..fa7384e4 100644 --- a/gradle-conventions-settings/build.gradle.kts +++ b/gradle-conventions-settings/build.gradle.kts @@ -20,6 +20,7 @@ val isLatestKotlinVersion: Boolean by extra dependencies { api(libs.kotlin.gradle.plugin) api(libs.detekt.gradle.plugin) + api(libs.binary.compatibility.validator.gradle.plugin) if (isLatestKotlinVersion) { api(libs.kover.gradle.plugin) diff --git a/gradle-conventions-settings/src/main/kotlin/util/apiValidation.kt b/gradle-conventions-settings/src/main/kotlin/util/apiValidation.kt new file mode 100644 index 00000000..e2f68ed3 --- /dev/null +++ b/gradle-conventions-settings/src/main/kotlin/util/apiValidation.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +package util + +import kotlinx.validation.ApiValidationExtension +import org.gradle.api.Project +import org.gradle.kotlin.dsl.the + +fun Project.configureApiValidation() { + plugins.apply(libs.plugins.binary.compatibility.validator.get().pluginId) + + the().apply { + ignoredPackages.add("kotlinx.rpc.internal") + ignoredPackages.add("kotlinx.rpc.krpc.internal") + + ignoredProjects.addAll( + listOf( + "compiler-plugin-tests", + "krpc-test", + "utils", + ) + ) + + nonPublicMarkers.add("kotlinx.rpc.internal.utils.InternalRPCApi") + } +} diff --git a/gradle-conventions-settings/src/main/kotlin/util/npm.kt b/gradle-conventions-settings/src/main/kotlin/util/npm.kt new file mode 100644 index 00000000..5c1ee470 --- /dev/null +++ b/gradle-conventions-settings/src/main/kotlin/util/npm.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +package util + +import org.gradle.api.GradleException +import org.gradle.api.Project +import org.gradle.kotlin.dsl.* +import java.io.File + +fun Project.configureNpm() { + val executeNpmLogin by tasks.registering { + val registryUrl = "https://packages.jetbrains.team/npm/p/krpc/build-deps/" + + // To prevent leaking of credentials in VCS on dev machine use the build directory config file + val buildYarnConfigFile = File(project.rootDir, "build/js/.yarnrc") + val buildNpmConfigFile = File(project.rootDir, "build/js/.npmrc") + + val spacePassword: String? = getSpacePassword() + + doLast { + val outputYarnText = """ + registry: "$registryUrl" + """.trimIndent() + + var outputNpmText = """ + registry: "$registryUrl" + """.trimIndent() + + if (spacePassword != null) { + if (spacePassword.split(".").size != 3) { + throw GradleException("Unexpected Space Token format") + } + + outputNpmText += System.lineSeparator() + """ + always-auth: true + ${registryUrl.removePrefix("https:")}:_authToken=$spacePassword + """.trimIndent() + } + + buildYarnConfigFile.createNewFile() + buildYarnConfigFile.writeText(outputYarnText) + buildNpmConfigFile.createNewFile() + buildNpmConfigFile.writeText(outputNpmText) + } + + outputs.file(buildYarnConfigFile).withPropertyName("buildOutputYarnFile") + outputs.file(buildNpmConfigFile).withPropertyName("buildOutputNpmFile") + } + + plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin::class.java).configureEach { + rootProject.extensions.configure { + download = true + downloadBaseUrl = "https://packages.jetbrains.team/files/p/krpc/build-deps/" + } + + tasks.named("kotlinNpmInstall").configure { + dependsOn(executeNpmLogin) + } + } + + // necessary for CI js tests + rootProject.plugins.withType { + rootProject.extensions.configure { + ignoreScripts = false + download = true + downloadBaseUrl = "https://packages.jetbrains.team/files/p/krpc/build-deps/" + } + } +} diff --git a/gradle-conventions-settings/src/main/kotlin/util/projectReport.kt b/gradle-conventions-settings/src/main/kotlin/util/projectReport.kt new file mode 100644 index 00000000..16621b4b --- /dev/null +++ b/gradle-conventions-settings/src/main/kotlin/util/projectReport.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +package util + +import org.gradle.api.Project + +// useful for dependencies introspection +// run ./gradlew htmlDependencyReport +// Report can normally be found in build/reports/project/dependencies/index.html +fun Project.configureProjectReport() { + allprojects { + plugins.apply("project-report") + } +} diff --git a/versions-root/libs.versions.toml b/versions-root/libs.versions.toml index ca4f5341..112336e2 100644 --- a/versions-root/libs.versions.toml +++ b/versions-root/libs.versions.toml @@ -97,6 +97,7 @@ coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", ve coroutines-debug = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-debug", version.ref = "coroutines" } detekt-gradle-plugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt-gradle-plugin" } kover-gradle-plugin = { module = "org.jetbrains.kotlinx:kover-gradle-plugin", version.ref = "kover" } +binary-compatibility-validator-gradle-plugin = { module = "org.jetbrains.kotlinx:binary-compatibility-validator", version.ref = "binary-compatibility-validator" } kotlin-js-wrappers = { module = "org.jetbrains.kotlin-wrappers:kotlin-js", version.ref = "kotlin-wrappers" } gradle-kotlin-dsl-pluigns = { module = "org.gradle.kotlin:gradle-kotlin-dsl-plugins", version.ref = "gradle-kotlin-dsl" } intellij-util = { module = "com.jetbrains.intellij.platform:util", version.ref = "intellij" } @@ -124,6 +125,7 @@ conventions-kmp = { id = "conventions-kmp", version.ref = "kotlinx-rpc" } conventions-gradle-publish = { id = "conventions-gradle-publish", version.ref = "kotlinx-rpc" } conventions-kover = { id = "conventions-kover", version.ref = "kotlinx-rpc" } conventions-gradle-doctor = { id = "conventions-gradle-doctor", version.ref = "kotlinx-rpc" } +conventions-npm = { id = "conventions-npm", version.ref = "kotlinx-rpc" } compiler-specific-module = { id = "compiler-specific-module", version.ref = "kotlinx-rpc" } # gradle-plugin project