meldestelle/gradle/libs.versions.toml
Stefan Mogeritsch 8726129b96 feat(core+frontend): add P2P sync infrastructure with WebSocket support
- **Core Updates:**
  - Implemented `P2pSyncService` interface with platform-specific WebSocket implementations (`JvmP2pSyncService` and no-op for JS).
  - Developed `SyncEvent` sealed class hierarchy to handle peer synchronization events (e.g., `PingEvent`, `PongEvent`, `DataChangedEvent`, etc.).

- **Frontend Integration:**
  - Introduced `SyncManager` to manage peer discovery and synchronization, coupled with `NetworkDiscoveryService`.
  - Updated dependency injection to include `syncModule` for platform-specific sync service initialization.
  - Enhanced `BewerbViewModel` to support new sync capabilities, including observing sync events and UI updates for connected peers.

- **Backend Enhancements:**
  - Added ZNS-specific fields (`zns_nummer`, `zns_abteilung`) to Bewerb table for idempotent imports.
  - Introduced import ZNS logic to handle duplicates and align with SyncManager updates.

- **UI Improvements:**
  - Enhanced `TurnierBewerbeTab` with updated dialogs (ZNS imports, sync status) and dynamic previews.
  - Improved network syncing feedback and error handling in frontend components.

- **DB Changes:**
  - Added migration for new column fields in the Bewerb table with relevant indexing for ZNS import optimizations.
2026-04-10 10:55:00 +02:00

