diff --git a/AndroidCompat/Config/build.gradle.kts b/AndroidCompat/Config/build.gradle.kts index e69de29b..dc1017af 100644 --- a/AndroidCompat/Config/build.gradle.kts +++ b/AndroidCompat/Config/build.gradle.kts @@ -0,0 +1,12 @@ +@Suppress("DSL_SCOPE_VIOLATION") +plugins { + id(libs.plugins.kotlin.jvm.get().pluginId) + id(libs.plugins.kotlin.serialization.get().pluginId) + id(libs.plugins.kotlinter.get().pluginId) +} + +dependencies { + // Shared + implementation(libs.bundles.shared) + testImplementation(libs.bundles.sharedTest) +} \ No newline at end of file diff --git a/AndroidCompat/build.gradle.kts b/AndroidCompat/build.gradle.kts index 15c66a7d..ef5f6c41 100644 --- a/AndroidCompat/build.gradle.kts +++ b/AndroidCompat/build.gradle.kts @@ -1,37 +1,39 @@ +@Suppress("DSL_SCOPE_VIOLATION") +plugins { + id(libs.plugins.kotlin.jvm.get().pluginId) + id(libs.plugins.kotlin.serialization.get().pluginId) + id(libs.plugins.kotlinter.get().pluginId) +} + dependencies { + // Shared + implementation(libs.bundles.shared) + testImplementation(libs.bundles.sharedTest) + // Android stub library - implementation("com.github.Suwayomi:android-jar:1.0.0") + implementation(libs.android.stubs) // XML - compileOnly("xmlpull:xmlpull:1.1.3.4a") + compileOnly(libs.xmlpull) // Config API - implementation(project(":AndroidCompat:Config")) + implementation(projects.androidCompat.config) // APK sig verifier - compileOnly("com.android.tools.build:apksig:7.2.1") + compileOnly(libs.apksig) // AndroidX annotations - compileOnly("androidx.annotation:annotation:1.5.0") + compileOnly(libs.android.annotations) // substitute for duktape-android - implementation("org.mozilla:rhino-runtime:1.7.14") // slimmer version of 'org.mozilla:rhino' - implementation("org.mozilla:rhino-engine:1.7.14") // provides the same interface as 'javax.script' a.k.a Nashorn + implementation(libs.bundles.rhino) // Kotlin wrapper around Java Preferences, makes certain things easier - val multiplatformSettingsVersion = "1.0.0-RC" - implementation("com.russhwolf:multiplatform-settings-jvm:$multiplatformSettingsVersion") - implementation("com.russhwolf:multiplatform-settings-serialization-jvm:$multiplatformSettingsVersion") + implementation(libs.bundles.settings) // Android version of SimpleDateFormat - implementation("com.ibm.icu:icu4j:72.1") + implementation(libs.icu4j) // OpenJDK lacks native JPEG encoder and native WEBP decoder - implementation("com.twelvemonkeys.common:common-lang:3.9.4") - implementation("com.twelvemonkeys.common:common-io:3.9.4") - implementation("com.twelvemonkeys.common:common-image:3.9.4") - implementation("com.twelvemonkeys.imageio:imageio-core:3.9.4") - implementation("com.twelvemonkeys.imageio:imageio-metadata:3.9.4") - implementation("com.twelvemonkeys.imageio:imageio-jpeg:3.4.1") - implementation("com.twelvemonkeys.imageio:imageio-webp:3.9.4") + implementation(libs.bundles.twelvemonkeys) } diff --git a/build.gradle.kts b/build.gradle.kts index 162af533..93a920ea 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,13 +1,14 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile import org.jmailen.gradle.kotlinter.tasks.FormatTask import org.jmailen.gradle.kotlinter.tasks.LintTask +@Suppress("DSL_SCOPE_VIOLATION") plugins { - kotlin("jvm") version kotlinVersion - kotlin("plugin.serialization") version kotlinVersion - id("org.jmailen.kotlinter") version "3.12.0" - id("com.github.gmazzo.buildconfig") version "3.1.0" apply false - id("de.undercouch.download") version "5.3.0" + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.kotlinter) + alias(libs.plugins.buildconfig) apply false + alias(libs.plugins.download) } allprojects { @@ -23,25 +24,17 @@ allprojects { } } -val projects = listOf( - project(":AndroidCompat"), - project(":AndroidCompat:Config"), - project(":server") -) - -configure(projects) { - apply(plugin = "org.jetbrains.kotlin.jvm") - apply(plugin = "org.jetbrains.kotlin.plugin.serialization") - apply(plugin = "org.jmailen.kotlinter") - - java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 +subprojects { + plugins.withType { + extensions.configure { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } } tasks { - withType { - dependsOn(formatKotlin) + withType { + dependsOn("formatKotlin") kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } @@ -55,58 +48,4 @@ configure(projects) { source(files("src/kotlin")) } } - - - dependencies { - // Kotlin - implementation(kotlin("stdlib-jdk8")) - implementation(kotlin("reflect")) - testImplementation(kotlin("test-junit5")) - - // coroutines - val coroutinesVersion = "1.6.4" - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$coroutinesVersion") - testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion") - - val kotlinSerializationVersion = "1.4.1" - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinSerializationVersion") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$kotlinSerializationVersion") - - // Dependency Injection - implementation("org.kodein.di:kodein-di-conf-jvm:7.15.0") - - // Logging - // Stuck on old versions since - // 1. Logback 1.3.0+ requires Java 9 - // 2. Slf4j 2.0.0+ doesn't register older versions of Logback - // 3. Kotlin-logging 3.0.2+ requires Java 11, but this is probably a bug - implementation("org.slf4j:slf4j-api:1.7.32") - implementation("ch.qos.logback:logback-classic:1.2.6") - implementation("io.github.microutils:kotlin-logging:2.1.21") - - // ReactiveX - implementation("io.reactivex:rxjava:1.3.8") - - // dependency both in AndroidCompat and extensions, version locked by Tachiyomi app/extensions - implementation("org.jsoup:jsoup:1.15.3") - - // dependency of :AndroidCompat:Config - implementation("com.typesafe:config:1.4.2") - implementation("io.github.config4k:config4k:0.5.0") - - // to get application content root - implementation("net.harawata:appdirs:1.2.1") - - // dex2jar - val dex2jarVersion = "v56" - implementation("com.github.ThexXTURBOXx.dex2jar:dex-translator:$dex2jarVersion") - implementation("com.github.ThexXTURBOXx.dex2jar:dex-tools:$dex2jarVersion") - - // APK parser - implementation("net.dongliu:apk-parser:2.6.10") - - // dependency both in AndroidCompat and server, version locked by javalin - implementation("com.fasterxml.jackson.core:jackson-annotations:2.12.4") - } } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Constants.kt b/buildSrc/src/main/kotlin/Constants.kt index ec4978a8..b2580030 100644 --- a/buildSrc/src/main/kotlin/Constants.kt +++ b/buildSrc/src/main/kotlin/Constants.kt @@ -7,8 +7,6 @@ import java.io.BufferedReader * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -const val kotlinVersion = "1.7.20" - const val MainClass = "suwayomi.tachidesk.MainKt" // should be bumped with each stable release diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..42f209bd --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,217 @@ +[versions] +kotlin = "1.7.20" +coroutines = "1.6.4" +serialization = "1.4.1" +okhttp = "4.10.0" # Major version is locked by Tachiyomi extensions +javalin = "4.6.6" # Javalin 5.0.0+ requires Java 11 +jackson = "2.13.3" # jackson version locked by javalin, ref: `io.javalin.core.util.OptionalDependency` +exposed = "0.40.1" +dex2jar = "v56" +rhino = "1.7.14" +settings = "1.0.0-RC" +twelvemonkeys = "3.9.4" + +[libraries] +# Kotlin +kotlin-stdlib-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } +kotlin-test-junit5 = { module = "org.jetbrains.kotlin:kotlin-test-junit5", version.ref = "kotlin" } + +# Coroutines +coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } +coroutines-jdk8 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8", version.ref = "coroutines" } +coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } + +# Serialization +serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" } +serialization-protobuf = { module = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf", version.ref = "serialization" } + +# Logging +# Stuck on old versions since +# 1. Logback 1.3.0+ requires Java 9 +# 2. Slf4j 2.0.0+ doesn't register older versions of Logback +# 3. Kotlin-logging 3.0.2+ requires Java 11, but this is probably a bug +slf4japi = "org.slf4j:slf4j-api:1.7.32" +logback = "ch.qos.logback:logback-classic:1.2.6" +kotlinlogging = "io.github.microutils:kotlin-logging:2.1.21" + +# OkHttp +okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } +okhttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" } +okhttp-dnsoverhttps = { module = "com.squareup.okhttp3:okhttp-dnsoverhttps", version.ref = "okhttp" } +okio = "com.squareup.okio:okio:3.2.0" + +# Javalin api +javalin-core = { module = "io.javalin:javalin", version.ref = "javalin" } +javalin-openapi = { module = "io.javalin:javalin-openapi", version.ref = "javalin" } +jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jackson" } +jackson-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" } +jackson-annotations = { module = "com.fasterxml.jackson.core:jackson-annotations", version.ref = "jackson" } + +# Exposed ORM +exposed-core = { module = "org.jetbrains.exposed:exposed-core", version.ref = "exposed" } +exposed-dao = { module = "org.jetbrains.exposed:exposed-dao", version.ref = "exposed" } +exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc", version.ref = "exposed" } +exposed-javatime = { module = "org.jetbrains.exposed:exposed-java-time", version.ref = "exposed" } +h2 = "com.h2database:h2:1.4.200" # current database driver, can't update to h2 v2 without sql migration + +# Exposed Migrations +exposed-migrations = "com.github.Suwayomi:exposed-migrations:3.2.0" + +# Dependency Injection +kodein = "org.kodein.di:kodein-di-conf-jvm:7.15.0" + +# tray icon +systemtray-core = "com.dorkbox:SystemTray:4.1" +systemtray-utils = "com.dorkbox:Utilities:1.9" # version locked by SystemTray + +# dependencies of Tachiyomi extensions +injekt = "com.github.inorichi.injekt:injekt-core:65b0440" +rxjava = "io.reactivex:rxjava:1.3.8" +jsoup = "org.jsoup:jsoup:1.15.3" + +# Config +config = "com.typesafe:config:1.4.2" +config4k = "io.github.config4k:config4k:0.5.0" + +# Sort +sort = "com.github.gpanther:java-nat-sort:natural-comparator-1.1" + +# Android stub library +android-stubs = "com.github.Suwayomi:android-jar:1.0.0" + +# Asm modificiation +asm = "org.ow2.asm:asm:9.4" # version locked by Dex2Jar +dex2jar-translator = { module = "com.github.ThexXTURBOXx.dex2jar:dex-translator", version.ref = "dex2jar" } +dex2jar-tools = { module = "com.github.ThexXTURBOXx.dex2jar:dex-tools", version.ref = "dex2jar" } + +# APK +apk-parser = "net.dongliu:apk-parser:2.6.10" +apksig = "com.android.tools.build:apksig:7.2.1" + +# Xml +xmlpull = "xmlpull:xmlpull:1.1.3.4a" + +# Disk & File +appdirs = "net.harawata:appdirs:1.2.1" +zip4j = "net.lingala.zip4j:zip4j:2.11.2" +junrar = "com.github.junrar:junrar:7.5.3" + +# CloudflareInterceptor +playwright = "com.microsoft.playwright:playwright:1.28.0" + +# AES/CBC/PKCS7Padding Cypher provider +bouncycastle = "org.bouncycastle:bcprov-jdk18on:1.72" + +# AndroidX annotations +android-annotations = "androidx.annotation:annotation:1.5.0" + +# Substitute for duktape-android +rhino-runtime = { module = "org.mozilla:rhino-runtime", version.ref = "rhino" } # slimmer version of 'org.mozilla:rhino' +rhino-engine = { module = "org.mozilla:rhino-engine", version.ref = "rhino" } # provides the same interface as 'javax.script' a.k.a Nashorn + +# Settings +settings-core = { module = "com.russhwolf:multiplatform-settings-jvm", version.ref = "settings" } +settings-serialization = { module = "com.russhwolf:multiplatform-settings-serialization-jvm", version.ref = "settings" } + +# ICU4J +icu4j = "com.ibm.icu:icu4j:72.1" + +# Image Decoding implementation provider +twelvemonkeys-common-lang = { module = "com.twelvemonkeys.common:common-lang", version.ref = "twelvemonkeys" } +twelvemonkeys-common-io = { module = "com.twelvemonkeys.common:common-io", version.ref = "twelvemonkeys" } +twelvemonkeys-common-image = { module = "com.twelvemonkeys.common:common-image", version.ref = "twelvemonkeys" } +twelvemonkeys-imageio-core = { module = "com.twelvemonkeys.imageio:imageio-core", version.ref = "twelvemonkeys" } +twelvemonkeys-imageio-metadata = { module = "com.twelvemonkeys.imageio:imageio-metadata", version.ref = "twelvemonkeys" } +twelvemonkeys-imageio-jpeg = { module = "com.twelvemonkeys.imageio:imageio-jpeg", version.ref = "twelvemonkeys" } +twelvemonkeys-imageio-webp = { module = "com.twelvemonkeys.imageio:imageio-webp", version.ref = "twelvemonkeys" } + +# Testing +mockk = "io.mockk:mockk:1.13.2" + +[plugins] +# Kotlin +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin"} +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin"} + +# Linter +kotlinter = { id = "org.jmailen.kotlinter", version = "3.12.0"} + +# Build config +buildconfig = { id = "com.github.gmazzo.buildconfig", version = "3.1.0"} + +# Download +download = { id = "de.undercouch.download", version = "5.3.0"} + +# ShadowJar +shadowjar = { id = "com.github.johnrengelman.shadow", version = "7.1.2"} + +[bundles] +shared = [ + "kotlin-stdlib-jdk8", + "kotlin-reflect", + "coroutines-core", + "coroutines-jdk8", + "serialization-json", + "serialization-protobuf", + "kodein", + "slf4japi", + "logback", + "kotlinlogging", + "appdirs", + "rxjava", + "jsoup", + "config", + "config4k", + "dex2jar-translator", + "dex2jar-tools", + "apk-parser", + "jackson-annotations" +] + +sharedTest = [ + "kotlin-test-junit5", + "coroutines-test", +] + +okhttp = [ + "okhttp-core", + "okhttp-logging", + "okhttp-dnsoverhttps", +] +javalin = [ + "javalin-core", + "javalin-openapi", +] +jackson = [ + "jackson-databind", + "jackson-kotlin", + "jackson-annotations", +] +exposed = [ + "exposed-core", + "exposed-dao", + "exposed-jdbc", + "exposed-javatime", +] +systemtray = [ + "systemtray-core", + "systemtray-utils", +] +rhino = [ + "rhino-runtime", + "rhino-engine", +] +settings = [ + "settings-core", + "settings-serialization", +] +twelvemonkeys = [ + "twelvemonkeys-common-lang", + "twelvemonkeys-common-io", + "twelvemonkeys-common-image", + "twelvemonkeys-imageio-core", + "twelvemonkeys-imageio-metadata", + "twelvemonkeys-imageio-jpeg", + "twelvemonkeys-imageio-webp", +] \ No newline at end of file diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 3c568de7..57f3ffbb 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -1,80 +1,70 @@ import de.undercouch.gradle.tasks.download.Download import java.time.Instant +@Suppress("DSL_SCOPE_VIOLATION") plugins { + id(libs.plugins.kotlin.jvm.get().pluginId) + id(libs.plugins.kotlin.serialization.get().pluginId) + id(libs.plugins.kotlinter.get().pluginId) application - id("com.github.johnrengelman.shadow") version "7.1.2" - id("com.github.gmazzo.buildconfig") + alias(libs.plugins.shadowjar) + id(libs.plugins.buildconfig.get().pluginId) } dependencies { - // okhttp - val okhttpVersion = "4.10.0" // Major version is locked by Tachiyomi extensions - implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") - implementation("com.squareup.okhttp3:logging-interceptor:$okhttpVersion") - implementation("com.squareup.okhttp3:okhttp-dnsoverhttps:$okhttpVersion") - implementation("com.squareup.okio:okio:3.2.0") + // Shared + implementation(libs.bundles.shared) + testImplementation(libs.bundles.sharedTest) + + // OkHttp + implementation(libs.bundles.okhttp) + implementation(libs.okio) // Javalin api - // Javalin 5.0.0+ requires Java 11 - implementation("io.javalin:javalin:4.6.6") - implementation("io.javalin:javalin-openapi:4.6.6") - // jackson version locked by javalin, ref: `io.javalin.core.util.OptionalDependency` - val jacksonVersion = "2.13.3" - implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") - implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion") + implementation(libs.bundles.javalin) + implementation(libs.bundles.jackson) // Exposed ORM - val exposedVersion = "0.40.1" - implementation("org.jetbrains.exposed:exposed-core:$exposedVersion") - implementation("org.jetbrains.exposed:exposed-dao:$exposedVersion") - implementation("org.jetbrains.exposed:exposed-jdbc:$exposedVersion") - implementation("org.jetbrains.exposed:exposed-java-time:$exposedVersion") - // current database driver, can't update to h2 v2 without sql migration - implementation("com.h2database:h2:1.4.200") + implementation(libs.bundles.exposed) + implementation(libs.h2) // Exposed Migrations - implementation("com.github.Suwayomi:exposed-migrations:3.2.0") + implementation(libs.exposed.migrations) // tray icon - implementation("com.dorkbox:SystemTray:4.1") - implementation("com.dorkbox:Utilities:1.9") // version locked by SystemTray + implementation(libs.bundles.systemtray) // dependencies of Tachiyomi extensions, some are duplicate, keeping it here for reference - implementation("com.github.inorichi.injekt:injekt-core:65b0440") - implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") - implementation("io.reactivex:rxjava:1.3.8") - implementation("org.jsoup:jsoup:1.15.3") + implementation(libs.injekt) + implementation(libs.okhttp.core) + implementation(libs.rxjava) + implementation(libs.jsoup) // Sort - implementation("com.github.gpanther:java-nat-sort:natural-comparator-1.1") + implementation(libs.sort) // asm for ByteCodeEditor(fixing SimpleDateFormat) (must match Dex2Jar version) - implementation("org.ow2.asm:asm:9.4") + implementation(libs.asm) // Disk & File - implementation("net.lingala.zip4j:zip4j:2.11.2") - implementation("com.github.junrar:junrar:7.5.3") + implementation(libs.zip4j) + implementation(libs.junrar) // CloudflareInterceptor - implementation("com.microsoft.playwright:playwright:1.28.0") + implementation(libs.playwright) // AES/CBC/PKCS7Padding Cypher provider for zh.copymanga - implementation("org.bouncycastle:bcprov-jdk18on:1.72") - - // Source models and interfaces from Tachiyomi 1.x - // using source class from tachiyomi commit 9493577de27c40ce8b2b6122cc447d025e34c477 to not depend on tachiyomi.sourceapi -// implementation("tachiyomi.sourceapi:source-api:1.1") + implementation(libs.bouncycastle) // AndroidCompat - implementation(project(":AndroidCompat")) - implementation(project(":AndroidCompat:Config")) + implementation(projects.androidCompat) + implementation(projects.androidCompat.config) // uncomment to test extensions directly // implementation(fileTree("lib/")) implementation(kotlin("script-runtime")) - testImplementation("io.mockk:mockk:1.13.2") + testImplementation(libs.mockk) } application { diff --git a/settings.gradle.kts b/settings.gradle.kts index 2d1eb2d5..d839d3b7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,4 +3,6 @@ rootProject.name = System.getenv("ProductName") ?: "Tachidesk-Server" include("server") include("AndroidCompat") -include("AndroidCompat:Config") \ No newline at end of file +include("AndroidCompat:Config") + +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") \ No newline at end of file