diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c45f7a..581f827 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,14 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added -- Coroutine tests as default dependency for tests -- Context receiver flag ### Changed -- Separate release tasks for each target -- Kotlin 1.6.20 -- Context receivers enabled -- Ktor 2.0 ### Deprecated @@ -22,33 +16,56 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +### Security + +## [0.11.5-kotlin-1.7.0] +### Added +- Coroutine tests as default dependency for tests +- Context receiver flag + + +### Changed +- Separate release tasks for each target +- Kotlin 1.7.0 +- Ktor 2.0.1 +- ExplicitAPI does not override existing value + + +### Deprecated + +### Removed +- Ktor specific artifacts from version catalog + + +### Fixed +- Moved signing out of sonatype block + + ### Security ## [0.11.1-kotlin-1.6.10] ### Added - Default templates for README and ARTIFACT + ### Changed - Replaced Groovy templates by FreeMarker -### Deprecated - -### Removed ### Fixed - JS publication sources jar -### Security - ## [0.10.9-kotlin-1.6.10] ### Added - html builders for readme + ### Changed - Kotlin 1.6.0 - Use indy lambdas by default #32 - Change version scheme to `-kotlin-` + ### Fixed - remove `nativeMain` dependency from `nativeTest` @@ -56,6 +73,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Kotlin 1.6 + ### Fixed - Some issues with opt-ins @@ -63,9 +81,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Experimental automatic JS project bundling in MPP + ### Changed - Remove vcs requirement for Space publication + ### Fixed -Release task (#19) @@ -75,10 +95,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - BOM for kotlin-wrappers on JS - Jupyter loader + ### Changed - API validation disabled for dev versions - Kotlin plugins are propagated downstream + ### Removed - bson support @@ -87,15 +109,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Disable API validation for snapshots - `-Xjvm-default=all` on JVM + ### Changed - `publication.platform` changed to `publishing.platform` - Dokka version to `1.4.30` - `useDateTime` in extension - Kotlin 1.5 + ### Removed - Publish plugin. Use MavenPublish instead + ### Fixed - Removed unnecessary `afterEvaluate` for compatibility with gradle 7.0 @@ -103,13 +128,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Skip sonatype publishing for dev versions + ### Changed - Publishing repositories are explicit and defined in the top level project - Paths to publishing properties now use dot notation like `publishing.github.user` + ### Deprecated - Publishing plugin + ### Removed - Bintray publishing @@ -118,10 +146,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Adaptive support for host OS in native - CSS support for JS targets + ### Changed - Kotlin 1.4.31 - Coroutines 1.4.3 + ### Fixed - Plugin loading order for publishing - Release task @@ -133,6 +163,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add sonatype publishing - Per-platform release publishing + ### Changed - Kotlin to 1.4.30 stable. - Added intermediate jsCommon main/test sourcesSet for node plugin. @@ -140,9 +171,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Common plugin id changed to `common` - Plugins group changed to `ru.mipt.npm` with `gradle` prefix + ### Removed - kaml + ### Fixed - Fix publishing load order for sonatype - Fix root project readme @@ -156,6 +189,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Moved all logic to a common plugin, leaving only proxies for platform plugins - Suppress API validation for modules with maturity below DEVELOPMENT + ### Changed - Remove node plugin. Node binaries should be turned on manually. - Use default webpack distribution path. @@ -166,10 +200,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Moved internals to internals - Kotlin 1.4.30-RC + ### Deprecated - Support of `kaml` and `snake-yaml` in favor of `yamlKt` - Publish plugin + ### Removed - `useDokka` method. Documentation jar should be added manually if needed. @@ -180,6 +216,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `application()` toggle in plugin configuration to produce binaries on JS and applicaion plugin on jvm. - Add `publish` to expose publishing configuration. + ### Changed -Publishing in bintray now is automatic. diff --git a/build.gradle.kts b/build.gradle.kts index 61dc866..389ecc3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.changelog) alias(libs.plugins.dokka) + alias(libs.plugins.kotlin.jvm) `java-gradle-plugin` `kotlin-dsl` `maven-publish` diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 98a51c7..83ff673 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,24 +1,23 @@ [versions] -tools = "0.11.3-kotlin-1.6.20" -kotlin = "1.6.20" -atomicfu = "0.17.1" -binary-compatibility-validator = "0.8.0" +tools = "0.11.5-kotlin-1.7.0" +kotlin = "1.7.0" +atomicfu = "0.17.3" +binary-compatibility-validator = "0.9.0" changelog = "1.3.1" -dokka = "1.6.10" -kotlin-jupyter = "0.11.0-71" +dokka = "1.6.21" +kotlin-jupyter = "0.11.0-106" kotlinx-benchmark = "0.4.2" kotlinx-cli = "0.3.4" -kotlinx-collections-immutable = "0.3.5" -kotlinx-coroutines = "1.6.1" -kotlinx-datetime = "0.3.2" -kotlinx-html = "0.7.3" -kotlinx-knit = "0.3.0" +kotlinx-coroutines = "1.6.2" +kotlinx-datetime = "0.3.3" +kotlinx-html = "0.7.5" +kotlinx-knit = "0.4.0" kotlinx-nodejs = "0.0.7" -kotlinx-serialization = "1.3.2" -ktor = "2.0.0" -xmlutil = "0.84.1" -yamlkt = "0.10.2" -jsBom = "0.0.1-pre.313-kotlin-1.6.10" +kotlinx-serialization = "1.3.3" +ktor = "2.0.2" +xmlutil = "0.84.2" +yamlkt = "0.11.0" +jsBom = "1.0.0-pre.343" junit = "5.8.2" [libraries] @@ -38,8 +37,6 @@ kotlin-jupyter-gradle = { module = "org.jetbrains.kotlin:kotlin-jupyter-api-grad kotlinx-benchmark-runtime = { module = "org.jetbrains.kotlinx:kotlinx-benchmark-runtime", version.ref = "kotlinx-benchmark" } -kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinx-collections-immutable" } - kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" } kotlinx-coroutines-debug = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-debug", version.ref = "kotlinx-coroutines" } @@ -73,60 +70,6 @@ kotlinx-serialization-protobuf = { module = "org.jetbrains.kotlinx:kotlinx-seria kotlinx-serialization-properties = { module = "org.jetbrains.kotlinx:kotlinx-serialization-properties", version.ref = "kotlinx-serialization" } ktor-bom = { module = "io.ktor:ktor-bom", version.ref = "ktor" } -ktor-client-android = { module = "io.ktor:ktor-client-android", version.ref = "ktor" } -ktor-client-apache = { module = "io.ktor:ktor-client-apache", version.ref = "ktor" } -ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" } -ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } -ktor-client-curl = { module = "io.ktor:ktor-client-curl", version.ref = "ktor" } -ktor-client-auth-basic = { module = "io.ktor:ktor-client-auth-basic", version.ref = "ktor" } -ktor-client-auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" } -ktor-client-encoding = { module = "io.ktor:ktor-client-encoding", version.ref = "ktor" } -ktor-client-json = { module = "io.ktor:ktor-client-json", version.ref = "ktor" } -ktor-client-gson = { module = "io.ktor:ktor-client-gson", version.ref = "ktor" } -ktor-client-jackson = { module = "io.ktor:ktor-client-jackson", version.ref = "ktor" } -ktor-client-serialization = { module = "io.ktor:ktor-client-serialization", version.ref = "ktor" } -ktor-client-logging = { module = "io.ktor:ktor-client-loggin", version.ref = "ktor" } -ktor-client-tracing = { module = "io.ktor:ktor-client-tracing", version.ref = "ktor" } -ktor-client-websockets = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor" } -ktor-client-java = { module = "io.ktor:ktor-client-java", version.ref = "ktor" } -ktor-client-jetty = { module = "io.ktor:ktor-client-jetty", version.ref = "ktor" } -ktor-client-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" } -ktor-client-mock = { module = "io.ktor:ktor-client-mock", version.ref = "ktor" } -ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } -ktor-auth-jwt = { module = "io.ktor:ktor-auth-jwt", version.ref = "ktor" } -ktor-auth-ldap = { module = "io.ktor:ktor-auth-ldap", version.ref = "ktor" } -ktor-auth = { module = "io.ktor:ktor-auth", version.ref = "ktor" } -ktor-freemaker = { module = "io.ktor:ktor-freemaker", version.ref = "ktor" } -ktor-gson = { module = "io.ktor:ktor-gson", version.ref = "ktor" } -ktor-html-builder = { module = "io.ktor:ktor-html-builder", version.ref = "ktor" } -ktor-jackson = { module = "io.ktor:ktor-jackson", version.ref = "ktor" } -ktor-locations = { module = "io.ktor:ktor-locations", version.ref = "ktor" } -ktor-metrics-micrometer = { module = "io.ktor:ktor-metrics-micrometer", version.ref = "ktor" } -ktor-metrics = { module = "io.ktor:ktor-metrics", version.ref = "ktor" } -ktor-mustache = { module = "io.ktor:ktor-mustache", version.ref = "ktor" } -ktor-pebble = { module = "io.ktor:ktor-pebble", version.ref = "ktor" } -ktor-serialization = { module = "io.ktor:ktor-serialization", version.ref = "ktor" } -ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = "ktor" } -ktor-thymeleaf = { module = "io.ktor:ktor-thymeleaf", version.ref = "ktor" } -ktor-velocity = { module = "io.ktor:ktor-velocity", version.ref = "ktor" } -ktor-webjars = { module = "io.ktor:ktor-webjars", version.ref = "ktor" } -ktor-websockets = { module = "io.ktor:ktor-websockets", version.ref = "ktor" } -ktor-http = { module = "io.ktor:ktor-http", version.ref = "ktor" } -ktor-http-cio = { module = "io.ktor:ktor-http-cio", version.ref = "ktor" } -ktor-io = { module = "io.ktor:ktor-io", version.ref = "ktor" } -ktor-network = { module = "io.ktor:ktor-network", version.ref = "ktor" } -ktor-network-tls = { module = "io.ktor:ktor-network-tls", version.ref = "ktor" } -ktor-network-tls-certificates = { module = "io.ktor:ktor-network-tls-certificates", version.ref = "ktor" } -ktor-server-cio = { module = "io.ktor:ktor-server-cio", version.ref = "ktor" } -ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktor" } -ktor-server-host-common = { module = "io.ktor:ktor-server-host-common", version.ref = "ktor" } -ktor-server-jetty = { module = "io.ktor:ktor-server-jetty", version.ref = "ktor" } -ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" } -ktor-server-servlet = { module = "io.ktor:ktor-server-servlet", version.ref = "ktor" } -ktor-server-test-host = { module = "io.ktor:ktor-server-test-host", version.ref = "ktor" } -ktor-server-tomcat = { module = "io.ktor:ktor-server-tomcat", version.ref = "ktor" } -ktor-test-dispatcher = { module = "io.ktor:ktor-test-dispatcher", version.ref = "ktor" } -ktor-utils = { module = "io.ktor:ktor-utils", version.ref = "ktor" } xmlutil-core = { module = "io.github.pdvrieze.xmlutil:core", version.ref = "xmlutil" } xmlutil-ktor = { module = "io.github.pdvrieze.xmlutil:ktor", version.ref = "xmlutil" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 00e33ed..aa991fc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/kotlin/ru/mipt/npm/gradle/KScienceCommonPlugin.kt b/src/main/kotlin/ru/mipt/npm/gradle/KScienceCommonPlugin.kt index 51b22fc..0db1539 100644 --- a/src/main/kotlin/ru/mipt/npm/gradle/KScienceCommonPlugin.kt +++ b/src/main/kotlin/ru/mipt/npm/gradle/KScienceCommonPlugin.kt @@ -3,9 +3,8 @@ package ru.mipt.npm.gradle import org.gradle.api.Plugin import org.gradle.api.Project -@Suppress("UNUSED_VARIABLE") public open class KScienceCommonPlugin : Plugin { override fun apply(project: Project): Unit = project.configureKScience( - KotlinVersion(1, 6, 10) + KotlinVersion(1, 7, 0) ) } diff --git a/src/main/kotlin/ru/mipt/npm/gradle/commonConfigurations.kt b/src/main/kotlin/ru/mipt/npm/gradle/commonConfigurations.kt index 433e462..b94d86d 100644 --- a/src/main/kotlin/ru/mipt/npm/gradle/commonConfigurations.kt +++ b/src/main/kotlin/ru/mipt/npm/gradle/commonConfigurations.kt @@ -7,19 +7,19 @@ import org.gradle.api.tasks.testing.Test import org.gradle.kotlin.dsl.* import org.jetbrains.dokka.gradle.DokkaPlugin import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension -import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import ru.mipt.npm.gradle.internal.applyRepos import ru.mipt.npm.gradle.internal.applySettings import ru.mipt.npm.gradle.internal.fromJsDependencies -private val defaultJvmArgs: List = listOf("-Xjvm-default=all", "-Xlambdas=indy", "-Xcontext-receivers") +private val defaultJvmArgs: List = listOf("-Xjvm-default=all", "-Xlambdas=indy") public fun Project.configureKScience( - kotlinVersion: KotlinVersion -){ + kotlinVersion: KotlinVersion, +) { //Common configuration registerKScienceExtension() repositories.applyRepos() @@ -28,8 +28,6 @@ public fun Project.configureKScience( pluginManager.withPlugin("org.jetbrains.kotlin.jvm") { //logger.info("Applying KScience configuration for JVM project") configure { - explicitApiWarning() - sourceSets.all { languageSettings.applySettings(kotlinVersion) } @@ -41,8 +39,10 @@ public fun Project.configureKScience( implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${KScienceVersions.coroutinesVersion}") } } + + if (explicitApi == null) explicitApiWarning() } - tasks.withType { + tasks.withType { kotlinOptions { jvmTarget = KScienceVersions.JVM_TARGET.toString() freeCompilerArgs = freeCompilerArgs + defaultJvmArgs @@ -61,8 +61,6 @@ public fun Project.configureKScience( pluginManager.withPlugin("org.jetbrains.kotlin.js") { //logger.info("Applying KScience configuration for JS project") configure { - explicitApiWarning() - js(IR) { browser { commonWebpackConfig { @@ -87,6 +85,8 @@ public fun Project.configureKScience( implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${KScienceVersions.coroutinesVersion}") } } + + if (explicitApi == null) explicitApiWarning() } (tasks.findByName("processResources") as? Copy)?.apply { @@ -97,8 +97,6 @@ public fun Project.configureKScience( pluginManager.withPlugin("org.jetbrains.kotlin.multiplatform") { configure { - explicitApiWarning() - jvm { compilations.all { kotlinOptions { @@ -159,6 +157,8 @@ public fun Project.configureKScience( tasks.withType { useJUnitPlatform() } + + if (explicitApi == null) explicitApiWarning() } } diff --git a/src/main/kotlin/ru/mipt/npm/gradle/internal/publishing.kt b/src/main/kotlin/ru/mipt/npm/gradle/internal/publishing.kt index 921631d..2b6e6b6 100644 --- a/src/main/kotlin/ru/mipt/npm/gradle/internal/publishing.kt +++ b/src/main/kotlin/ru/mipt/npm/gradle/internal/publishing.kt @@ -10,6 +10,7 @@ import org.gradle.plugins.signing.SigningExtension import org.gradle.plugins.signing.SigningPlugin import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.targets internal fun Project.requestPropertyOrNull(propertyName: String): String? = findProperty(propertyName) as? String ?: System.getenv(propertyName) @@ -31,12 +32,15 @@ internal fun Project.setupPublication(mavenPomConfiguration: MavenPom.() -> Unit from(it.kotlin) } } - publications.create("js") { - kotlin.js().components.forEach { - from(it) - } - artifact(sourcesJar) + afterEvaluate { + publications.create("js") { + kotlin.targets.flatMap { it.components }.forEach { + from(it) + } + + artifact(sourcesJar) + } } } @@ -51,12 +55,14 @@ internal fun Project.setupPublication(mavenPomConfiguration: MavenPom.() -> Unit } } - publications.create("jvm") { - kotlin.target.components.forEach { - from(it) - } + afterEvaluate { + publications.create("jvm") { + kotlin.target.components.forEach { + from(it) + } - artifact(sourcesJar) + artifact(sourcesJar) + } } } @@ -98,6 +104,23 @@ internal fun Project.setupPublication(mavenPomConfiguration: MavenPom.() -> Unit mavenPomConfiguration() } } + + + if (!plugins.hasPlugin("signing")) { + apply() + } + + extensions.configure("signing") { + val signingId: String? = requestPropertyOrNull("publishing.signing.id") + if (!signingId.isNullOrBlank()) { + val signingKey: String = requestProperty("publishing.signing.key") + val signingPassphrase: String = requestProperty("publishing.signing.passPhrase") + + // if key is provided, use it + useInMemoryPgpKeys(signingId, signingKey, signingPassphrase) + } // else use file signing + sign(publications) + } } } } @@ -194,22 +217,6 @@ internal fun Project.addSonatypePublishing() { allprojects { plugins.withId("maven-publish") { configure { - if (!plugins.hasPlugin("signing")) { - apply() - } - - extensions.configure("signing") { - val signingId: String? = requestPropertyOrNull("publishing.signing.id") - if (!signingId.isNullOrBlank()) { - val signingKey: String = requestProperty("publishing.signing.key") - val signingPassphrase: String = requestProperty("publishing.signing.passPhrase") - - // if key is provided, use it - useInMemoryPgpKeys(signingId, signingKey, signingPassphrase) - } // else use file signing - sign(publications) - } - repositories.maven { val sonatypeRepo = "https://oss.sonatype.org/service/local/staging/deploy/maven2" name = "sonatype"