420 lines
21 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# This file is the SINGLE SOURCE OF TRUTH for all project dependencies.
# Organized by Domain: Frontend (KMP) vs. Backend (Spring/JVM)
# Last updated: 2026-02-03
[versions]
# ==============================================================================
# === FRONTEND & KMP CORE ===
# ==============================================================================
# Kotlin & Tooling
kotlin = "2.3.20"
ksp = "2.3.4"
# KotlinX (Core Libraries)
kotlinx-coroutines = "1.10.2"
kotlinx-serialization-json = "1.9.0"
kotlinx-datetime = "0.7.1"
# UI: Compose Multiplatform
# Aligned with Kotlin 2.3.0
composeMultiplatform = "1.11.0-alpha04"
composeHotReload = "1.0.0"
androidx-lifecycle = "2.9.6"
uiDesktop = "1.7.0"
# Network: Ktor (Client & Server)
# Align with Kotlin 2.3.0 upgrade to 3.4.0 (runtime OpenAPI + lifecycle improvements)
ktor = "3.4.1"
# Dependency Injection
koin = "4.1.1"
koinCompose = "4.1.1"
# Local Persistence (Frontend)
# Room removed in favor of SQLDelight for JS/Wasm support
sqldelight = "2.2.1"
sqlite = "2.6.2"
# Web Tooling (NPM)
copyWebpackPlugin = "11.0.0"
sqliteWasm = "3.51.1-build2"
# ==============================================================================
# === BACKEND & INFRASTRUCTURE ===
# ==============================================================================
# Spring Ecosystem
springBoot = "3.5.9"
# Downgraded from 2025.1.0 (Oakwood) to 2025.0.1 (Northfields) for Spring Boot 3.5.x compatibility
springCloud = "2025.0.1"
springDependencyManagement = "1.1.7"
springdoc = "2.8.9"
# Server Persistence
# Final release 1.0.0 (UUID API refinements vs. rc-4)
exposed = "1.1.1"
postgresql = "42.7.8"
hikari = "7.0.2"
h2 = "2.4.240"
flyway = "11.19.1"
redisson = "4.0.0"
# Spring Boot 3.5.x manages Lettuce 6.6.x; keep aligned to avoid binary/API mismatches.
lettuce = "6.6.0.RELEASE"
springDataValkey = "0.2.0"
# Observability
micrometer = "1.16.1"
micrometerTracing = "1.6.1"
zipkin = "3.5.1"
zipkinReporter = "3.5.1"
resilience4j = "2.3.0"
# Auth & Security
auth0Jwt = "4.5.0"
keycloakAdminClient = "26.0.7"
# Utilities
bignum = "0.3.10"
jmdns = "3.5.12"
logback = "1.5.25"
caffeine = "3.2.3"
reactorKafka = "1.3.23"
jackson = "3.0.3"
jakartaAnnotation = "3.0.0"
slf4j = "2.0.17"
kotlin-logging = "7.0.13"
# Testing
junitJupiter = "5.11.3"
junitPlatform = "1.11.3"
mockk = "1.14.7"
assertj = "3.27.7"
testcontainers = "2.0.3"
testcontainersKeycloak = "4.0.1"
testcontainersJunitJupiter = "1.21.4"
testcontainersPostgresql = "1.21.4"
testcontainersKafka = "1.21.4"
archunit = "1.4.1"
# Gradle Plugins
foojayResolver = "1.0.0"
benManesVersions = "0.51.0"
detekt = "1.23.6"
ktlint = "12.1.1"
dokka = "2.2.0"
firebaseDatabaseKtx = "22.0.1"
[libraries]
# ==============================================================================
# === FRONTEND: KOTLIN MULTIPLATFORM CORE ===
# ==============================================================================
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", 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" }
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" }
kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" }
# ==============================================================================
# === FRONTEND: COMPOSE UI ===
# ==============================================================================
# Note: Core Compose libraries (runtime, foundation, material3) are usually added via the
# 'compose' Gradle plugin extension (e.g. implementation(compose.runtime)).
# These entries are for specific additional artifacts.
androidx-lifecycle-viewmodelCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" }
androidx-lifecycle-runtimeCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidx-lifecycle" }
ui-desktop = { module = "androidx.compose.ui:ui-desktop", version.ref = "uiDesktop" }
composeHotReloadApi = { module = "org.jetbrains.compose.hot-reload:hot-reload-runtime-api", version.ref = "composeHotReload" }
# ==============================================================================
# === FRONTEND: NETWORK (KTOR CLIENT) ===
# ==============================================================================
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-client-contentNegotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
ktor-client-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
ktor-client-auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" }
ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
ktor-client-mock = { module = "io.ktor:ktor-client-mock", version.ref = "ktor" }
ktor-client-websockets = { module = "io.ktor:ktor-client-websockets-jvm", version.ref = "ktor" }
ktor-client-websockets-common = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor" }
# Engines
ktor-client-cio = { module = "io.ktor:ktor-client-cio-jvm", version.ref = "ktor" } # JVM/Desktop
ktor-client-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" } # JS/Wasm
# ktor-client-websockets-common = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor" }
# ==============================================================================
# === FRONTEND: DEPENDENCY INJECTION (KOIN) ===
# ==============================================================================
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koinCompose" }
koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koinCompose" }
# ==============================================================================
# === FRONTEND: LOCAL PERSISTENCE (SQLDelight) ===
# ==============================================================================
sqldelight-gradle = { module = "app.cash.sqldelight:gradle-plugin", version.ref = "sqldelight" }
sqldelight-runtime = { module = "app.cash.sqldelight:runtime", version.ref = "sqldelight" }
sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
sqldelight-driver-sqlite = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" } # JVM
sqldelight-driver-web = { module = "app.cash.sqldelight:web-worker-driver", version.ref = "sqldelight" } # JS/Wasm
# ==============================================================================
# === BACKEND: SPRING BOOT & CLOUD ===
# ==============================================================================
spring-boot-dependencies = { module = "org.springframework.boot:spring-boot-dependencies", version.ref = "springBoot" }
spring-cloud-dependencies = { module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "springCloud" }
spring-boot-starter-web = { module = "org.springframework.boot:spring-boot-starter-web" }
spring-boot-starter-validation = { module = "org.springframework.boot:spring-boot-starter-validation" }
spring-boot-starter-actuator = { module = "org.springframework.boot:spring-boot-starter-actuator" }
spring-boot-starter-data-jpa = { module = "org.springframework.boot:spring-boot-starter-data-jpa" }
spring-boot-starter-data-redis = { module = "org.springframework.boot:spring-boot-starter-data-redis" }
spring-boot-starter-test = { module = "org.springframework.boot:spring-boot-starter-test" }
spring-boot-starter-oauth2-client = { module = "org.springframework.boot:spring-boot-starter-oauth2-client" }
spring-boot-starter-oauth2-resource-server = { module = "org.springframework.boot:spring-boot-starter-oauth2-resource-server" }
spring-boot-starter-security = { module = "org.springframework.boot:spring-boot-starter-security" }
spring-security-test = { module = "org.springframework.security:spring-security-test" }
spring-boot-starter-webflux = { module = "org.springframework.boot:spring-boot-starter-webflux" }
spring-boot-starter-json = { module = "org.springframework.boot:spring-boot-starter-json" }
spring-boot-starter-aop = { module = "org.springframework.boot:spring-boot-starter-aop", version.ref = "springBoot" }
spring-kafka = { module = "org.springframework.kafka:spring-kafka" }
spring-security-oauth2-jose = { module = "org.springframework.security:spring-security-oauth2-jose" }
spring-web = { module = "org.springframework:spring-web" }
springdoc-openapi-starter-common = { module = "org.springdoc:springdoc-openapi-starter-common", version.ref = "springdoc" }
springdoc-openapi-starter-webmvc-ui = { module = "org.springdoc:springdoc-openapi-starter-webmvc-ui", version.ref = "springdoc" }
springdoc-openapi-starter-webflux-ui = { module = "org.springdoc:springdoc-openapi-starter-webflux-ui", version.ref = "springdoc" }
spring-cloud-starter-gateway-server-webflux = { module = "org.springframework.cloud:spring-cloud-starter-gateway-server-webflux" }
spring-cloud-starter-consul-discovery = { module = "org.springframework.cloud:spring-cloud-starter-consul-discovery" }
spring-cloud-starter-circuitbreaker-resilience4j = { module = "org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j" }
spring-cloud-starter-circuitbreaker-reactor-resilience4j = { module = "org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j" }
# ==============================================================================
# === BACKEND: KTOR SERVER ===
# ==============================================================================
ktor-server-core = { module = "io.ktor:ktor-server-core-jvm", version.ref = "ktor" }
ktor-server-netty = { module = "io.ktor:ktor-server-netty-jvm", version.ref = "ktor" }
ktor-server-contentNegotiation = { module = "io.ktor:ktor-server-content-negotiation-jvm", version.ref = "ktor" }
ktor-server-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json-jvm", version.ref = "ktor" }
ktor-server-statusPages = { module = "io.ktor:ktor-server-status-pages-jvm", version.ref = "ktor" }
ktor-server-auth = { module = "io.ktor:ktor-server-auth-jvm", version.ref = "ktor" }
ktor-server-authJwt = { module = "io.ktor:ktor-server-auth-jwt-jvm", version.ref = "ktor" }
ktor-server-cors = { module = "io.ktor:ktor-server-cors-jvm", version.ref = "ktor" }
ktor-server-callLogging = { module = "io.ktor:ktor-server-call-logging-jvm", version.ref = "ktor" }
ktor-server-defaultHeaders = { module = "io.ktor:ktor-server-default-headers-jvm", version.ref = "ktor" }
ktor-server-rateLimit = { module = "io.ktor:ktor-server-rate-limit-jvm", version.ref = "ktor" }
ktor-server-metrics-micrometer = { module = "io.ktor:ktor-server-metrics-micrometer-jvm", version.ref = "ktor" }
ktor-server-openapi = { module = "io.ktor:ktor-server-openapi", version.ref = "ktor" }
ktor-server-swagger = { module = "io.ktor:ktor-server-swagger", version.ref = "ktor" }
ktor-server-tests = { module = "io.ktor:ktor-server-tests-jvm", version.ref = "ktor" }
ktor-server-testHost = { module = "io.ktor:ktor-server-test-host-jvm", version.ref = "ktor" }
ktor-server-routing-openapi = { module = "io.ktor:ktor-server-routing-openapi", version.ref = "ktor" }
ktor-server-websockets = { module = "io.ktor:ktor-server-websockets-jvm", version.ref = "ktor" }
# ==============================================================================
# === BACKEND: PERSISTENCE & INFRA ===
# ==============================================================================
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-kotlin-datetime = { module = "org.jetbrains.exposed:exposed-kotlin-datetime", version.ref = "exposed" }
exposed-migration-jdbc = { module = "org.jetbrains.exposed:exposed-migration-jdbc", version.ref = "exposed" }
exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time", version.ref = "exposed" }
exposed-json = { module = "org.jetbrains.exposed:exposed-json", version.ref = "exposed" }
exposed-money = { module = "org.jetbrains.exposed:exposed-money", version.ref = "exposed" }
postgresql-driver = { module = "org.postgresql:postgresql", version.ref = "postgresql" }
hikari-cp = { module = "com.zaxxer:HikariCP", version.ref = "hikari" }
h2-driver = { module = "com.h2database:h2", version.ref = "h2" }
flyway-core = { module = "org.flywaydb:flyway-core", version.ref = "flyway" }
flyway-postgresql = { module = "org.flywaydb:flyway-database-postgresql", version.ref = "flyway" }
redisson = { module = "org.redisson:redisson", version.ref = "redisson" }
lettuce-core = { module = "io.lettuce:lettuce-core", version.ref = "lettuce" }
spring-data-valkey = { module = "io.valkey.springframework.data:spring-data-valkey", version.ref = "springDataValkey" }
micrometer-prometheus = { module = "io.micrometer:micrometer-registry-prometheus", version.ref = "micrometer" }
micrometer-tracing-bridge-brave = { module = "io.micrometer:micrometer-tracing-bridge-brave", version.ref = "micrometerTracing" }
zipkin-reporter-brave = { module = "io.zipkin.reporter2:zipkin-reporter-brave", version.ref = "zipkinReporter" }
zipkin-sender-okhttp3 = { module = "io.zipkin.reporter2:zipkin-sender-okhttp3", version.ref = "zipkinReporter" }
zipkin-server = { module = "io.zipkin:zipkin-server", version.ref = "zipkin" }
resilience4j-spring-boot3 = { module = "io.github.resilience4j:resilience4j-spring-boot3", version.ref = "resilience4j" }
resilience4j-reactor = { module = "io.github.resilience4j:resilience4j-reactor", version.ref = "resilience4j" }
auth0-java-jwt = { module = "com.auth0:java-jwt", version.ref = "auth0Jwt" }
keycloak-admin-client = { module = "org.keycloak:keycloak-admin-client", version.ref = "keycloakAdminClient" }
# ==============================================================================
# === SHARED UTILITIES & TESTING ===
# ==============================================================================
bignum = { module = "com.ionspin.kotlin:bignum", version.ref = "bignum" }
slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" }
logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback" }
logback-core = { module = "ch.qos.logback:logback-core", version.ref = "logback" }
kotlin-logging-jvm = { module = "io.github.oshai:kotlin-logging-jvm", version.ref = "kotlin-logging" }
caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version.ref = "caffeine" }
reactor-kafka = { module = "io.projectreactor.kafka:reactor-kafka", version.ref = "reactorKafka" }
jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin" }
jackson-datatype-jsr310 = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" }
jakarta-annotation-api = { module = "jakarta.annotation:jakarta.annotation-api", version.ref = "jakartaAnnotation" }
jmdns = { module = "org.jmdns:jmdns", version.ref = "jmdns" }
junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junitJupiter" }
junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junitJupiter" }
junit-jupiter-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junitJupiter" }
junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junitPlatform" }
reactor-test = { module = "io.projectreactor:reactor-test" }
mockk = { module = "io.mockk:mockk", version.ref = "mockk" }
assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" }
testcontainers-core = { module = "org.testcontainers:testcontainers", version.ref = "testcontainers" }
testcontainers-junit-jupiter = { module = "org.testcontainers:junit-jupiter", version.ref = "testcontainersJunitJupiter" }
testcontainers-postgresql = { module = "org.testcontainers:postgresql", version.ref = "testcontainersPostgresql" }
testcontainers-kafka = { module = "org.testcontainers:kafka", version.ref = "testcontainersKafka" }
testcontainers-keycloak = { module = "com.github.dasniko:testcontainers-keycloak", version.ref = "testcontainersKeycloak" }
archunit-junit5-api = { module = "com.tngtech.archunit:archunit-junit5-api", version.ref = "archunit" }
archunit-junit5-engine = { module = "com.tngtech.archunit:archunit-junit5-engine", version.ref = "archunit" }
# BOMs
kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlin" }
kotlinx-coroutines-bom = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-bom", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-reactor = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactor", version.ref = "kotlinx-coroutines" }
firebase-database-ktx = { group = "com.google.firebase", name = "firebase-database-ktx", version.ref = "firebaseDatabaseKtx" }
[bundles]
# === FRONTEND BUNDLES ===
# Use these in commonMain to reduce boilerplate
kmp-common = [
"kotlinx-coroutines-core",
"kotlinx-serialization-json",
"kotlinx-datetime"
]
ktor-client-common = [
"ktor-client-core",
"ktor-client-contentNegotiation",
"ktor-client-serialization-kotlinx-json",
"ktor-client-auth",
"ktor-client-logging"
]
compose-common = [
"androidx-lifecycle-viewmodelCompose",
"androidx-lifecycle-runtimeCompose"
]
# === BACKEND BUNDLES ===
testing-jvm = [
"junit-jupiter-api",
"junit-jupiter-engine",
"junit-jupiter-params",
"junit-platform-launcher",
"mockk",
"assertj-core"
]
test-spring = [
"spring-boot-starter-test",
"spring-security-test"
]
spring-boot-service-complete = [
"spring-boot-starter-web",
"spring-boot-starter-validation",
"spring-boot-starter-actuator",
"spring-boot-starter-json",
"spring-boot-starter-aop",
"jackson-module-kotlin",
"jackson-datatype-jsr310",
"micrometer-prometheus",
"micrometer-tracing-bridge-brave",
"zipkin-reporter-brave",
"zipkin-sender-okhttp3"
]
# Standard dependencies for a "secure" Spring Boot microservice (architecture-approved baseline)
spring-boot-secure-service = [
"spring-boot-starter-web",
"spring-boot-starter-actuator",
"spring-boot-starter-security",
"spring-boot-starter-oauth2-resource-server",
"spring-cloud-starter-consul-discovery"
]
database-complete = [
"spring-boot-starter-data-jpa",
"postgresql-driver",
"hikari-cp",
"flyway-core",
"flyway-postgresql"
]
valkey-cache = [
"spring-data-valkey",
"jackson-module-kotlin",
"jackson-datatype-jsr310"
]
testcontainers = [
"testcontainers-core",
"testcontainers-junit-jupiter",
"testcontainers-postgresql",
"testcontainers-kafka",
"testcontainers-keycloak"
]
kafka-config = [
"spring-kafka",
"reactor-kafka",
"jackson-module-kotlin",
"jackson-datatype-jsr310"
]
monitoring-client = [
"spring-boot-starter-actuator",
"micrometer-prometheus",
"micrometer-tracing-bridge-brave",
"zipkin-reporter-brave",
"zipkin-sender-okhttp3"
]
jackson-kotlin = [
"jackson-module-kotlin",
"jackson-datatype-jsr310"
]
resilience = [
"resilience4j-spring-boot3",
"resilience4j-reactor"
]
[plugins]
# --- Kotlin & Android ---
kotlinJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
kotlinJpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin" }
kotlinSpring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
# --- Compose ---
composeHotReload = { id = "org.jetbrains.compose.hot-reload", version.ref = "composeHotReload" }
composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" }
composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
# --- Spring ---
spring-boot = { id = "org.springframework.boot", version.ref = "springBoot" }
spring-dependencyManagement = { id = "io.spring.dependency-management", version.ref = "springDependencyManagement" }
# --- Ktor ---
ktor = { id = "io.ktor.plugin", version.ref = "ktor" }
# --- Persistence ---
sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" }
# --- Tools ---
foojayResolver = { id = "org.gradle.toolchains.foojay-resolver-convention", version.ref = "foojayResolver" }
dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
benManesVersions = { id = "com.github.ben-manes.versions", version.ref = "benManesVersions" }
detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" }